From c052fb48bcb5dbfd5d254b2c1dbf2c05c276a6ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=AA=E5=AD=90?= Date: Sat, 30 Sep 2023 15:31:08 +0800 Subject: [PATCH] 123 --- db.json | 2 +- node_modules/.package-lock.json | 82 + node_modules/bindings/LICENSE.md | 22 + node_modules/bindings/README.md | 98 + node_modules/bindings/bindings.js | 221 ++ node_modules/bindings/package.json | 28 + node_modules/buildcheck/.eslintrc.js | 5 + .../buildcheck/.github/workflows/ci.yml | 72 + .../buildcheck/.github/workflows/lint.yml | 23 + node_modules/buildcheck/.npmignore | 3 + node_modules/buildcheck/LICENSE | 19 + node_modules/buildcheck/README.md | 106 + .../buildcheck/deps/Find-VisualStudio.cs | 250 ++ node_modules/buildcheck/lib/findvs.js | 345 +++ node_modules/buildcheck/lib/index.js | 738 ++++++ node_modules/buildcheck/package.json | 36 + node_modules/buildcheck/test/test.js | 8 + .../chokidar/node_modules/fsevents/LICENSE | 22 + .../chokidar/node_modules/fsevents/README.md | 89 + .../node_modules/fsevents/fsevents.d.ts | 46 + .../node_modules/fsevents/fsevents.js | 83 + .../node_modules/fsevents/fsevents.node | Bin 0 -> 163626 bytes .../node_modules/fsevents/package.json | 62 + node_modules/cpu-features/.eslintrc.js | 5 + .../cpu-features/.github/workflows/ci.yml | 68 + .../cpu-features/.github/workflows/lint.yml | 27 + node_modules/cpu-features/LICENSE | 19 + node_modules/cpu-features/README.md | 59 + node_modules/cpu-features/binding.gyp | 16 + node_modules/cpu-features/build/Makefile | 352 +++ .../Release/.deps/Release/cpu_features.a.d | 1 + .../Release/.deps/Release/cpufeatures.node.d | 1 + .../deps/cpu_features/src/filesystem.o.d | 8 + .../src/impl_aarch64_linux_or_android.o.d | 6 + .../src/impl_aarch64_macos_or_iphone.o.d | 6 + .../src/impl_arm_linux_or_android.o.d | 6 + .../src/impl_mips_linux_or_android.o.d | 6 + .../deps/cpu_features/src/impl_ppc_linux.o.d | 6 + .../cpu_features/src/impl_x86_freebsd.o.d | 6 + .../src/impl_x86_linux_or_android.o.d | 6 + .../deps/cpu_features/src/impl_x86_macos.o.d | 22 + .../cpu_features/src/impl_x86_windows.o.d | 6 + .../cpu_features/src/stack_line_reader.o.d | 12 + .../deps/cpu_features/src/string_view.o.d | 11 + .../obj.target/cpufeatures/src/binding.o.d | 157 ++ .../cpu-features/build/Release/cpu_features.a | Bin 0 -> 163760 bytes .../build/Release/cpufeatures.node | Bin 0 -> 82952 bytes .../deps/cpu_features/src/filesystem.o | Bin 0 -> 4752 bytes .../src/impl_aarch64_linux_or_android.o | Bin 0 -> 2016 bytes .../src/impl_aarch64_macos_or_iphone.o | Bin 0 -> 2016 bytes .../src/impl_arm_linux_or_android.o | Bin 0 -> 2016 bytes .../src/impl_mips_linux_or_android.o | Bin 0 -> 2016 bytes .../deps/cpu_features/src/impl_ppc_linux.o | Bin 0 -> 1984 bytes .../deps/cpu_features/src/impl_x86_freebsd.o | Bin 0 -> 1984 bytes .../src/impl_x86_linux_or_android.o | Bin 0 -> 2016 bytes .../deps/cpu_features/src/impl_x86_macos.o | Bin 0 -> 100416 bytes .../deps/cpu_features/src/impl_x86_windows.o | Bin 0 -> 1984 bytes .../deps/cpu_features/src/stack_line_reader.o | Bin 0 -> 9424 bytes .../deps/cpu_features/src/string_view.o | Bin 0 -> 30960 bytes .../obj.target/cpufeatures/src/binding.o | Bin 0 -> 370640 bytes .../cpu-features/build/binding.Makefile | 6 + node_modules/cpu-features/build/config.gypi | 418 ++++ .../cpu-features/build/cpufeatures.target.mk | 196 ++ .../deps/cpu_features/cpu_features.Makefile | 6 + .../deps/cpu_features/cpu_features.target.mk | 204 ++ node_modules/cpu-features/build/gyp-mac-tool | 772 +++++++ .../cpu-features/build/node_gyp_bins/python3 | 1 + node_modules/cpu-features/buildcheck.gypi | 17 + node_modules/cpu-features/buildcheck.js | 32 + .../deps/cpu_features/.clang-format | 4 + .../deps/cpu_features/.dockerignore | 31 + .../cpu_features/.github/workflows/Dockerfile | 5 + .../.github/workflows/aarch64_linux_cmake.yml | 30 + .../.github/workflows/amd64_freebsd_cmake.yml | 22 + .../.github/workflows/amd64_linux_bazel.yml | 26 + .../.github/workflows/amd64_linux_cmake.yml | 31 + .../.github/workflows/amd64_macos_cmake.yml | 43 + .../.github/workflows/amd64_windows_cmake.yml | 25 + .../.github/workflows/arm_linux_cmake.yml | 31 + .../.github/workflows/clang_format.yml | 24 + .../.github/workflows/mips_linux_cmake.yml | 30 + .../.github/workflows/power_linux_cmake.yml | 29 + .../.github/workflows/riscv_linux_cmake.yml | 28 + .../.github/workflows/s390x_linux_cmake.yml | 27 + .../deps/cpu_features/.grenrc.yml | 21 + .../cpu-features/deps/cpu_features/.npmignore | 19 + .../deps/cpu_features/BUILD.bazel | 329 +++ .../deps/cpu_features/CMakeLists.txt | 261 +++ .../deps/cpu_features/CONTRIBUTING.md | 23 + .../cpu-features/deps/cpu_features/LICENSE | 230 ++ .../cpu-features/deps/cpu_features/README.md | 272 +++ .../cpu-features/deps/cpu_features/WORKSPACE | 19 + .../deps/cpu_features/bazel/ci/README.md | 5 + .../deps/cpu_features/bazel/platforms.bzl | 11 + .../cmake/CpuFeaturesConfig.cmake.in | 3 + .../cmake/CpuFeaturesNdkCompatConfig.cmake.in | 3 + .../deps/cpu_features/cmake/README.md | 30 + .../deps/cpu_features/cmake/ci/Makefile | 252 ++ .../deps/cpu_features/cmake/ci/README.md | 40 + .../deps/cpu_features/cmake/ci/doc/docker.dot | 64 + .../deps/cpu_features/cmake/ci/doc/docker.svg | 312 +++ .../cmake/ci/doc/generate_image.sh | 7 + .../cmake/ci/docker/amd64/Dockerfile | 48 + .../cmake/ci/docker/toolchain/Dockerfile | 34 + .../cmake/ci/sample/CMakeLists.txt | 22 + .../cpu_features/cmake/ci/sample/main.cpp | 11 + .../cmake/ci/vagrant/freebsd/Vagrantfile | 107 + .../cmake/googletest.CMakeLists.txt.in | 15 + .../deps/cpu_features/cpu_features.gyp | 104 + .../include/cpu_features_cache_info.h | 54 + .../include/cpu_features_macros.h | 384 +++ .../cpu_features/include/cpuinfo_aarch64.h | 259 +++ .../deps/cpu_features/include/cpuinfo_arm.h | 121 + .../deps/cpu_features/include/cpuinfo_mips.h | 74 + .../deps/cpu_features/include/cpuinfo_ppc.h | 149 ++ .../deps/cpu_features/include/cpuinfo_riscv.h | 72 + .../deps/cpu_features/include/cpuinfo_s390x.h | 108 + .../deps/cpu_features/include/cpuinfo_x86.h | 288 +++ .../cpu_features/include/internal/bit_utils.h | 40 + .../cpu_features/include/internal/cpuid_x86.h | 37 + .../include/internal/filesystem.h | 39 + .../cpu_features/include/internal/hwcaps.h | 240 ++ .../include/internal/stack_line_reader.h | 49 + .../include/internal/string_view.h | 110 + .../include/internal/windows_utils.h | 70 + .../cpu_features/ndk_compat/CMakeLists.txt | 60 + .../deps/cpu_features/ndk_compat/README.md | 4 + .../cpu_features/ndk_compat/cpu-features.c | 205 ++ .../cpu_features/ndk_compat/cpu-features.h | 320 +++ .../cpu_features/ndk_compat/ndk-compat-test.c | 12 + .../0001-Add-Apple-Silicon-Support.patch | 456 ++++ .../cpu_features/scripts/generate_badges.d | 165 ++ .../deps/cpu_features/scripts/make_release.sh | 75 + .../cpu_features/scripts/run_integration.sh | 490 ++++ .../cpu_features/scripts/test_integration.sh | 79 + .../deps/cpu_features/src/copy.inl | 19 + .../cpu_features/src/define_introspection.inl | 86 + .../src/define_introspection_and_hwcaps.inl | 26 + .../deps/cpu_features/src/equals.inl | 22 + .../deps/cpu_features/src/filesystem.c | 62 + .../deps/cpu_features/src/hwcaps.c | 169 ++ .../src/impl_aarch64__base_implementation.inl | 88 + .../src/impl_aarch64_linux_or_android.c | 79 + .../src/impl_aarch64_macos_or_iphone.c | 82 + .../cpu_features/src/impl_aarch64_windows.c | 138 ++ .../src/impl_arm_linux_or_android.c | 212 ++ .../src/impl_mips_linux_or_android.c | 93 + .../deps/cpu_features/src/impl_ppc_linux.c | 163 ++ .../deps/cpu_features/src/impl_riscv_linux.c | 111 + .../deps/cpu_features/src/impl_s390x_linux.c | 120 + .../src/impl_x86__base_implementation.inl | 2055 +++++++++++++++++ .../deps/cpu_features/src/impl_x86_freebsd.c | 68 + .../src/impl_x86_linux_or_android.c | 58 + .../deps/cpu_features/src/impl_x86_macos.c | 57 + .../deps/cpu_features/src/impl_x86_windows.c | 58 + .../deps/cpu_features/src/stack_line_reader.c | 132 ++ .../deps/cpu_features/src/string_view.c | 192 ++ .../src/utils/list_cpu_features.c | 461 ++++ .../deps/cpu_features/test/CMakeLists.txt | 114 + .../deps/cpu_features/test/bit_utils_test.cc | 53 + .../cpu_features/test/cpuinfo_aarch64_test.cc | 396 ++++ .../cpu_features/test/cpuinfo_arm_test.cc | 384 +++ .../cpu_features/test/cpuinfo_mips_test.cc | 176 ++ .../cpu_features/test/cpuinfo_ppc_test.cc | 131 ++ .../cpu_features/test/cpuinfo_riscv_test.cc | 180 ++ .../cpu_features/test/cpuinfo_s390x_test.cc | 82 + .../cpu_features/test/cpuinfo_x86_test.cc | 1729 ++++++++++++++ .../test/filesystem_for_testing.cc | 103 + .../test/filesystem_for_testing.h | 61 + .../cpu_features/test/hwcaps_for_testing.cc | 52 + .../cpu_features/test/hwcaps_for_testing.h | 31 + .../test/stack_line_reader_test.cc | 132 ++ .../cpu_features/test/string_view_test.cc | 202 ++ node_modules/cpu-features/lib/index.js | 5 + node_modules/cpu-features/package.json | 40 + node_modules/cpu-features/src/binding.cc | 151 ++ node_modules/cpu-features/test/test.js | 12 + node_modules/file-uri-to-path/.npmignore | 1 + node_modules/file-uri-to-path/.travis.yml | 30 + node_modules/file-uri-to-path/History.md | 21 + node_modules/file-uri-to-path/LICENSE | 20 + node_modules/file-uri-to-path/README.md | 74 + node_modules/file-uri-to-path/index.d.ts | 2 + node_modules/file-uri-to-path/index.js | 66 + node_modules/file-uri-to-path/package.json | 32 + node_modules/file-uri-to-path/test/test.js | 24 + node_modules/file-uri-to-path/test/tests.json | 13 + node_modules/fsevents/.travis.yml | 103 + node_modules/fsevents/ISSUE_TEMPLATE.md | 8 + node_modules/fsevents/LICENSE | 22 + node_modules/fsevents/Readme.md | 78 + node_modules/fsevents/binding.gyp | 21 + node_modules/fsevents/build/.target.mk | 51 + node_modules/fsevents/build/Makefile | 352 +++ .../build/Release/.deps/Release/.node.d | 1 + .../build/Release/.deps/Release/fse.node.d | 1 + .../.deps/Release/obj.target/fse/fsevents.o.d | 156 ++ node_modules/fsevents/build/Release/.node | Bin 0 -> 16440 bytes node_modules/fsevents/build/Release/fse.node | Bin 0 -> 66968 bytes .../build/Release/obj.target/fse/fsevents.o | Bin 0 -> 489632 bytes node_modules/fsevents/build/binding.Makefile | 6 + node_modules/fsevents/build/config.gypi | 418 ++++ node_modules/fsevents/build/fse.target.mk | 191 ++ node_modules/fsevents/build/gyp-mac-tool | 772 +++++++ .../fsevents/build/node_gyp_bins/python3 | 1 + node_modules/fsevents/fsevents.cc | 88 + node_modules/fsevents/fsevents.js | 106 + node_modules/fsevents/install.js | 13 + node_modules/fsevents/package.json | 34 + node_modules/fsevents/src/async.cc | 43 + node_modules/fsevents/src/constants.cc | 110 + node_modules/fsevents/src/methods.cc | 44 + node_modules/fsevents/src/storage.cc | 27 + node_modules/fsevents/src/thread.cc | 71 + .../rollup/node_modules/fsevents/LICENSE | 22 + .../rollup/node_modules/fsevents/README.md | 89 + .../node_modules/fsevents/fsevents.d.ts | 46 + .../rollup/node_modules/fsevents/fsevents.js | 83 + .../node_modules/fsevents/fsevents.node | Bin 0 -> 163626 bytes .../rollup/node_modules/fsevents/package.json | 62 + 220 files changed, 23292 insertions(+), 1 deletion(-) create mode 100644 node_modules/bindings/LICENSE.md create mode 100644 node_modules/bindings/README.md create mode 100644 node_modules/bindings/bindings.js create mode 100644 node_modules/bindings/package.json create mode 100644 node_modules/buildcheck/.eslintrc.js create mode 100644 node_modules/buildcheck/.github/workflows/ci.yml create mode 100644 node_modules/buildcheck/.github/workflows/lint.yml create mode 100644 node_modules/buildcheck/.npmignore create mode 100644 node_modules/buildcheck/LICENSE create mode 100644 node_modules/buildcheck/README.md create mode 100644 node_modules/buildcheck/deps/Find-VisualStudio.cs create mode 100644 node_modules/buildcheck/lib/findvs.js create mode 100644 node_modules/buildcheck/lib/index.js create mode 100644 node_modules/buildcheck/package.json create mode 100644 node_modules/buildcheck/test/test.js create mode 100644 node_modules/chokidar/node_modules/fsevents/LICENSE create mode 100644 node_modules/chokidar/node_modules/fsevents/README.md create mode 100644 node_modules/chokidar/node_modules/fsevents/fsevents.d.ts create mode 100644 node_modules/chokidar/node_modules/fsevents/fsevents.js create mode 100755 node_modules/chokidar/node_modules/fsevents/fsevents.node create mode 100644 node_modules/chokidar/node_modules/fsevents/package.json create mode 100644 node_modules/cpu-features/.eslintrc.js create mode 100644 node_modules/cpu-features/.github/workflows/ci.yml create mode 100644 node_modules/cpu-features/.github/workflows/lint.yml create mode 100644 node_modules/cpu-features/LICENSE create mode 100644 node_modules/cpu-features/README.md create mode 100644 node_modules/cpu-features/binding.gyp create mode 100644 node_modules/cpu-features/build/Makefile create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/cpu_features.a.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/cpufeatures.node.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o.d create mode 100644 node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpufeatures/src/binding.o.d create mode 100644 node_modules/cpu-features/build/Release/cpu_features.a create mode 100755 node_modules/cpu-features/build/Release/cpufeatures.node create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o create mode 100644 node_modules/cpu-features/build/Release/obj.target/cpufeatures/src/binding.o create mode 100644 node_modules/cpu-features/build/binding.Makefile create mode 100644 node_modules/cpu-features/build/config.gypi create mode 100644 node_modules/cpu-features/build/cpufeatures.target.mk create mode 100644 node_modules/cpu-features/build/deps/cpu_features/cpu_features.Makefile create mode 100644 node_modules/cpu-features/build/deps/cpu_features/cpu_features.target.mk create mode 100755 node_modules/cpu-features/build/gyp-mac-tool create mode 120000 node_modules/cpu-features/build/node_gyp_bins/python3 create mode 100644 node_modules/cpu-features/buildcheck.gypi create mode 100644 node_modules/cpu-features/buildcheck.js create mode 100644 node_modules/cpu-features/deps/cpu_features/.clang-format create mode 100644 node_modules/cpu-features/deps/cpu_features/.dockerignore create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/Dockerfile create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/aarch64_linux_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_freebsd_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_bazel.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_macos_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_windows_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/arm_linux_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/clang_format.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/mips_linux_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/power_linux_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/riscv_linux_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.github/workflows/s390x_linux_cmake.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.grenrc.yml create mode 100644 node_modules/cpu-features/deps/cpu_features/.npmignore create mode 100644 node_modules/cpu-features/deps/cpu_features/BUILD.bazel create mode 100644 node_modules/cpu-features/deps/cpu_features/CMakeLists.txt create mode 100644 node_modules/cpu-features/deps/cpu_features/CONTRIBUTING.md create mode 100644 node_modules/cpu-features/deps/cpu_features/LICENSE create mode 100644 node_modules/cpu-features/deps/cpu_features/README.md create mode 100644 node_modules/cpu-features/deps/cpu_features/WORKSPACE create mode 100644 node_modules/cpu-features/deps/cpu_features/bazel/ci/README.md create mode 100644 node_modules/cpu-features/deps/cpu_features/bazel/platforms.bzl create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesConfig.cmake.in create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesNdkCompatConfig.cmake.in create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/README.md create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/ci/Makefile create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/ci/README.md create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.dot create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.svg create mode 100755 node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/generate_image.sh create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/amd64/Dockerfile create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/toolchain/Dockerfile create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/CMakeLists.txt create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/main.cpp create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/ci/vagrant/freebsd/Vagrantfile create mode 100644 node_modules/cpu-features/deps/cpu_features/cmake/googletest.CMakeLists.txt.in create mode 100644 node_modules/cpu-features/deps/cpu_features/cpu_features.gyp create mode 100644 node_modules/cpu-features/deps/cpu_features/include/cpu_features_cache_info.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/cpu_features_macros.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/cpuinfo_aarch64.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/cpuinfo_arm.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/cpuinfo_mips.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/cpuinfo_ppc.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/cpuinfo_riscv.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/cpuinfo_s390x.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/cpuinfo_x86.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/internal/bit_utils.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/internal/cpuid_x86.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/internal/filesystem.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/internal/hwcaps.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/internal/stack_line_reader.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/internal/string_view.h create mode 100644 node_modules/cpu-features/deps/cpu_features/include/internal/windows_utils.h create mode 100644 node_modules/cpu-features/deps/cpu_features/ndk_compat/CMakeLists.txt create mode 100644 node_modules/cpu-features/deps/cpu_features/ndk_compat/README.md create mode 100644 node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.c create mode 100644 node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.h create mode 100644 node_modules/cpu-features/deps/cpu_features/ndk_compat/ndk-compat-test.c create mode 100644 node_modules/cpu-features/deps/cpu_features/patches/0001-Add-Apple-Silicon-Support.patch create mode 100644 node_modules/cpu-features/deps/cpu_features/scripts/generate_badges.d create mode 100755 node_modules/cpu-features/deps/cpu_features/scripts/make_release.sh create mode 100755 node_modules/cpu-features/deps/cpu_features/scripts/run_integration.sh create mode 100755 node_modules/cpu-features/deps/cpu_features/scripts/test_integration.sh create mode 100644 node_modules/cpu-features/deps/cpu_features/src/copy.inl create mode 100644 node_modules/cpu-features/deps/cpu_features/src/define_introspection.inl create mode 100644 node_modules/cpu-features/deps/cpu_features/src/define_introspection_and_hwcaps.inl create mode 100644 node_modules/cpu-features/deps/cpu_features/src/equals.inl create mode 100644 node_modules/cpu-features/deps/cpu_features/src/filesystem.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/hwcaps.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_aarch64__base_implementation.inl create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_linux_or_android.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_windows.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_arm_linux_or_android.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_mips_linux_or_android.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_ppc_linux.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_riscv_linux.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_s390x_linux.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_x86__base_implementation.inl create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_x86_freebsd.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_x86_linux_or_android.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_x86_macos.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/impl_x86_windows.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/stack_line_reader.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/string_view.c create mode 100644 node_modules/cpu-features/deps/cpu_features/src/utils/list_cpu_features.c create mode 100644 node_modules/cpu-features/deps/cpu_features/test/CMakeLists.txt create mode 100644 node_modules/cpu-features/deps/cpu_features/test/bit_utils_test.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/cpuinfo_aarch64_test.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/cpuinfo_arm_test.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/cpuinfo_mips_test.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/cpuinfo_ppc_test.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/cpuinfo_riscv_test.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/cpuinfo_s390x_test.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/cpuinfo_x86_test.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.h create mode 100644 node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.h create mode 100644 node_modules/cpu-features/deps/cpu_features/test/stack_line_reader_test.cc create mode 100644 node_modules/cpu-features/deps/cpu_features/test/string_view_test.cc create mode 100644 node_modules/cpu-features/lib/index.js create mode 100644 node_modules/cpu-features/package.json create mode 100644 node_modules/cpu-features/src/binding.cc create mode 100644 node_modules/cpu-features/test/test.js create mode 100644 node_modules/file-uri-to-path/.npmignore create mode 100644 node_modules/file-uri-to-path/.travis.yml create mode 100644 node_modules/file-uri-to-path/History.md create mode 100644 node_modules/file-uri-to-path/LICENSE create mode 100644 node_modules/file-uri-to-path/README.md create mode 100644 node_modules/file-uri-to-path/index.d.ts create mode 100644 node_modules/file-uri-to-path/index.js create mode 100644 node_modules/file-uri-to-path/package.json create mode 100644 node_modules/file-uri-to-path/test/test.js create mode 100644 node_modules/file-uri-to-path/test/tests.json create mode 100644 node_modules/fsevents/.travis.yml create mode 100644 node_modules/fsevents/ISSUE_TEMPLATE.md create mode 100644 node_modules/fsevents/LICENSE create mode 100644 node_modules/fsevents/Readme.md create mode 100644 node_modules/fsevents/binding.gyp create mode 100644 node_modules/fsevents/build/.target.mk create mode 100644 node_modules/fsevents/build/Makefile create mode 100644 node_modules/fsevents/build/Release/.deps/Release/.node.d create mode 100644 node_modules/fsevents/build/Release/.deps/Release/fse.node.d create mode 100644 node_modules/fsevents/build/Release/.deps/Release/obj.target/fse/fsevents.o.d create mode 100755 node_modules/fsevents/build/Release/.node create mode 100755 node_modules/fsevents/build/Release/fse.node create mode 100644 node_modules/fsevents/build/Release/obj.target/fse/fsevents.o create mode 100644 node_modules/fsevents/build/binding.Makefile create mode 100644 node_modules/fsevents/build/config.gypi create mode 100644 node_modules/fsevents/build/fse.target.mk create mode 100755 node_modules/fsevents/build/gyp-mac-tool create mode 120000 node_modules/fsevents/build/node_gyp_bins/python3 create mode 100644 node_modules/fsevents/fsevents.cc create mode 100644 node_modules/fsevents/fsevents.js create mode 100644 node_modules/fsevents/install.js create mode 100644 node_modules/fsevents/package.json create mode 100644 node_modules/fsevents/src/async.cc create mode 100644 node_modules/fsevents/src/constants.cc create mode 100644 node_modules/fsevents/src/methods.cc create mode 100644 node_modules/fsevents/src/storage.cc create mode 100644 node_modules/fsevents/src/thread.cc create mode 100644 node_modules/rollup/node_modules/fsevents/LICENSE create mode 100644 node_modules/rollup/node_modules/fsevents/README.md create mode 100644 node_modules/rollup/node_modules/fsevents/fsevents.d.ts create mode 100644 node_modules/rollup/node_modules/fsevents/fsevents.js create mode 100755 node_modules/rollup/node_modules/fsevents/fsevents.node create mode 100644 node_modules/rollup/node_modules/fsevents/package.json diff --git a/db.json b/db.json index 78de574f..1d50ef46 100644 --- a/db.json +++ b/db.json @@ -1 +1 @@ -{"meta":{"version":1,"warehouse":"4.0.2"},"models":{"Asset":[{"_id":"source/favicon.jpg","path":"favicon.jpg","modified":1,"renderable":0},{"_id":"source/favicon.ico","path":"favicon.ico","modified":1,"renderable":0},{"_id":"source/wechat.png","path":"wechat.png","modified":1,"renderable":0},{"_id":"source/weixin.png","path":"weixin.png","modified":1,"renderable":0},{"_id":"source/zhifubao.png","path":"zhifubao.png","modified":1,"renderable":0},{"_id":"node_modules/hexo-theme-fluid/source/css/gitalk.css","path":"css/gitalk.css","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/css/main.styl","path":"css/main.styl","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/css/highlight-dark.styl","path":"css/highlight-dark.styl","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/css/mac.styl","path":"css/mac.styl","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/css/highlight.styl","path":"css/highlight.styl","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/avatar.png","path":"img/avatar.png","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/default.png","path":"img/default.png","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/boot.js","path":"js/boot.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/color-schema.js","path":"js/color-schema.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/fluid.png","path":"img/fluid.png","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/loading.gif","path":"img/loading.gif","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/police_beian.png","path":"img/police_beian.png","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/events.js","path":"js/events.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/plugins.js","path":"js/plugins.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/utils.js","path":"js/utils.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/img-lazyload.js","path":"js/img-lazyload.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/xml/local-search.xml","path":"xml/local-search.xml","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/local-search.js","path":"js/local-search.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/leancloud.js","path":"js/leancloud.js","modified":1,"renderable":1}],"Cache":[{"_id":"source/favicon.jpg","hash":"94e4da01b6f5685482c60a5c89c42a5566b98093","modified":1695973866406},{"_id":"source/favicon.ico","hash":"53318407d01613ab7d6cf45686d924577df70d69","modified":1695973866405},{"_id":"source/weixin.png","hash":"ed0e5e59660f207e2c2758791cd3235c132be70b","modified":1695973866420},{"_id":"source/_drafts/hello-world.md","hash":"d94ae617ae0403d499e226fb6418a1296362e10e","modified":1695973866320},{"_id":"source/zhifubao.png","hash":"d98f76b04fada8267307aeb2790ca5874db3f7ca","modified":1695973866420},{"_id":"source/categories/index.md","hash":"5e2c5d5b992a054fae34c3b0d5baffae3cb29b80","modified":1695973866402},{"_id":"source/about/index.md","hash":"a83415828bec442153d43f1c9a4fd3494b582838","modified":1695973866401},{"_id":"source/fcircle/index.md","hash":"eef0af1b51d00c287f1d7bfc818b99ac821644af","modified":1695973866406},{"_id":"source/_posts/2006-2016.md","hash":"eaae32ee1cc8b05aa06e54599358e89cd8f7007f","modified":1695973866320},{"_id":"source/_posts/2017-08-17-shabusi.md","hash":"bdcf8a9dfa2a6d14b3a8337e0da28cdfb842572c","modified":1695973866331},{"_id":"source/_posts/15级强台风山竹即将登陆广东.md","hash":"8d31cfe3bab70505ca5189023e05827fbefaa1a0","modified":1695973866320},{"_id":"source/_posts/2017-12-02-zhuhai.md","hash":"c994ce353e01d9e3cb2a5c3ac1124db5c67de7e5","modified":1695973866331},{"_id":"source/_posts/2017-06-05-marry.md","hash":"902c2a5d13fd732ab60c0fef1fe47d11fc41fcc9","modified":1695973866321},{"_id":"source/_posts/2018-04-17-shendiao.md","hash":"d147864c6d13b6ef70b91246e01d31ad3f0c05f6","modified":1695973866331},{"_id":"source/_posts/2018-05-04-linux-SS.md","hash":"cd7e5ce0c0ec0fe4b8e29ebf56cb88666c97ee67","modified":1695973866331},{"_id":"source/_posts/2018-10-21-lol-s8.md","hash":"dfe9db04394282f39ab5ec6781845cb776a11531","modified":1695973866332},{"_id":"source/_posts/2019-01-12-SNH48-xuyang.md","hash":"5cc39103e6650b7f4ef64ae8a14caa094a62cb92","modified":1695973866332},{"_id":"source/_posts/2017-06-26-zhuhai.md","hash":"cd265af9bd22af6bfbe7bda68d6af794b315ec38","modified":1695973866330},{"_id":"source/_posts/2019-06-17-父亲节快乐.md","hash":"0e1668cfca97228dbf8a8989850dead39aa8406b","modified":1695973866333},{"_id":"source/_posts/2019-03-03-yitian.md","hash":"0ab292b3d8c16fd2044d0cc1d1fb733d795a9aaf","modified":1695973866333},{"_id":"source/_posts/2019-04-03-CentOS-ShadowsocksR.md","hash":"419dc7338d4967226c67078ff70be0edf9aadd47","modified":1695973866333},{"_id":"source/_posts/2021-03-24-h97m-vh+i5_5575r_oc0.6.7-big_sur_.md","hash":"66f0a892eee83d96402fe3edf2e76d4d33e59576","modified":1695973866334},{"_id":"source/_posts/2021-10-10-NEC_VK22_opencore.md","hash":"e988c2d6484cca63cf5ae5d95dce6b86ed63a86e","modified":1695973866335},{"_id":"source/_posts/2021-10-10-NEC_VK22t.md","hash":"b94a953447d02d71d5c013b8fe29443550463021","modified":1695973866335},{"_id":"source/_posts/2019-08-01-SSD.md","hash":"c790be96880d9c2679f8c9b683aa2a1dc63977ed","modified":1695973866334},{"_id":"source/_posts/2021-10-11-nec_vk22t-nvme.md","hash":"0ac4cc64ae7a4d0984ea386734f3c08c0ebc1469","modified":1695973866338},{"_id":"source/_posts/2021-10-13-nvme-mod-small.md","hash":"9c41e8d24f66979b41b8797aa9cb82ab3ee6c050","modified":1695973866340},{"_id":"source/_posts/2021-10-19-NEC_vk22t_bios_nvme.md","hash":"781ad420d222751cb698693fb8a6cbbf3ebc7e7d","modified":1695973866340},{"_id":"source/_posts/2021-10-19-onda_h410ipc_codec.md","hash":"a7f56752c00cda82c173090b40e832189b16dc37","modified":1695973866341},{"_id":"source/_posts/2021-10-13-nec_vk22t_bios.md","hash":"0e718f22c5a4a838ed175caaaa4e73e12da2b478","modified":1695973866339},{"_id":"source/_posts/2021-12-14-rx560_4g_vbios.md","hash":"ba553d3b5815b0beb3ecc4828623d63d6385656a","modified":1695973866341},{"_id":"source/_posts/2022-06-01-NEC_VK22T-OC0.8.0-macOS12.4.md","hash":"171b77eab2549a877ce8b624b4944491a3838834","modified":1695973866345},{"_id":"source/_posts/2022-01-21-2023-amd-gpu.md","hash":"270f3c573bb4b72b192af7b3b87cb37978bfb087","modified":1695973866341},{"_id":"source/_posts/2022-04-12-ssd.md","hash":"176926cc185c5a5638dc1ccc7074f35d1afb2e28","modified":1695973866342},{"_id":"source/_posts/2022-07-27-Linux-cms.md","hash":"a3b0e9c147422bdc39d3b3b7149a7c75f2a43f61","modified":1695973866346},{"_id":"source/_posts/2022-07-22-H97i_gmaing.md","hash":"8d2989192f3366d41c005479146ff9d93c0ffa14","modified":1695973866346},{"_id":"source/_posts/2022-08-08-macOS-fliqlo.md","hash":"1cec60d9fec6c5b848f814c53859f55434dbd553","modified":1695973866347},{"_id":"source/_posts/2022-07-29-macOS-homebrew.md","hash":"88984c4d7f10badbba1096e803b9f53d8959ecf1","modified":1695973866346},{"_id":"source/_posts/2022-09-19-Typecho-CommentsByQQ.md","hash":"7a09f93efe9f56669a3720497ef1dc115f2ba2d4","modified":1695973866347},{"_id":"source/_posts/2022-10-21-b150m-et_m2+rx560.md","hash":"9bb1bf9c9e2d390293294d6a58896beb53aea4dc","modified":1695973866348},{"_id":"source/_posts/2022-10-14-office2016_Mac_.md","hash":"bc608dbd13e83cb596227c870aecbab822999ff3","modified":1695973866347},{"_id":"source/_posts/2022-11-08-NEC_VK23T-vs-VK22T.md","hash":"126f819e5f11e4824afcce2acb493451e8c70f67","modified":1695973866351},{"_id":"source/_posts/2022-11-08-VK23-OpenCore0.8.5.md","hash":"b11cf3ee7eee60bb43c2efabed7b9c82e9a7d639","modified":1695973866352},{"_id":"source/_posts/2022-11-15-macOS-Windows-time.md","hash":"b33d6724d3800ff86ec76dd6ab3dcc5e1b5f42a4","modified":1695973866352},{"_id":"source/_posts/2022年12月8日终于全国防疫放开管控了.md","hash":"89e2c31e03ee06b553dba787537624674690c789","modified":1695973866352},{"_id":"source/_posts/42个虚拟信用卡开卡渠道.md","hash":"8a2f5668db0ab55c2b8ec0ac4684aa902be9db77","modified":1695973866353},{"_id":"source/_posts/2023-guo-nei-zhu-ce-chatgpt-de-fang-fa.md","hash":"8fb49e45235b20728d92f6c9eec7b087384b3c98","modified":1695973866353},{"_id":"source/_posts/8月27.md","hash":"1f3cbdbab433a2a177d0fb8540208d792d218542","modified":1695973866353},{"_id":"source/_posts/DSM918黑群晖引导7.1.0.md","hash":"774331cdd166e74301ee5f44e541d8c0956d74e8","modified":1695973866355},{"_id":"source/_posts/Git在windows下区分大小写.md","hash":"c44f6b654bec5bef9f819c096cfb3f82708f71a9","modified":1695973866362},{"_id":"source/_posts/LEDE 软路由安装“XX上网”离线插件包提示含非法关键字的解决方法.md","hash":"51c6884a01e5b2e3d12cce8bc4e2a6a1eb360664","modified":1695973866362},{"_id":"source/_posts/CentOS系统时间和时区查看以及修改的方法.md","hash":"d975d5187ebea7fcceb2374c0dde0e1e357ec2f8","modified":1695973866353},{"_id":"source/_posts/Vi编辑器的基本使用方法!.md","hash":"0b405cb769836200172cdf2659b940ca4e4ed842","modified":1695973866363},{"_id":"source/_posts/centos7_ssh连接慢的解决方法.md","hash":"d4eb5235cfc9167c38eb86b80cec0815a2d03511","modified":1695973866364},{"_id":"source/_posts/centos7安装后没有网络.md","hash":"87cefce3723d0270505cf6ccde9ae4af879294a8","modified":1695973866364},{"_id":"source/_posts/cloud-torrent-for-centos-yi-jian-an-zhuang.md","hash":"ed664addb60407e5280fca00403628f65651743f","modified":1695973866364},{"_id":"source/_posts/edge_浏览器,出现“你的连接不是专用连接提示”,怎么办?.md","hash":"5946771196e7fd1295436693b5d5834b79e4cc02","modified":1695973866364},{"_id":"source/_posts/qv2ray-ke-hu-duan-ji-nei-he-xia-zai.md","hash":"7809bbabd146bd3450718a19f870bd68a680b44b","modified":1695973866365},{"_id":"source/_posts/mokee-rom.md","hash":"45b06a4e986cd484006788cb89114827bcc2dba8","modified":1695973866365},{"_id":"source/_posts/一个时代终将落幕.md","hash":"17a93fa3bd2ded03ee8026ff70543fae2ff936f4","modified":1695973866372},{"_id":"source/_posts/一周之始.md","hash":"ef1fb9ef0f130edaf9e5fd2d46e7cb3e4e390cd4","modified":1695973866373},{"_id":"source/_posts/上海.md","hash":"1cd9609737033f8c6e71746bcc53b9284e8894e3","modified":1695973866373},{"_id":"source/_posts/中元节.md","hash":"b8463815f347befd6c88dc99267c152529f8ce07","modified":1695973866374},{"_id":"source/_posts/下雨了.md","hash":"6bc19053218325378533b72155e3be1695617eb9","modified":1695973866373},{"_id":"source/_posts/中国式相亲之现状.md","hash":"e83e80fdf1bf0585643e50e6550ca03e32cab1a7","modified":1695973866374},{"_id":"source/_posts/中秋节快乐.md","hash":"67d244237a96659c6f8dcff63b1877d6460e19e6","modified":1695973866375},{"_id":"source/_posts/估计也只有QQ邮箱记得今天是什么日子.md","hash":"12d40101c969eef80aba9b2a1d9d9f9b41c8c5cd","modified":1695973866375},{"_id":"source/_posts/你好2018.md","hash":"f86976f567b447fa77370dcedafd39dbacb0fe0a","modified":1695973866375},{"_id":"source/_posts/使用 Docker 构建 Pleroma 实例.md","hash":"871356abb86f6f6c6bfae57d9d7b88667ab7f557","modified":1695973866376},{"_id":"source/_posts/关于网恋.md","hash":"70ac06d62efa878c6d18196ec03433507638fe75","modified":1695973866376},{"_id":"source/_posts/使用cloudflare Tunnels实现内网穿透.md","hash":"363804443ed7e77684caa501bc9185ac1e8afe33","modified":1695973866376},{"_id":"source/_posts/关于英雄联盟S8八强对抗的预测.md","hash":"32a6a0bb13cc69f6730b047078956788d4ae3eca","modified":1695973866377},{"_id":"source/_posts/写在2023中秋前夕.md","hash":"ccb3dafde78e4b5e4cc1312307e92cf356cbe4eb","modified":1695973866380},{"_id":"source/_posts/写在30岁之后.md","hash":"8eb577b30596ff40fe1666a2328c711cc008922c","modified":1695973866380},{"_id":"source/_posts/写在MSI季中冠军赛RNG夺冠之后.md","hash":"f825f35ce029fa0dc4da8d146d544f54d1dcdc99","modified":1695973866381},{"_id":"source/_posts/写在加班结束前.md","hash":"098b05b3c35df837e27fe1fcf93281a33af436ba","modified":1695973866381},{"_id":"source/_posts/写在感恩节的话.md","hash":"c5f37ddaf5c0e1b1ca44ec1244fb3b9b02b86053","modified":1695973866382},{"_id":"source/_posts/写在愚人节之后.md","hash":"4ebd15046b8cc70f782ad12fdde3c9d91a96aa7f","modified":1695973866381},{"_id":"source/_posts/到深圳的第一天.md","hash":"a5a08266b1b5e0f49a014fc3c4c2d3be779fec2b","modified":1695973866382},{"_id":"source/_posts/冬日-武汉.md","hash":"65d5157268f1583c5194b4c1011e68066628631b","modified":1695973866382},{"_id":"source/_posts/十年.md","hash":"8c12f9f00106f31864ecebc0e10c3987380717e6","modified":1695973866383},{"_id":"source/_posts/半年没有更新博客了.md","hash":"c3af570318e2848f0f165ff5b87838645213ee7f","modified":1695973866383},{"_id":"source/_posts/博客的说说页面之Memos.md","hash":"523c14d8a284eada6b809a8c3dc6ab616b58e380","modified":1695973866385},{"_id":"source/_posts/又是一年冬季.md","hash":"7ee7aef3ba3ca975ef31134f207aabfc5359c7ce","modified":1695973866386},{"_id":"source/_posts/压力山大.md","hash":"64a266f6e634b6b8db4e9ac96de0504e10fa420c","modified":1695973866386},{"_id":"source/_posts/周二.md","hash":"376b41265c20b3740e2c6babf9ba118f8a3ebfc1","modified":1695973866387},{"_id":"source/_posts/又是拳头.md","hash":"bc8b944e10456732dded8d8107fbcc86f86b3ec4","modified":1695973866387},{"_id":"source/_posts/周日.md","hash":"c334fa831107f304c987ec4d407b2824cb7eb64a","modified":1695973866387},{"_id":"source/_posts/圣诞节.md","hash":"82dbbba71c027e8c02e5c61340f7cf71b8bffacb","modified":1695973866388},{"_id":"source/_posts/在Fly.io部署Memos.md","hash":"b79b498cda49d80d0ff5d7e7059018160c4795c4","modified":1695973866388},{"_id":"source/_posts/在fly.io部署artalk评论系统.md","hash":"8c931c564ce1bdcfd6c5a034b02e47dc290c0f29","modified":1695973866389},{"_id":"source/_posts/在fly.io部署Gotosocial.md","hash":"e10d687013a52bc54d1e6b5ee23b46920e0b5778","modified":1695973866388},{"_id":"source/_posts/女子.md","hash":"3538c399ef40644e95cb990b338d073f73b001e3","modified":1695973866389},{"_id":"source/_posts/如何快速在fly.io上部署typecho.md","hash":"913ac8df88c8d2e0779367c1b089f2ecbbba888c","modified":1695973866389},{"_id":"source/_posts/平安夜.md","hash":"764d8c4de8e65d30e9069384fcd948f774409869","modified":1695973866390},{"_id":"source/_posts/得之我幸失之我命.md","hash":"74c9c70b32b49314b78682e9d7266f17b695a8ad","modified":1695973866390},{"_id":"source/_posts/拳头.md","hash":"77ce958987139818f1ef62e4df539a5dd24008b3","modified":1695973866391},{"_id":"source/_posts/我们是如何变得平庸.md","hash":"b4fec172ce62e7c1b3dc47ed54bc05a23754b388","modified":1695973866390},{"_id":"source/_posts/搬瓦工VPS桌面监控工具BandwagongVPS-controller.md","hash":"d731c39e9f6444f9fe7f3dac84fa4c6fd0eaeb9d","modified":1695973866391},{"_id":"source/_posts/我的梦想.md","hash":"fd10527a79fca82a630ab0f56ea366c0db1f03eb","modified":1695973866391},{"_id":"source/_posts/搬瓦工bandwagonhost-vps新手使用教程.md","hash":"e05402513245ae0a1e49fa2e4b69e84c0525e969","modified":1695973866392},{"_id":"source/_posts/新的一年2017.md","hash":"aefc16ce749f848e57e3a8708908412f91204267","modified":1695973866392},{"_id":"source/_posts/杀手,无与伦比的自由.md","hash":"1c06bcb1577b9f5a9f33cef7e48917c18f533f91","modified":1695973866392},{"_id":"source/_posts/给Memos添加Artalk评论.md","hash":"43dd9ef169ffb8feb4266e749808cbdd2e37607b","modified":1695973866393},{"_id":"source/_posts/现实就是这么现实.md","hash":"1161cc7964af25b917e49ae90e77f81f5eb9f22b","modified":1695973866392},{"_id":"source/_posts/给Memos添加Twikoo评论.md","hash":"b62991ab7cc0a0bdc914d09f78b1de917efc73d3","modified":1695973866393},{"_id":"source/_posts/编译AppleALC出现错误.md","hash":"b01dd91f8f8b23f41fce61eb114ddb55076100e2","modified":1695973866397},{"_id":"source/_posts/群晖CPU和内存占用过高的排查记录.md","hash":"b7bbb501c37b0da123b50d9e3acb9d302a577847","modified":1695973866397},{"_id":"source/_posts/群晖docker出现注册表无法访问的解决办法.md","hash":"f3c1540390434e9741475afd238decceb99f49c4","modified":1695973866397},{"_id":"source/_posts/老子与太上老君.md","hash":"21b32596b5c6fb24574327dfa28e25f6d76eb1cd","modified":1695973866397},{"_id":"source/_posts/荒唐-文,古龙.md","hash":"6e56979ac17e1f09a6b6fb4262234b51e6a83a16","modified":1695973866398},{"_id":"source/_posts/西游记中的谜.md","hash":"ea79c1cba30294acd14dbf360c7e946c67f0fbad","modified":1695973866398},{"_id":"source/_posts/记在8月.md","hash":"96023535eabaa9b9d2e52b4d4f69734a02a3e3d3","modified":1695973866398},{"_id":"source/_posts/论坛社交的没落,终究是败给了时代.md","hash":"72d0088568dc321ef1eba3c3ee2cee59a8b253dc","modified":1695973866399},{"_id":"source/_posts/路下如烟.md","hash":"143816087b687184821847585c5093434ae047e6","modified":1695973866400},{"_id":"source/_posts/还有两天就过完2016.md","hash":"873f2ce788731414223f2ccc3bfa1d0c11b35849","modified":1695973866400},{"_id":"source/_posts/阿里悟空服务下线.md","hash":"d202d3193847ac981b91f6998148af5066b18251","modified":1695973866400},{"_id":"source/_posts/黄易先生逝世.md","hash":"cddfc279f4204d32294aba8113239424f074a094","modified":1695973866401},{"_id":"source/memos/index.md","hash":"e2e27826d1195dc6b22a57b2cb5754a14fa95cba","modified":1695973866407},{"_id":"source/tags/index.md","hash":"24c9fa0ff35b2c09ac7a16237553aa054165500e","modified":1695973866418},{"_id":"source/links/index.md","hash":"bfc2858a2f3d233cd56bac5aee6681f86ae9508f","modified":1695973866407},{"_id":"source/wechat.png","hash":"f14b99efb6d6a6bf8039af05b099cc147f1d668b","modified":1695973866419},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_tag/tag.styl","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1695973852140},{"_id":"node_modules/hexo-theme-fluid/package.json","hash":"b90d8676aef8c7cf663dba9427c0e5ae470a9f24","modified":1695973852050},{"_id":"node_modules/hexo-theme-fluid/_config.yml","hash":"60e1f65ec6f63a31528aecc242b7058c34f73a8c","modified":1695973851975},{"_id":"node_modules/hexo-theme-fluid/LICENSE","hash":"511e49f0bd8282a0d002c527474da8e1e5add393","modified":1695973851973},{"_id":"node_modules/hexo-theme-fluid/README.md","hash":"0ace41fdc5929b967606be89000efee77ee31590","modified":1695973851974},{"_id":"node_modules/hexo-theme-fluid/languages/de.yml","hash":"c52ce73a291fa50953edbd11c1dfb1cc7cab52c2","modified":1695973851977},{"_id":"node_modules/hexo-theme-fluid/languages/en.yml","hash":"2839da328f197cf90cafdf2b538fcd027ab6cfba","modified":1695973851977},{"_id":"node_modules/hexo-theme-fluid/languages/ja.yml","hash":"411aa49e2e8dea90a6d8cc2dc92f264609ea273b","modified":1695973851979},{"_id":"node_modules/hexo-theme-fluid/languages/eo.yml","hash":"76d2920b49c8d2489c37514489545d0fc4eac834","modified":1695973851978},{"_id":"node_modules/hexo-theme-fluid/languages/zh-CN.yml","hash":"e3dd270fd6d9e386b367159181056b9380ee0f26","modified":1695973851991},{"_id":"node_modules/hexo-theme-fluid/layout/404.ejs","hash":"c49974dcbda02fe720498398e9778826335459c0","modified":1695973852000},{"_id":"node_modules/hexo-theme-fluid/languages/zh-HK.yml","hash":"676b3ee8a16d796b4a898a9e5be2f52c372055ed","modified":1695973851991},{"_id":"node_modules/hexo-theme-fluid/languages/es.yml","hash":"7fcd16cd363f1a166a3270c23c0660eff7475744","modified":1695973851979},{"_id":"node_modules/hexo-theme-fluid/languages/zh-TW.yml","hash":"aac765cccef9f9044c4a88941fd01ba1883178fc","modified":1695973851992},{"_id":"node_modules/hexo-theme-fluid/layout/archive.ejs","hash":"c524ce76747042ec2f9ed8d5025f80e01b462b3b","modified":1695973852046},{"_id":"node_modules/hexo-theme-fluid/languages/ru.yml","hash":"02d8ad186a2d52c20b76b35f406a728c6486f820","modified":1695973851991},{"_id":"node_modules/hexo-theme-fluid/layout/category.ejs","hash":"264f68cbf826787e683a30e1377c56c0895c7386","modified":1695973852047},{"_id":"node_modules/hexo-theme-fluid/layout/.DS_Store","hash":"e2295dbe42d85b294e6f3aeefaf3623bd31759ed","modified":1695973851999},{"_id":"node_modules/hexo-theme-fluid/layout/about.ejs","hash":"bd3ede2a5f45c5256cf8f883bb8fcca645834869","modified":1695973852040},{"_id":"node_modules/hexo-theme-fluid/layout/tag.ejs","hash":"e87fc58829ea214ac16e8e4f13cd5c389133697b","modified":1695973852049},{"_id":"node_modules/hexo-theme-fluid/layout/categories.ejs","hash":"838a68e210bddfca6d4ba070e1e2f1ca53cb7d06","modified":1695973852046},{"_id":"node_modules/hexo-theme-fluid/layout/index.ejs","hash":"797b70bc7ad15e1adfecde1162230a20ff4f212d","modified":1695973852047},{"_id":"node_modules/hexo-theme-fluid/layout/page.ejs","hash":"8ba210724c023d45a4564415762f3da299bd1d0e","modified":1695973852049},{"_id":"node_modules/hexo-theme-fluid/layout/layout.ejs","hash":"d4ffeb7eff398dea154340794bd277f75ddeedef","modified":1695973852048},{"_id":"node_modules/hexo-theme-fluid/layout/links.ejs","hash":"fbed4b3d1e475b3de9d8ce05362abcc658a53408","modified":1695973852048},{"_id":"node_modules/hexo-theme-fluid/layout/tags.ejs","hash":"b7c1a6d8fc1097fc16d2300260297013cb692153","modified":1695973852050},{"_id":"node_modules/hexo-theme-fluid/scripts/.DS_Store","hash":"daec53fd4601c37ca272321ba2eb594d9b0a43ac","modified":1695973852051},{"_id":"node_modules/hexo-theme-fluid/layout/post.ejs","hash":"bdea32ca3218938271da064446f2de9b3fcfaa6d","modified":1695973852049},{"_id":"node_modules/hexo-theme-fluid/source/.DS_Store","hash":"e11e97632e6d13d5b9dccadcc514268f3c039508","modified":1695973852098},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/category-chains.ejs","hash":"508254a648d8597e62e4012c8beab44bfa82e904","modified":1695973852001},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments.ejs","hash":"1ce9094faec6204949cdaf604aaf9200787e4218","modified":1695973852007},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/paginator.ejs","hash":"0d443f23c459787338917900f50fec1c8b3b3bdd","modified":1695973852021},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/category-list.ejs","hash":"0c14869e15f7dc615c8353765569644238f38f2d","modified":1695973852007},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/archive-list.ejs","hash":"78c34e32746041f23678669bbadfbede15e4c6d2","modified":1695973852000},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/markdown-plugins.ejs","hash":"b5cd435b27f090939b6051bef41a38a3376044ac","modified":1695973852021},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/css.ejs","hash":"70646e7f7a7684e12b298cd8a36fbea2814c3635","modified":1695973852018},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/footer.ejs","hash":"52b8954ae0eff5eb66a3841b37f144336b8f0866","modified":1695973852018},{"_id":"node_modules/hexo-theme-fluid/scripts/events/index.js","hash":"6c3b24207e4ea3ae4edeb715af40ef23711b92b9","modified":1695973852052},{"_id":"node_modules/hexo-theme-fluid/scripts/filters/default-injects.js","hash":"3d30c722b9e24c33577d6fab822628841fadf992","modified":1695973852067},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/scripts.ejs","hash":"89fc9f663a1091911b79ab9697c09446d16184f9","modified":1695973852040},{"_id":"node_modules/hexo-theme-fluid/scripts/filters/locals.js","hash":"2340a576635b16fd2456b3494f5afe89cd7764db","modified":1695973852067},{"_id":"node_modules/hexo-theme-fluid/scripts/generators/index-generator.js","hash":"3550976efc94500284795f13485f5a1765fc120b","modified":1695973852068},{"_id":"node_modules/hexo-theme-fluid/scripts/generators/local-search.js","hash":"33427308ca29f1d76336c83e704571c9de75df02","modified":1695973852068},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/button.js","hash":"e1d0caed12e7cd9a35cf64272c41854b2901a58f","modified":1695973852084},{"_id":"node_modules/hexo-theme-fluid/scripts/generators/pages.js","hash":"3fb72d3c2224c32d861a6e8a85e78a8b67e6a244","modified":1695973852068},{"_id":"node_modules/hexo-theme-fluid/scripts/filters/post-filter.js","hash":"2d03854aa1d31211bae505bc72c820e761ba357e","modified":1695973852067},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/checkbox.js","hash":"aa03d0b914d87b9194ee3a0612ab5827a8dedbdd","modified":1695973852085},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/group-image.js","hash":"cc176cc1d7e7cc28cedf8397ae748c691d140be2","modified":1695973852085},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/mermaid.js","hash":"dbfe59fde77d87b1d7d0c46480a2a729010988eb","modified":1695973852086},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/label.js","hash":"6c5916d86c63795c7e910bf614b0e7ece5073702","modified":1695973852085},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/date.js","hash":"9bc9ba08d1d871394ee1c3a1cc2f21dc343f515a","modified":1695973852073},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/note.js","hash":"e300ec4ee6c63464859ab000e987bf8dd7db4025","modified":1695973852091},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/search.ejs","hash":"57a0f61242d9ce2bd2c51b2f84193f6dc1377ef9","modified":1695973852040},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/engine.js","hash":"96af7e55fdbe0819bacc554ecbfe42375a088df6","modified":1695973852074},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/import.js","hash":"f9821f7789ea6f069977a8c642aa5ccb6d19077c","modified":1695973852075},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/export-config.js","hash":"14a207a7d4e329382ab5d4e1da1ef85ff043daba","modified":1695973852074},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/header.ejs","hash":"3668304d08c48b68d532532921a12069a2736150","modified":1695973852019},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/scope.js","hash":"3b67d50050158423c8fa47f1de6aedcfe916637b","modified":1695973852082},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/injects.js","hash":"9219d59c51930c7a82fcde918d6efbc5aa572ea2","modified":1695973852075},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/page.js","hash":"49b2c6449d7be35739c6cfea3cab4e790580983a","modified":1695973852081},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/wordcount.js","hash":"9f88c9149e8e7c4f90a5cf833373e4d18ecb2500","modified":1695973852083},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/url.js","hash":"f713ddb6c8018ec7b96d3567057f1f932609beea","modified":1695973852082},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/utils.js","hash":"d7ff7cf5e721dfeafe0c2a77a5929b2c3f8fee2a","modified":1695973852083},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/compare-versions.js","hash":"37f90bd4e35ce49457dc2a348b9f66e0b242c014","modified":1695973852091},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/resolve.js","hash":"a5d70005913ab03cea0a0dc601097628b4dbd5a8","modified":1695973852092},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/object.js","hash":"3e03b534e2e92a6e17567b006d7e3eaad4b37598","modified":1695973852092},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/url-join.js","hash":"dbdb10b23fcd3928e86a4cb46fa3455e060b4aa0","modified":1695973852097},{"_id":"node_modules/hexo-theme-fluid/source/css/main.styl","hash":"9e9171325bb7148c11ceee283d00c137c8a1c5c5","modified":1695973852156},{"_id":"node_modules/hexo-theme-fluid/scripts/events/.DS_Store","hash":"80308812974d7cb7e001cd8f64ff9fced30ff139","modified":1695973852051},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/head.ejs","hash":"0289f61834fd21a8f958f8e18b395a989b285682","modified":1695973852019},{"_id":"node_modules/hexo-theme-fluid/source/css/mac.styl","hash":"cd35967b51908ab12b84b878f6830453ec695b77","modified":1695973852156},{"_id":"node_modules/hexo-theme-fluid/source/css/highlight-dark.styl","hash":"c74d7aed425d20f2fa096f386a9521b67b9ab269","modified":1695973852155},{"_id":"node_modules/hexo-theme-fluid/source/css/highlight.styl","hash":"57ce8b8f95ab1f40612a9dce1793de5ab9b4bbfc","modified":1695973852155},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/.DS_Store","hash":"df2fbeb1400acda0909a32c1cf6bf492f1121e07","modified":1695973852091},{"_id":"node_modules/hexo-theme-fluid/source/css/gitalk.css","hash":"1fe60b2ab1d704f5a4f55e700dca5b8785fb390e","modified":1695973852154},{"_id":"node_modules/hexo-theme-fluid/source/img/.DS_Store","hash":"df2fbeb1400acda0909a32c1cf6bf492f1121e07","modified":1695973852157},{"_id":"node_modules/hexo-theme-fluid/source/js/boot.js","hash":"33bb7c8255d2e3c93a1bea8c9221399b3a868a63","modified":1695973852166},{"_id":"node_modules/hexo-theme-fluid/source/img/avatar.png","hash":"fe739a158cc128f70f780eb5fa96f388b81d478f","modified":1695973852157},{"_id":"node_modules/hexo-theme-fluid/source/js/color-schema.js","hash":"7e15ce2ef16b0705148306a27c6a79d809c3040b","modified":1695973852166},{"_id":"node_modules/hexo-theme-fluid/source/img/fluid.png","hash":"64b215db2cb3af98fe639e94537cb5209f959c78","modified":1695973852160},{"_id":"node_modules/hexo-theme-fluid/source/img/loading.gif","hash":"2d2fc0f947940f98c21afafef39ecf226a2e8d55","modified":1695973852160},{"_id":"node_modules/hexo-theme-fluid/source/img/police_beian.png","hash":"90efded6baa2dde599a9d6b1387973e8e64923ea","modified":1695973852166},{"_id":"node_modules/hexo-theme-fluid/source/js/img-lazyload.js","hash":"67f6250f98b36a6599ea982d11cbb060c5ffb92a","modified":1695973852167},{"_id":"node_modules/hexo-theme-fluid/source/js/events.js","hash":"0eda8690b8e3912d90afe987ea6e80e881338c1f","modified":1695973852167},{"_id":"node_modules/hexo-theme-fluid/source/js/plugins.js","hash":"753c2cf95f2659fef80277b895f4da10c8888c72","modified":1695973852174},{"_id":"node_modules/hexo-theme-fluid/source/js/utils.js","hash":"9d0423db40a787f3b19968205b9ed92a848c9153","modified":1695973852175},{"_id":"node_modules/hexo-theme-fluid/source/xml/local-search.xml","hash":"85fcc23b4db654a7f91fc55b6fb0442bb3ed3a9a","modified":1695973852175},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/changyan.ejs","hash":"0c410ef79785897c8de3da333b057a2936fd569b","modified":1695973852008},{"_id":"node_modules/hexo-theme-fluid/source/js/local-search.js","hash":"491021125d2579e841c83f36d3ab790d1eab9d1e","modified":1695973852174},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/discuss.ejs","hash":"d400e5721af28cefecaf50b46c82dcdde4cda4a8","modified":1695973852009},{"_id":"node_modules/hexo-theme-fluid/source/js/leancloud.js","hash":"df87d747ea2d342352a89f6792dbd721102eed5b","modified":1695973852173},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/giscus.ejs","hash":"66995ec9dab10ed35c2a775010c447113c6848d4","modified":1695973852010},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/disqus.ejs","hash":"79ec17eec6e15076c685688e740230e92c66efa9","modified":1695973852009},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/cusdis.ejs","hash":"1e93ca89777e4beb0f0e5cb70e03aab48e958542","modified":1695973852009},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/livere.ejs","hash":"bcceafab01fe695c59951d939f7cef502f3d7b48","modified":1695973852016},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/gitalk.ejs","hash":"7f04e5c22821bb94da791973d9c6692b03bac81d","modified":1695973852010},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/remark42.ejs","hash":"45c879768b40ba56af62e18ad54bffbf73a6f3a1","modified":1695973852016},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/valine.ejs","hash":"ef04d4fc3f26588ae9d8712938d648304fc05455","modified":1695973852017},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/footer/beian.ejs","hash":"77d0c9df31a22ed8a3e341637bde4165a11a7ce9","modified":1695973852018},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/waline.ejs","hash":"99fe072ec17e83332325b3c59464bd39ea1f5a96","modified":1695973852017},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/header/navigation.ejs","hash":"0bc2f480f19e1efe785dec306ba525428aa881b7","modified":1695973852020},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/footer/statistics.ejs","hash":"ed2348bd9f56d19836b508c52ce9cc9122471f51","modified":1695973852019},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/header/banner.ejs","hash":"a84d8dcb44f5f6289ef09db4d02ab14de72c2c87","modified":1695973852020},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/code-widget.ejs","hash":"03c7c69fbb1754fdccfa18671aac23b8637b869e","modified":1695973852022},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/encrypt.ejs","hash":"018cab52ff696a6c78ebc01e10237a90a0c33603","modified":1695973852022},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/analytics.ejs","hash":"6e0f0095e1cb1c0d89b6697ebcd33656b4e3e14c","modified":1695973852021},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/fancybox.ejs","hash":"3900e54ade140e0e49c571a1955f0b1f3a59b281","modified":1695973852030},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/anchorjs.ejs","hash":"8a4ea62c46f9a75c94096a27b2d3f5c10a2f82e5","modified":1695973852021},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/highlight.ejs","hash":"502b99e19e496825df7032ca2b0b1a95ebb2b357","modified":1695973852031},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/twikoo.ejs","hash":"938eb60413ae8af83ffeaba4d85df88387cdd5be","modified":1695973852016},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/category-bar.ejs","hash":"551ffae43844925beb099c85a9e6d8d9fcbf8086","modified":1695973852032},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/mermaid.ejs","hash":"110e45e2d3433178f00f482adc863110f90c46d6","modified":1695973852031},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/utterances.ejs","hash":"d7bcc183fc31af643e7835b13da10fe2ab8614ce","modified":1695973852017},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/nprogress.ejs","hash":"47c1df255aa552ad71ef3e57deca46530a8f2802","modified":1695973852032},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/math.ejs","hash":"d0f06fb482e3a8f9a53dfd94c4e4a65a43f1ff34","modified":1695973852031},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/typed.ejs","hash":"42850952e8f5858497fe774c2aff87b6563ab01e","modified":1695973852032},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/compatible-configs.js","hash":"31208a0db986ba864f756a8ec806b7d254440f9b","modified":1695973852052},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/sidebar-left.ejs","hash":"db4ecdcc762bb1b1bae5060f0baa6115174779ff","modified":1695973852039},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/footnote.js","hash":"f90288463c81e7d0b9a40af680d5f26a9cfc95b8","modified":1695973852052},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/hello.js","hash":"c9efdd41b8606969e5b55f49a2f6df596641b995","modified":1695973852053},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/highlight.js","hash":"fb61d936db040f0cdd960ef4e330d0a6c545ed9d","modified":1695973852054},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/lazyload.js","hash":"c9696633f77dd8055e900497469f9e64eca4d97f","modified":1695973852066},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/injects.js","hash":"92123b7280695b4ac6650f5e1d7fa0d772c71f5b","modified":1695973852066},{"_id":"node_modules/hexo-theme-fluid/source/css/_functions/base.styl","hash":"171697018fd384fce0834875ca94b91f16564cac","modified":1695973852098},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/merge-configs.js","hash":"ec6bf395ccad3dd41f29dc0080aeabf413e30fd9","modified":1695973852066},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/copyright.ejs","hash":"e026955c454ec57bbbb7e9b7d800db90564fc6af","modified":1695973852033},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/sidebar-right.ejs","hash":"2507cdad08f61cf8c1d9b0ca7f4f1dc8c4e5841b","modified":1695973852039},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/meta-bottom.ejs","hash":"f0cb813cd03642c9b68cff8b6669f73a61dd10f8","modified":1695973852033},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/meta-top.ejs","hash":"cef058fd6f33651118b5bdaa3c814757f5c82154","modified":1695973852039},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/pages.styl","hash":"92c062cf55457b6549497244d09ec34e9c0c95c2","modified":1695973852140},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_about/about.styl","hash":"8ba5fb6a8ced1de6f7893184bf12f4021fe22595","modified":1695973852100},{"_id":"node_modules/hexo-theme-fluid/source/css/_mixins/base.styl","hash":"046979dbd8cdabd21d89f9c1d8f1bb3f2fd06d6f","modified":1695973852099},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/toc.ejs","hash":"1b1eb4c8e163a5d909e86da76ef778948e0e0b77","modified":1695973852040},{"_id":"node_modules/hexo-theme-fluid/source/css/_variables/base.styl","hash":"9ea66cf79f1e4356b6b402bc3dc5fb55c9862f1f","modified":1695973852141},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_archive/archive.styl","hash":"e3846fb429f6732bd15fde40f7c28b3492d786c8","modified":1695973852102},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/inline.styl","hash":"96c3bb95dea4b3d3ecd20b810a674bfcef04870c","modified":1695973852119},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/base.styl","hash":"cd255079553985722ee80fb1833f6507dde52194","modified":1695973852111},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/color-schema.styl","hash":"34e3bf07d14f05ccf14716063b969b792f925b58","modified":1695973852112},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_category/category-chain.styl","hash":"4263f7b930e6b57e13295d17fd3745a9e5c52494","modified":1695973852121},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/keyframes.styl","hash":"58a7f8f2baea2d58cf5f7edfc91314ee5d7156ca","modified":1695973852120},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/comment.styl","hash":"1fc96d09d52d9502e84e4e2a8d482ea45e8b81ea","modified":1695973852134},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_index/index.styl","hash":"7d50d2ae4b8b736a764fcce21ec456fa6b72518c","modified":1695973852126},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/print.styl","hash":"571bd018e914bd0f7c5f89df874b5937937e5fa6","modified":1695973852120},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_category/category-bar.styl","hash":"f35415bd86b5c26fbc71728048d9e1481263554f","modified":1695973852120},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/highlight.styl","hash":"d73cccb65eaa804910884df17442e34736b3f4fb","modified":1695973852134},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_tag/tags.styl","hash":"29e9b72cfda2f2baf9cf2597fcd7f9e66303a9bd","modified":1695973852140},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_category/category-list.styl","hash":"d3aeb7bf22d52d7dde59b292090ef8b46943718a","modified":1695973852126},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_links/links.styl","hash":"d3ef491fd449d89a1b95801dee788a5d9bec4320","modified":1695973852133},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/post-page.styl","hash":"8cec4b3682a33585ff2e10fade0c6d38772c6469","modified":1695973852139},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/board.styl","hash":"1068d71721baeed76bf0176f9b964d36b5764c9f","modified":1695973852102},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/banner.styl","hash":"80301db38e448e40e88bb34d0128628b0809b243","modified":1695973852102},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/markdown.styl","hash":"2d12f23b46d0ce07ae810bc4f5635c490a098fa4","modified":1695973852134},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/post-tag.styl","hash":"e8fe053ef8734e54fae12e46acd0087bcd67f8a2","modified":1695973852140},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/anchorjs.styl","hash":"26d65475b1c52a61115044db8883df6739c3a473","modified":1695973852102},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/code-widget.styl","hash":"417a7388b39c0203178b0032e151febd66a0e9f3","modified":1695973852107},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/footnote.styl","hash":"41935973a66c14ab2bea0539d4b1f15c62534fa4","modified":1695973852108},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/copyright.styl","hash":"3ac1eb36e124adef607775aa505386d5680960e2","modified":1695973852107},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/ngrogress.styl","hash":"48799d3148ef6493be0e05897c635124e9b05d03","modified":1695973852109},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/footer.styl","hash":"e6f5921ff9009c1853e7db30c482bc1682433ed9","modified":1695973852107},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/noscript.styl","hash":"8fad325e411bc83c8ebdc4115015477eed5f60da","modified":1695973852110},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/pagination.styl","hash":"f4ae7cbf2f10f459de7864f8e642553b587df889","modified":1695973852110},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/search.styl","hash":"1f4e678d7219815ab62de1b92ec75e021247f90b","modified":1695973852111},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/qrcode.styl","hash":"04447d3b673be84a1af1dc57933a3c41dd7c0cfe","modified":1695973852110},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/header.styl","hash":"5563abb10a40e2f8ece8e521763fe67c6e6bc12b","modified":1695973852108},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/modal.styl","hash":"0ca6171ce262339e0e36cfea0978b554d87ae7fc","modified":1695973852108},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/scroll-btn.styl","hash":"e4dbbbb1a2508a72bc04680552d7ebbea0eed0fe","modified":1695973852111},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/toc.styl","hash":"5defef321e3e933fe84f3f2ca481c88f55381fb0","modified":1695973852111},{"_id":"node_modules/hexo-theme-fluid/source/img/default.png","hash":"167a12978d80371cf578c8a2e45c24a2eb25b6fb","modified":1695973852159}],"Category":[{"name":"hexo","_id":"cln4obyee0007oko00w5f68mk"},{"name":"随笔","_id":"cln4obyei000doko0efws4wkb"},{"name":"推荐","_id":"cln4obyen000ooko00lvlahvt"},{"name":"分享","_id":"cln4obyet0019oko0exle3517"},{"name":"Note","_id":"cln4obyfa0037oko059cu8mmi"}],"Data":[],"Page":[{"title":"分类","type":"categories","comments":0,"date":"2023-04-07T06:24:11.000Z","_content":"","source":"categories/index.md","raw":"---\ntitle: 分类\ntype: \"categories\"\ncomments: false\ndate: 2023-04-07 14:24:11\n---\n","updated":"2023-09-29T07:51:06.402Z","path":"categories/index.html","layout":"page","_id":"cln4obye50000oko010ls9b3b","content":"","site":{"data":{}},"excerpt":"","more":""},{"title":"朋友圈","date":"2022-10-08T16:38:16.000Z","comments":0,"comment":false,"_content":"\n
\n\n\n","source":"fcircle/index.md","raw":"---\ntitle: 朋友圈\ndate: 2022-10-09 00:38:16\ncomments: false\ncomment: false\n---\n\n
\n\n\n","updated":"2023-09-29T07:51:06.406Z","path":"fcircle/index.html","layout":"page","_id":"cln4obyea0002oko010lp6dt9","content":"
\n\n\n","site":{"data":{}},"excerpt":"","more":"
\n\n\n"},{"title":"关于","layout":"about","comments":0,"date":"2023-04-07T06:17:13.000Z","_content":"## 关于本站 \n* 本站框架基于`Hexo`\n* 源代码托管于`github`\n* 托管于`netlify`,自动生成静态页面\n\n## 关于我\n平平无奇 \n中年男性\n资深网民\nDIY爱好者\n\n## 打赏\n![支付宝](/zhifubao.png)\n![微信](/weixin.png)\n\n","source":"about/index.md","raw":"---\ntitle: 关于\nlayout: \"about\"\ncomments: false\ndate: 2023-04-07 14:17:13\n---\n## 关于本站 \n* 本站框架基于`Hexo`\n* 源代码托管于`github`\n* 托管于`netlify`,自动生成静态页面\n\n## 关于我\n平平无奇 \n中年男性\n资深网民\nDIY爱好者\n\n## 打赏\n![支付宝](/zhifubao.png)\n![微信](/weixin.png)\n\n","updated":"2023-09-29T07:51:06.401Z","path":"about/index.html","_id":"cln4obyed0005oko0as8r4ila","content":"

关于本站

\n

关于我

平平无奇
中年男性
资深网民
DIY爱好者

\n

打赏

\"支付宝\"
\"微信\"

\n","site":{"data":{}},"excerpt":"","more":"

关于本站

\n

关于我

平平无奇
中年男性
资深网民
DIY爱好者

\n

打赏

\"支付宝\"
\"微信\"

\n"},{"title":"闲言碎语","comments":0,"date":"2023-06-07T06:17:13.000Z","_content":"\n

\n 随便记录\n

\n
\n\n\n\n\n\n\n\n","source":"memos/index.md","raw":"---\ntitle: 闲言碎语\ncomments: false\ndate: 2023-06-07 14:17:13\n---\n\n

\n 随便记录\n

\n
\n\n\n\n\n\n\n\n","updated":"2023-09-29T07:51:06.407Z","path":"memos/index.html","layout":"page","_id":"cln4obyef0008oko08jqj1gzm","content":"

\n 随便记录\n

\n
\n\n\n\n\n\n\n\n","site":{"data":{}},"excerpt":"","more":"

\n 随便记录\n

\n
\n\n\n\n\n\n\n\n"},{"title":"标签","type":"tags","comments":0,"date":"2023-04-07T06:19:21.000Z","_content":"","source":"tags/index.md","raw":"---\ntitle: 标签\ntype: \"tags\"\ncomments: false\ndate: 2023-04-07 14:19:21\n---\n","updated":"2023-09-29T07:51:06.418Z","path":"tags/index.html","layout":"page","_id":"cln4obyeh000aoko029i22b4x","content":"","site":{"data":{}},"excerpt":"","more":""},{"title":"links","date":"2023-09-25T07:16:54.000Z","_content":"","source":"links/index.md","raw":"---\ntitle: links\ndate: 2023-09-25 15:16:54\n---\n","updated":"2023-09-29T07:51:06.407Z","path":"links/index.html","comments":1,"layout":"page","_id":"cln4obyei000foko09ne3fjqd","content":"","site":{"data":{}},"excerpt":"","more":""}],"Post":[{"abbrlink":"","date":"2023-09-29T07:51:06.320Z","excerpt":"...","title":"Hexo使用指南","updated":"2023-09-29T07:51:06.320Z","_content":"Welcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues).\n\n## Quick Start\n\n### Create a new post\n\n```bash\n$ hexo new \"My New Post\"\n```\n\nMore info: [Writing](https://hexo.io/docs/writing.html)\n\n### Run server\n\n```bash\n$ hexo server\n```\n\nMore info: [Server](https://hexo.io/docs/server.html)\n\n### Generate static files\n\n```bash\n$ hexo generate\n```\n\nMore info: [Generating](https://hexo.io/docs/generating.html)\n\n### Deploy to remote sites\n\n```bash\n$ hexo deploy\n```\n\n```\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}\n{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}\n\n{% label text color %}\n\n```\n\ndemo\n\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}\n{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}\n\n{% label text color %} test {% label test color %}\n\nMore info: [Deployment](https://hexo.io/docs/one-command-deployment.html)\n","source":"_drafts/hello-world.md","raw":"---\nabbrlink: ''\ncategories:\n- - hexo\ndate: ''\nexcerpt: '...'\ntags:\n- hexo\ntitle: Hexo使用指南\nupdated: 2023-6-13T14:24:12.438+8:0\n---\nWelcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues).\n\n## Quick Start\n\n### Create a new post\n\n```bash\n$ hexo new \"My New Post\"\n```\n\nMore info: [Writing](https://hexo.io/docs/writing.html)\n\n### Run server\n\n```bash\n$ hexo server\n```\n\nMore info: [Server](https://hexo.io/docs/server.html)\n\n### Generate static files\n\n```bash\n$ hexo generate\n```\n\nMore info: [Generating](https://hexo.io/docs/generating.html)\n\n### Deploy to remote sites\n\n```bash\n$ hexo deploy\n```\n\n```\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}\n{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}\n\n{% label text color %}\n\n```\n\ndemo\n\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}\n{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}\n\n{% label text color %} test {% label test color %}\n\nMore info: [Deployment](https://hexo.io/docs/one-command-deployment.html)\n","slug":"hello-world","published":0,"comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obye70001oko0bxdi99ti","content":"

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

\n

Quick Start

Create a new post

1
$ hexo new "My New Post"
\n\n

More info: Writing

\n

Run server

1
$ hexo server
\n\n

More info: Server

\n

Generate static files

1
$ hexo generate
\n\n

More info: Generating

\n

Deploy to remote sites

1
$ hexo deploy
\n\n
1
2
3
4
5
6
This is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}
This is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}
{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}

{% label text color %}

\n\n

demo

\n

This is my website, click the button Butterfly
This is my website, click the button Butterfly

\nButterfly\n\n test \n\n

More info: Deployment

\n","site":{"data":{}},"more":"

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

\n

Quick Start

Create a new post

1
$ hexo new "My New Post"
\n\n

More info: Writing

\n

Run server

1
$ hexo server
\n\n

More info: Server

\n

Generate static files

1
$ hexo generate
\n\n

More info: Generating

\n

Deploy to remote sites

1
$ hexo deploy
\n\n
1
2
3
4
5
6
This is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}
This is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}
{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}

{% label text color %}

\n\n

demo

\n

This is my website, click the button Butterfly
This is my website, click the button Butterfly

\nButterfly\n\n test \n\n

More info: Deployment

\n"},{"title":"15级强台风山竹即将登陆广东","excerpt":"","abbrlink":54465,"date":"2018-09-15T11:42:12.000Z","_content":"\n鉴于其带来的巨大危害,2006年12月第39次世界气象组织台风委员会会议决定把台风“榴莲”除名!\n\n但是对水果执着热爱的泰国人民毅然决定用另一种水果给台风“榴莲”补位,补位的台风名称正是——“山竹”。 \n\n作为超强台风“榴莲”的补位者,“山竹”果然不辱前辈之名,早在9月11日08时就完成究极进化,成为超强台风! \n\n来了!超强台风“山竹”即将冲进南海!\n\n9月14日17时其位于距我市1291公里的菲律宾以东洋面,中心风力17级以上(65米/秒,相当于234公里/小时),中心最低气压910百帕,将以30公里/时的速度向西北方向移动。 \n然而超强台风“山竹”虽然强大,也不是没有敌手。\n当它靠近南海的时候,庞大的副热带高压早已在此恭候多日,超强台风“山竹”将不可避免地与华南沿海的霸主副热带高压来一场正面“对抗”! \n预计“山竹”将于14日夜间横穿菲律宾吕宋岛北部山地,15日上午进入南海东北部海面,强度减弱,趋向粤西和海南东部沿海,16日夜间在上述地区以强台风或超强台风登陆,16日中午前后距我市最近200-300公里。\n不排除在阳江至茂名之间登陆、对深圳造成更大风雨影响的可能。 \n\n深圳市气象台已于2018年09月14日12时30分在全市发布台风白色预警,预计“山竹”将可能在48小时内影响我市,全市进入台风注意状态,遵照海事、渔政部门的防风指令或通知,做好避风准备。 \n \n风力预报:台风“山竹”7级大风圈半径将达到700公里左右!受台风“山竹”影响,15日后半夜我市风力逐渐加大,16日白天沿海和高地最大阵风11-13级,内陆8-11级,16日下半夜风力开始减弱。","source":"_posts/15级强台风山竹即将登陆广东.md","raw":"---\ntitle: 15级强台风山竹即将登陆广东\ntags:\n - 台风\n - 山竹\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 54465\ndate: 2018-09-15 19:42:12\n---\n\n鉴于其带来的巨大危害,2006年12月第39次世界气象组织台风委员会会议决定把台风“榴莲”除名!\n\n但是对水果执着热爱的泰国人民毅然决定用另一种水果给台风“榴莲”补位,补位的台风名称正是——“山竹”。 \n\n作为超强台风“榴莲”的补位者,“山竹”果然不辱前辈之名,早在9月11日08时就完成究极进化,成为超强台风! \n\n来了!超强台风“山竹”即将冲进南海!\n\n9月14日17时其位于距我市1291公里的菲律宾以东洋面,中心风力17级以上(65米/秒,相当于234公里/小时),中心最低气压910百帕,将以30公里/时的速度向西北方向移动。 \n然而超强台风“山竹”虽然强大,也不是没有敌手。\n当它靠近南海的时候,庞大的副热带高压早已在此恭候多日,超强台风“山竹”将不可避免地与华南沿海的霸主副热带高压来一场正面“对抗”! \n预计“山竹”将于14日夜间横穿菲律宾吕宋岛北部山地,15日上午进入南海东北部海面,强度减弱,趋向粤西和海南东部沿海,16日夜间在上述地区以强台风或超强台风登陆,16日中午前后距我市最近200-300公里。\n不排除在阳江至茂名之间登陆、对深圳造成更大风雨影响的可能。 \n\n深圳市气象台已于2018年09月14日12时30分在全市发布台风白色预警,预计“山竹”将可能在48小时内影响我市,全市进入台风注意状态,遵照海事、渔政部门的防风指令或通知,做好避风准备。 \n \n风力预报:台风“山竹”7级大风圈半径将达到700公里左右!受台风“山竹”影响,15日后半夜我市风力逐渐加大,16日白天沿海和高地最大阵风11-13级,内陆8-11级,16日下半夜风力开始减弱。","slug":"15级强台风山竹即将登陆广东","published":1,"updated":"2023-09-29T07:51:06.320Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyea0003oko05qum4gg0","content":"

鉴于其带来的巨大危害,2006年12月第39次世界气象组织台风委员会会议决定把台风“榴莲”除名!

\n

但是对水果执着热爱的泰国人民毅然决定用另一种水果给台风“榴莲”补位,补位的台风名称正是——“山竹”。

\n

作为超强台风“榴莲”的补位者,“山竹”果然不辱前辈之名,早在9月11日08时就完成究极进化,成为超强台风!

\n

来了!超强台风“山竹”即将冲进南海!

\n

9月14日17时其位于距我市1291公里的菲律宾以东洋面,中心风力17级以上(65米/秒,相当于234公里/小时),中心最低气压910百帕,将以30公里/时的速度向西北方向移动。
然而超强台风“山竹”虽然强大,也不是没有敌手。
当它靠近南海的时候,庞大的副热带高压早已在此恭候多日,超强台风“山竹”将不可避免地与华南沿海的霸主副热带高压来一场正面“对抗”!
预计“山竹”将于14日夜间横穿菲律宾吕宋岛北部山地,15日上午进入南海东北部海面,强度减弱,趋向粤西和海南东部沿海,16日夜间在上述地区以强台风或超强台风登陆,16日中午前后距我市最近200-300公里。
不排除在阳江至茂名之间登陆、对深圳造成更大风雨影响的可能。

\n

深圳市气象台已于2018年09月14日12时30分在全市发布台风白色预警,预计“山竹”将可能在48小时内影响我市,全市进入台风注意状态,遵照海事、渔政部门的防风指令或通知,做好避风准备。

\n

风力预报:台风“山竹”7级大风圈半径将达到700公里左右!受台风“山竹”影响,15日后半夜我市风力逐渐加大,16日白天沿海和高地最大阵风11-13级,内陆8-11级,16日下半夜风力开始减弱。

\n","site":{"data":{}},"more":"

鉴于其带来的巨大危害,2006年12月第39次世界气象组织台风委员会会议决定把台风“榴莲”除名!

\n

但是对水果执着热爱的泰国人民毅然决定用另一种水果给台风“榴莲”补位,补位的台风名称正是——“山竹”。

\n

作为超强台风“榴莲”的补位者,“山竹”果然不辱前辈之名,早在9月11日08时就完成究极进化,成为超强台风!

\n

来了!超强台风“山竹”即将冲进南海!

\n

9月14日17时其位于距我市1291公里的菲律宾以东洋面,中心风力17级以上(65米/秒,相当于234公里/小时),中心最低气压910百帕,将以30公里/时的速度向西北方向移动。
然而超强台风“山竹”虽然强大,也不是没有敌手。
当它靠近南海的时候,庞大的副热带高压早已在此恭候多日,超强台风“山竹”将不可避免地与华南沿海的霸主副热带高压来一场正面“对抗”!
预计“山竹”将于14日夜间横穿菲律宾吕宋岛北部山地,15日上午进入南海东北部海面,强度减弱,趋向粤西和海南东部沿海,16日夜间在上述地区以强台风或超强台风登陆,16日中午前后距我市最近200-300公里。
不排除在阳江至茂名之间登陆、对深圳造成更大风雨影响的可能。

\n

深圳市气象台已于2018年09月14日12时30分在全市发布台风白色预警,预计“山竹”将可能在48小时内影响我市,全市进入台风注意状态,遵照海事、渔政部门的防风指令或通知,做好避风准备。

\n

风力预报:台风“山竹”7级大风圈半径将达到700公里左右!受台风“山竹”影响,15日后半夜我市风力逐渐加大,16日白天沿海和高地最大阵风11-13级,内陆8-11级,16日下半夜风力开始减弱。

\n"},{"title":"2006-2016","excerpt":"","abbrlink":55116,"date":"2016-11-02T10:39:10.000Z","_content":"\n今天找phpwind5.3无意中看到了当年用过的那些论坛程序,ofstar,bbsxp,dvbbs,bbsgood,6kbbs,phpbb等等。 \n\n论坛毕竟没落了,SNS也是曾经也是引领过潮流的。\n\n忍不住登进那些曾经提问寻找答案的论坛,大部分ID注册的时间都在2006年。\n\n我上大二那年。 \n\n还有当年的sgcd. 在邮箱的网盘里找出了一份当年的备份,我在想要不要重新开始。 \n\n应该很难了,大部分的人都已经找不到了。 \n\n回想过去十年不胜唏嘘,这十年真的一事无成。\n\n除了还在联系的草莓,不知道谁还记得我。","source":"_posts/2006-2016.md","raw":"---\ntitle: 2006-2016\ntags:\n - 十年\n - 时光沉淀\n - 生活\n - 论坛\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 55116\ndate: 2016-11-02 18:39:10\n---\n\n今天找phpwind5.3无意中看到了当年用过的那些论坛程序,ofstar,bbsxp,dvbbs,bbsgood,6kbbs,phpbb等等。 \n\n论坛毕竟没落了,SNS也是曾经也是引领过潮流的。\n\n忍不住登进那些曾经提问寻找答案的论坛,大部分ID注册的时间都在2006年。\n\n我上大二那年。 \n\n还有当年的sgcd. 在邮箱的网盘里找出了一份当年的备份,我在想要不要重新开始。 \n\n应该很难了,大部分的人都已经找不到了。 \n\n回想过去十年不胜唏嘘,这十年真的一事无成。\n\n除了还在联系的草莓,不知道谁还记得我。","slug":"2006-2016","published":1,"updated":"2023-09-29T07:51:06.320Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyee0006oko07b6qfj4f","content":"

今天找phpwind5.3无意中看到了当年用过的那些论坛程序,ofstar,bbsxp,dvbbs,bbsgood,6kbbs,phpbb等等。

\n

论坛毕竟没落了,SNS也是曾经也是引领过潮流的。

\n

忍不住登进那些曾经提问寻找答案的论坛,大部分ID注册的时间都在2006年。

\n

我上大二那年。

\n

还有当年的sgcd. 在邮箱的网盘里找出了一份当年的备份,我在想要不要重新开始。

\n

应该很难了,大部分的人都已经找不到了。

\n

回想过去十年不胜唏嘘,这十年真的一事无成。

\n

除了还在联系的草莓,不知道谁还记得我。

\n","site":{"data":{}},"more":"

今天找phpwind5.3无意中看到了当年用过的那些论坛程序,ofstar,bbsxp,dvbbs,bbsgood,6kbbs,phpbb等等。

\n

论坛毕竟没落了,SNS也是曾经也是引领过潮流的。

\n

忍不住登进那些曾经提问寻找答案的论坛,大部分ID注册的时间都在2006年。

\n

我上大二那年。

\n

还有当年的sgcd. 在邮箱的网盘里找出了一份当年的备份,我在想要不要重新开始。

\n

应该很难了,大部分的人都已经找不到了。

\n

回想过去十年不胜唏嘘,这十年真的一事无成。

\n

除了还在联系的草莓,不知道谁还记得我。

\n"},{"title":"求婚大作战","published":1,"hideInList":false,"cover":"https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2391225472.jpg","isTop":false,"abbrlink":"eedcfe1c","date":"2017-06-05T13:57:00.000Z","_content":"\n\n> 《求婚大作战》(プロポーズ大作戦)是日本富士电视台于2007年4月16日至6月25日播出的爱情电视剧。由山下智久、长泽雅美主演。\n> 该剧讲述了主人公岩瀬健一直暗恋青梅竹马吉田礼却没能告白,在参加她婚礼之时,借助妖精之力回到过去来完成他告白之路的故事。\n> 2008年3月25日,推出特别篇《求婚大作战SP》。 2012年2月8日,由韩国TV朝鲜电视台推出翻拍版。\n> 2017年4月24日,由张艺兴、陈都灵等人主演中国大陆翻拍版。\n\n时隔十年,中国也翻拍了当时日本热播的电视剧《求婚大作战》,剧情和台词都神还原原版电视剧,中国版大概就是原版11集加上《求婚大作战SP》,再加上本土化自编的最后三集。\n改编的大概也只有各个角色的名字,以及妖精变成了天使。\n我看这部青春校园爱情题材的电视剧主要是因为很喜欢陈都灵。\n今天看完这最后三集,只能说其是狗尾续貂。男主没有向女主求婚也就罢了,竟然还穿越回了未来,这让整个故事的逻辑全线崩盘。\n我对此剧的解读原本以为是让我们追忆有亲情友情和爱情的青春,珍惜眼前的一切。穿越回过去是为了让自己成长改正自己的错误,\n没想到故事开展到了穿越未来我就懵逼啦,这未来所发生的一切让我对未来完全没有憧憬和希望啊。那穿越回未来的意义何在呢,与求婚完全没有关系。编剧大可直接让他们结婚然后打上大字“四十年后”不更好吗?\n这种开放式的结局设定我是拒绝的。男主和女主结婚,快快乐乐生活在一起不是一个很好的happy ending,又点题又有观众爱看,真无力吐槽后三集。\n![求婚大作战][1]\n![求婚大作战2][2]\nPS,我也看到很多弹幕评论说,男主这样是找不到对象的,等等诸如此类的话。\n其实这也可以算是本剧翻拍的一个BUG,要知道早在十年前可不像如今的风气如此开放,那时的男女谈恋爱连牵手都会感觉到害羞,相信当时像男主角这样的男生不在少数,所以我们这代人看这部剧才特别的代入感,并没有丝毫的违和感。\n相反现在的少男少女看这部剧的时候也就只是看出了男主角的内向胆怯\n![67de513bly1feudbcquv6j20rs0ijk8j.jpg][3]\n![67de513bly1feudbdovpbj20v90kue81.jpg][4]\n![67de513bly1feudbm64a8j21jk112x6p.jpg][5]\n![67de513bly1feudbnd1y6j232e21o1kz.jpg][6]\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/49406005.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2391225472.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1478383849.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2427022229.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1255852638.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/4189057228.jpg","source":"_posts/2017-06-05-marry.md","raw":"---\ntitle: 求婚大作战\ntags:\n - 求婚\n - 狗尾续貂\n - 求婚大作战\n - 张艺兴\n - 陈都灵\npublished: true\nhideInList: false\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2391225472.jpg'\nisTop: false\nabbrlink: eedcfe1c\ndate: 2017-06-05 21:57:00\n---\n\n\n> 《求婚大作战》(プロポーズ大作戦)是日本富士电视台于2007年4月16日至6月25日播出的爱情电视剧。由山下智久、长泽雅美主演。\n> 该剧讲述了主人公岩瀬健一直暗恋青梅竹马吉田礼却没能告白,在参加她婚礼之时,借助妖精之力回到过去来完成他告白之路的故事。\n> 2008年3月25日,推出特别篇《求婚大作战SP》。 2012年2月8日,由韩国TV朝鲜电视台推出翻拍版。\n> 2017年4月24日,由张艺兴、陈都灵等人主演中国大陆翻拍版。\n\n时隔十年,中国也翻拍了当时日本热播的电视剧《求婚大作战》,剧情和台词都神还原原版电视剧,中国版大概就是原版11集加上《求婚大作战SP》,再加上本土化自编的最后三集。\n改编的大概也只有各个角色的名字,以及妖精变成了天使。\n我看这部青春校园爱情题材的电视剧主要是因为很喜欢陈都灵。\n今天看完这最后三集,只能说其是狗尾续貂。男主没有向女主求婚也就罢了,竟然还穿越回了未来,这让整个故事的逻辑全线崩盘。\n我对此剧的解读原本以为是让我们追忆有亲情友情和爱情的青春,珍惜眼前的一切。穿越回过去是为了让自己成长改正自己的错误,\n没想到故事开展到了穿越未来我就懵逼啦,这未来所发生的一切让我对未来完全没有憧憬和希望啊。那穿越回未来的意义何在呢,与求婚完全没有关系。编剧大可直接让他们结婚然后打上大字“四十年后”不更好吗?\n这种开放式的结局设定我是拒绝的。男主和女主结婚,快快乐乐生活在一起不是一个很好的happy ending,又点题又有观众爱看,真无力吐槽后三集。\n![求婚大作战][1]\n![求婚大作战2][2]\nPS,我也看到很多弹幕评论说,男主这样是找不到对象的,等等诸如此类的话。\n其实这也可以算是本剧翻拍的一个BUG,要知道早在十年前可不像如今的风气如此开放,那时的男女谈恋爱连牵手都会感觉到害羞,相信当时像男主角这样的男生不在少数,所以我们这代人看这部剧才特别的代入感,并没有丝毫的违和感。\n相反现在的少男少女看这部剧的时候也就只是看出了男主角的内向胆怯\n![67de513bly1feudbcquv6j20rs0ijk8j.jpg][3]\n![67de513bly1feudbdovpbj20v90kue81.jpg][4]\n![67de513bly1feudbm64a8j21jk112x6p.jpg][5]\n![67de513bly1feudbnd1y6j232e21o1kz.jpg][6]\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/49406005.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2391225472.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1478383849.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2427022229.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1255852638.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/4189057228.jpg","slug":"2017-06-05-marry","updated":"2023-09-29T07:51:06.321Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyeg0009oko0gp7e41ho","content":"
\n

《求婚大作战》(プロポーズ大作戦)是日本富士电视台于2007年4月16日至6月25日播出的爱情电视剧。由山下智久、长泽雅美主演。
该剧讲述了主人公岩瀬健一直暗恋青梅竹马吉田礼却没能告白,在参加她婚礼之时,借助妖精之力回到过去来完成他告白之路的故事。
2008年3月25日,推出特别篇《求婚大作战SP》。 2012年2月8日,由韩国TV朝鲜电视台推出翻拍版。
2017年4月24日,由张艺兴、陈都灵等人主演中国大陆翻拍版。

\n
\n

时隔十年,中国也翻拍了当时日本热播的电视剧《求婚大作战》,剧情和台词都神还原原版电视剧,中国版大概就是原版11集加上《求婚大作战SP》,再加上本土化自编的最后三集。
改编的大概也只有各个角色的名字,以及妖精变成了天使。
我看这部青春校园爱情题材的电视剧主要是因为很喜欢陈都灵。
今天看完这最后三集,只能说其是狗尾续貂。男主没有向女主求婚也就罢了,竟然还穿越回了未来,这让整个故事的逻辑全线崩盘。
我对此剧的解读原本以为是让我们追忆有亲情友情和爱情的青春,珍惜眼前的一切。穿越回过去是为了让自己成长改正自己的错误,
没想到故事开展到了穿越未来我就懵逼啦,这未来所发生的一切让我对未来完全没有憧憬和希望啊。那穿越回未来的意义何在呢,与求婚完全没有关系。编剧大可直接让他们结婚然后打上大字“四十年后”不更好吗?
这种开放式的结局设定我是拒绝的。男主和女主结婚,快快乐乐生活在一起不是一个很好的happy ending,又点题又有观众爱看,真无力吐槽后三集。
\"求婚大作战\"
\"求婚大作战2\"
PS,我也看到很多弹幕评论说,男主这样是找不到对象的,等等诸如此类的话。
其实这也可以算是本剧翻拍的一个BUG,要知道早在十年前可不像如今的风气如此开放,那时的男女谈恋爱连牵手都会感觉到害羞,相信当时像男主角这样的男生不在少数,所以我们这代人看这部剧才特别的代入感,并没有丝毫的违和感。
相反现在的少男少女看这部剧的时候也就只是看出了男主角的内向胆怯
\"67de513bly1feudbcquv6j20rs0ijk8j.jpg\"
\"67de513bly1feudbdovpbj20v90kue81.jpg\"
\"67de513bly1feudbm64a8j21jk112x6p.jpg\"
\"67de513bly1feudbnd1y6j232e21o1kz.jpg\"

\n","site":{"data":{}},"excerpt":"","more":"
\n

《求婚大作战》(プロポーズ大作戦)是日本富士电视台于2007年4月16日至6月25日播出的爱情电视剧。由山下智久、长泽雅美主演。
该剧讲述了主人公岩瀬健一直暗恋青梅竹马吉田礼却没能告白,在参加她婚礼之时,借助妖精之力回到过去来完成他告白之路的故事。
2008年3月25日,推出特别篇《求婚大作战SP》。 2012年2月8日,由韩国TV朝鲜电视台推出翻拍版。
2017年4月24日,由张艺兴、陈都灵等人主演中国大陆翻拍版。

\n
\n

时隔十年,中国也翻拍了当时日本热播的电视剧《求婚大作战》,剧情和台词都神还原原版电视剧,中国版大概就是原版11集加上《求婚大作战SP》,再加上本土化自编的最后三集。
改编的大概也只有各个角色的名字,以及妖精变成了天使。
我看这部青春校园爱情题材的电视剧主要是因为很喜欢陈都灵。
今天看完这最后三集,只能说其是狗尾续貂。男主没有向女主求婚也就罢了,竟然还穿越回了未来,这让整个故事的逻辑全线崩盘。
我对此剧的解读原本以为是让我们追忆有亲情友情和爱情的青春,珍惜眼前的一切。穿越回过去是为了让自己成长改正自己的错误,
没想到故事开展到了穿越未来我就懵逼啦,这未来所发生的一切让我对未来完全没有憧憬和希望啊。那穿越回未来的意义何在呢,与求婚完全没有关系。编剧大可直接让他们结婚然后打上大字“四十年后”不更好吗?
这种开放式的结局设定我是拒绝的。男主和女主结婚,快快乐乐生活在一起不是一个很好的happy ending,又点题又有观众爱看,真无力吐槽后三集。
\"求婚大作战\"
\"求婚大作战2\"
PS,我也看到很多弹幕评论说,男主这样是找不到对象的,等等诸如此类的话。
其实这也可以算是本剧翻拍的一个BUG,要知道早在十年前可不像如今的风气如此开放,那时的男女谈恋爱连牵手都会感觉到害羞,相信当时像男主角这样的男生不在少数,所以我们这代人看这部剧才特别的代入感,并没有丝毫的违和感。
相反现在的少男少女看这部剧的时候也就只是看出了男主角的内向胆怯
\"67de513bly1feudbcquv6j20rs0ijk8j.jpg\"
\"67de513bly1feudbdovpbj20v90kue81.jpg\"
\"67de513bly1feudbm64a8j21jk112x6p.jpg\"
\"67de513bly1feudbnd1y6j232e21o1kz.jpg\"

\n"},{"title":"杀不死","published":1,"cover":"https://xy07-1251893119.costj.myqcloud.com/2017/08/17/3339139527.jpg","isTop":false,"abbrlink":"cb92d708","date":"2017-08-17T06:14:00.000Z","_content":"\n\n昨天看完了一部网剧<杀不死>.觉得异常精彩.迫不及待要推荐一发.\n\n> 《杀不死》是由河北优映文化传播有限公司、上海见独影视有限公司联合出品的悬疑类网剧,由李洪绸、邢冬冬执导,杨羽、安宁、邵庄等主演。\n\n以上来自百度百科.\n\n虽然这部剧很早就在腾讯开播了.但是由于之前没什么时间.<-因为沉迷网游.>\n昨天突然的就发现了这部剧.据说是豆瓣高分剧<毛骗>的原班人马.\n故事的开头是监控里的金店抢劫案.可镜头一转就画风就转变成了 老实木讷的主角因为喜欢一个女孩被损友教唆偷女孩钱包制造邂逅机会.结果卷入了离奇的事件里.杀人,埋尸,火拼,逃亡.各种翻转剧情让人欲罢不能.\n\n![杀不死剧照][1]\n\n在看这部剧的时候我就在想 ,如果<杀不死>这是部电影, 按目前每集30分钟共12集,大概有3个小时通过各种剪辑,大约也是可以实现的.\n每集的开头都会用另外一个视角来讲述另外一个故事,解开案情的一部分.如果拍成电影应该就不会有这样的效果了.\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/08/17/3339139527.jpg","source":"_posts/2017-08-17-shabusi.md","raw":"---\ntitle: 杀不死\ntags:\n - 网剧\n - 开头\n - 邵庄\npublished: true\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2017/08/17/3339139527.jpg'\nisTop: false\nabbrlink: cb92d708\ndate: 2017-08-17 14:14:00\n---\n\n\n昨天看完了一部网剧<杀不死>.觉得异常精彩.迫不及待要推荐一发.\n\n> 《杀不死》是由河北优映文化传播有限公司、上海见独影视有限公司联合出品的悬疑类网剧,由李洪绸、邢冬冬执导,杨羽、安宁、邵庄等主演。\n\n以上来自百度百科.\n\n虽然这部剧很早就在腾讯开播了.但是由于之前没什么时间.<-因为沉迷网游.>\n昨天突然的就发现了这部剧.据说是豆瓣高分剧<毛骗>的原班人马.\n故事的开头是监控里的金店抢劫案.可镜头一转就画风就转变成了 老实木讷的主角因为喜欢一个女孩被损友教唆偷女孩钱包制造邂逅机会.结果卷入了离奇的事件里.杀人,埋尸,火拼,逃亡.各种翻转剧情让人欲罢不能.\n\n![杀不死剧照][1]\n\n在看这部剧的时候我就在想 ,如果<杀不死>这是部电影, 按目前每集30分钟共12集,大概有3个小时通过各种剪辑,大约也是可以实现的.\n每集的开头都会用另外一个视角来讲述另外一个故事,解开案情的一部分.如果拍成电影应该就不会有这样的效果了.\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/08/17/3339139527.jpg","slug":"2017-08-17-shabusi","updated":"2023-09-29T07:51:06.331Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyeh000boko0az3mcwjb","content":"

昨天看完了一部网剧<杀不死>.觉得异常精彩.迫不及待要推荐一发.

\n
\n

《杀不死》是由河北优映文化传播有限公司、上海见独影视有限公司联合出品的悬疑类网剧,由李洪绸、邢冬冬执导,杨羽、安宁、邵庄等主演。

\n
\n

以上来自百度百科.

\n

虽然这部剧很早就在腾讯开播了.但是由于之前没什么时间.<-因为沉迷网游.>
昨天突然的就发现了这部剧.据说是豆瓣高分剧<毛骗>的原班人马.
故事的开头是监控里的金店抢劫案.可镜头一转就画风就转变成了 老实木讷的主角因为喜欢一个女孩被损友教唆偷女孩钱包制造邂逅机会.结果卷入了离奇的事件里.杀人,埋尸,火拼,逃亡.各种翻转剧情让人欲罢不能.

\n

\"杀不死剧照\"

\n

在看这部剧的时候我就在想 ,如果<杀不死>这是部电影, 按目前每集30分钟共12集,大概有3个小时通过各种剪辑,大约也是可以实现的.
每集的开头都会用另外一个视角来讲述另外一个故事,解开案情的一部分.如果拍成电影应该就不会有这样的效果了.

\n","site":{"data":{}},"excerpt":"","more":"

昨天看完了一部网剧<杀不死>.觉得异常精彩.迫不及待要推荐一发.

\n
\n

《杀不死》是由河北优映文化传播有限公司、上海见独影视有限公司联合出品的悬疑类网剧,由李洪绸、邢冬冬执导,杨羽、安宁、邵庄等主演。

\n
\n

以上来自百度百科.

\n

虽然这部剧很早就在腾讯开播了.但是由于之前没什么时间.<-因为沉迷网游.>
昨天突然的就发现了这部剧.据说是豆瓣高分剧<毛骗>的原班人马.
故事的开头是监控里的金店抢劫案.可镜头一转就画风就转变成了 老实木讷的主角因为喜欢一个女孩被损友教唆偷女孩钱包制造邂逅机会.结果卷入了离奇的事件里.杀人,埋尸,火拼,逃亡.各种翻转剧情让人欲罢不能.

\n

\"杀不死剧照\"

\n

在看这部剧的时候我就在想 ,如果<杀不死>这是部电影, 按目前每集30分钟共12集,大概有3个小时通过各种剪辑,大约也是可以实现的.
每集的开头都会用另外一个视角来讲述另外一个故事,解开案情的一部分.如果拍成电影应该就不会有这样的效果了.

\n"},{"title":"珠海的早晨","published":1,"cover":"https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1164475938.jpg","isTop":false,"abbrlink":"b93101ab","date":"2017-12-02T02:17:00.000Z","_content":"\n\n![IMG_20171202_080746.jpg][1]\n![IMG_20171202_080736.jpg][2]\n![IMG_20171202_080729.jpg][3]\n![IMG_20171202_080724.jpg][4]\n![IMG_20171202_080715.jpg][5]\n![IMG_20171202_080729.jpg][6]\n拍摄工具 红米note4x\n地点 珠海官塘附近\n时间 早上8点左右\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1164475938.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/3427552576.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/2498459590.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/3992954104.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1177421658.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/2498459590.jpg","source":"_posts/2017-12-02-zhuhai.md","raw":"---\ntitle: 珠海的早晨\ntags:\n - 珠海\n - 官塘\n - note4x\n - 红米\npublished: true\ncategories: 随笔\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1164475938.jpg'\nisTop: false\nabbrlink: b93101ab\ndate: 2017-12-02 10:17:00\n---\n\n\n![IMG_20171202_080746.jpg][1]\n![IMG_20171202_080736.jpg][2]\n![IMG_20171202_080729.jpg][3]\n![IMG_20171202_080724.jpg][4]\n![IMG_20171202_080715.jpg][5]\n![IMG_20171202_080729.jpg][6]\n拍摄工具 红米note4x\n地点 珠海官塘附近\n时间 早上8点左右\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1164475938.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/3427552576.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/2498459590.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/3992954104.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1177421658.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/2498459590.jpg","slug":"2017-12-02-zhuhai","updated":"2023-09-29T07:51:06.331Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyei000goko09d2y8wcc","content":"

\"IMG_20171202_080746.jpg\"
\"IMG_20171202_080736.jpg\"
\"IMG_20171202_080729.jpg\"
\"IMG_20171202_080724.jpg\"
\"IMG_20171202_080715.jpg\"
\"IMG_20171202_080729.jpg\"
拍摄工具 红米note4x
地点 珠海官塘附近
时间 早上8点左右

\n","site":{"data":{}},"excerpt":"","more":"

\"IMG_20171202_080746.jpg\"
\"IMG_20171202_080736.jpg\"
\"IMG_20171202_080729.jpg\"
\"IMG_20171202_080724.jpg\"
\"IMG_20171202_080715.jpg\"
\"IMG_20171202_080729.jpg\"
拍摄工具 红米note4x
地点 珠海官塘附近
时间 早上8点左右

\n"},{"title":"神雕侠侣其实是一部伦理小说","published":1,"cover":"https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3504502827.jpg","isTop":false,"abbrlink":"29c199b6","date":"2018-04-17T04:10:00.000Z","_content":"\n\n神雕侠侣是金庸先生最让人耳熟能详的作品\n因为其影视剧作品之多从小说完稿到如今为金庸小说之最\n![1.jpg][1]\n![2.jpg][2]\n![3.jpg][3]\n![4.jpg][4]\n![5.jpg][5]\n![6.jpg][6]\n![7.jpg][7]\n![8.jpg][8]\n![9.jpg][9]\n![10.jpg][10]\n为什么说是一部伦理小说?\n小说里面描写最详细最让人动容的莫过于杨过与小龙女的旷世奇恋。\n其中掺杂了各种推动故事发展的支线情节\n如武三通对养女何沅君有了男女之情并在何沅君与陆展元的婚宴上大闹了一场。\n这养父与养女岂不是乱了伦常?\n相比杨过小龙女的师生恋也不遑多让啊\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3504502827.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1428312911.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/517559975.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/4166098573.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1867717429.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3210080396.jpg\n [7]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1172281141.jpg\n [8]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3540444016.jpg\n [9]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/54048185.jpg\n [10]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1573748691.jpg","source":"_posts/2018-04-17-shendiao.md","raw":"---\ntitle: 神雕侠侣其实是一部伦理小说\ntags:\n - 神雕\n - 金庸\n - 影视剧\n - 作品\n - 完稿\n - 小说\n - 旷世奇恋\n - 养女\n - 何沅君\n - 小龙女\n - 杨过\npublished: true\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3504502827.jpg'\nisTop: false\nabbrlink: 29c199b6\ndate: 2018-04-17 12:10:00\n---\n\n\n神雕侠侣是金庸先生最让人耳熟能详的作品\n因为其影视剧作品之多从小说完稿到如今为金庸小说之最\n![1.jpg][1]\n![2.jpg][2]\n![3.jpg][3]\n![4.jpg][4]\n![5.jpg][5]\n![6.jpg][6]\n![7.jpg][7]\n![8.jpg][8]\n![9.jpg][9]\n![10.jpg][10]\n为什么说是一部伦理小说?\n小说里面描写最详细最让人动容的莫过于杨过与小龙女的旷世奇恋。\n其中掺杂了各种推动故事发展的支线情节\n如武三通对养女何沅君有了男女之情并在何沅君与陆展元的婚宴上大闹了一场。\n这养父与养女岂不是乱了伦常?\n相比杨过小龙女的师生恋也不遑多让啊\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3504502827.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1428312911.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/517559975.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/4166098573.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1867717429.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3210080396.jpg\n [7]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1172281141.jpg\n [8]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3540444016.jpg\n [9]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/54048185.jpg\n [10]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1573748691.jpg","slug":"2018-04-17-shendiao","updated":"2023-09-29T07:51:06.331Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyej000hoko0hi7u43ug","content":"

神雕侠侣是金庸先生最让人耳熟能详的作品
因为其影视剧作品之多从小说完稿到如今为金庸小说之最
\"1.jpg\"
\"2.jpg\"
\"3.jpg\"
\"4.jpg\"
\"5.jpg\"
\"6.jpg\"
\"7.jpg\"
\"8.jpg\"
\"9.jpg\"
\"10.jpg\"
为什么说是一部伦理小说?
小说里面描写最详细最让人动容的莫过于杨过与小龙女的旷世奇恋。
其中掺杂了各种推动故事发展的支线情节
如武三通对养女何沅君有了男女之情并在何沅君与陆展元的婚宴上大闹了一场。
这养父与养女岂不是乱了伦常?
相比杨过小龙女的师生恋也不遑多让啊

\n","site":{"data":{}},"excerpt":"","more":"

神雕侠侣是金庸先生最让人耳熟能详的作品
因为其影视剧作品之多从小说完稿到如今为金庸小说之最
\"1.jpg\"
\"2.jpg\"
\"3.jpg\"
\"4.jpg\"
\"5.jpg\"
\"6.jpg\"
\"7.jpg\"
\"8.jpg\"
\"9.jpg\"
\"10.jpg\"
为什么说是一部伦理小说?
小说里面描写最详细最让人动容的莫过于杨过与小龙女的旷世奇恋。
其中掺杂了各种推动故事发展的支线情节
如武三通对养女何沅君有了男女之情并在何沅君与陆展元的婚宴上大闹了一场。
这养父与养女岂不是乱了伦常?
相比杨过小龙女的师生恋也不遑多让啊

\n"},{"abbrlink":"317afbc8","date":"2018-05-04T15:28:00.000Z","excerpt":"...","published":1,"title":"linux下一键搭建SS","updated":"2023-09-29T07:51:06.331Z","_content":"事实上Ubuntu centos都可以使用此命令行\n\n```bash\n wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh\n```\n\n```bash\nchmod +x shadowsocks.sh \n```\n\n```bash\n ./shadowsocks.sh 2>&1 | tee shadowsocks.log\n```\n","source":"_posts/2018-05-04-linux-SS.md","raw":"---\nabbrlink: 317afbc8\ncategories: 分享\ndate: '2018-05-04 23:28:00'\nexcerpt: ...\npublished: true\ntags:\n - wget\n - shadowsocks\ntitle: linux下一键搭建SS\nupdated: '2023-6-12T10:13:20.738+8:0'\n---\n事实上Ubuntu centos都可以使用此命令行\n\n```bash\n wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh\n```\n\n```bash\nchmod +x shadowsocks.sh \n```\n\n```bash\n ./shadowsocks.sh 2>&1 | tee shadowsocks.log\n```\n","slug":"2018-05-04-linux-SS","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyel000koko0dnjgcbcx","content":"

事实上Ubuntu centos都可以使用此命令行

\n
1
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
\n\n
1
chmod +x shadowsocks.sh 
\n\n
1
./shadowsocks.sh 2>&1 | tee shadowsocks.log
\n","site":{"data":{}},"more":"

事实上Ubuntu centos都可以使用此命令行

\n
1
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
\n\n
1
chmod +x shadowsocks.sh 
\n\n
1
./shadowsocks.sh 2>&1 | tee shadowsocks.log
\n"},{"abbrlink":"341ac1e6","cover":"https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg","date":"2017-06-26T03:18:00.000Z","excerpt":"图片无压缩 生产工具:小米5 拍摄地点:华发商都 ","published":1,"title":"珠海 阴雨天 华发商都","updated":"2023-04-13T02:51:36.000Z","_content":"图片无压缩\n\n![珠海,华发商都][1]\n![珠海,阴雨天][2]\n![IMG_20170620_190831.jpg][3]\n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg\n[2]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/2565782733.jpg\n[3]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg\n生产工具:小米5\n拍摄地点:华发商都\n","source":"_posts/2017-06-26-zhuhai.md","raw":"---\nabbrlink: 341ac1e6\ncategories: 随笔\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg'\ndate: '2017-06-26 11:18:00'\nexcerpt: '图片无压缩 生产工具:小米5 拍摄地点:华发商都 '\npublished: true\ntags:\n - 珠海\n - 阴雨天\ntitle: 珠海 阴雨天 华发商都\nupdated: 'Thu, 13 Apr 2023 02:51:36 GMT'\n---\n图片无压缩\n\n![珠海,华发商都][1]\n![珠海,阴雨天][2]\n![IMG_20170620_190831.jpg][3]\n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg\n[2]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/2565782733.jpg\n[3]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg\n生产工具:小米5\n拍摄地点:华发商都\n","slug":"2017-06-26-zhuhai","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyem000moko09tf4dkmc","content":"

图片无压缩

\n

\"珠海,华发商都\"
\"珠海,阴雨天\"
\"IMG_20170620_190831.jpg\"

\n

生产工具:小米5
拍摄地点:华发商都

\n","site":{"data":{}},"more":"

图片无压缩

\n

\"珠海,华发商都\"
\"珠海,阴雨天\"
\"IMG_20170620_190831.jpg\"

\n

生产工具:小米5
拍摄地点:华发商都

\n"},{"title":"小绵羊SNH48许杨玉琢","published":1,"cover":"https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3465507018.jpg","isTop":false,"abbrlink":"314a5df4","date":"2019-01-12T14:37:00.000Z","_content":"\n\n![1be5a3defcfbb3e567770ea0cab752ba.jpg][1]\n\n![6af03caac4266a78f02157930a86deb3.jpg][2]\n\n![100a9aef4058a196185c08936a70f7d1.jpg][3]\n\n![246731d2c6706398a4a90646da269338.jpg][4]\n\n![443599be442e86721aefbac4b1f7fc56.jpg][5]\n\n小绵羊\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3465507018.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3541783328.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1743307606.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/240276552.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3585870581.jpg","source":"_posts/2019-01-12-SNH48-xuyang.md","raw":"---\ntitle: 小绵羊SNH48许杨玉琢\ntags:\n - 绵羊\n - SNH48\npublished: true\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3465507018.jpg'\nisTop: false\nabbrlink: 314a5df4\ndate: 2019-01-12 22:37:00\n---\n\n\n![1be5a3defcfbb3e567770ea0cab752ba.jpg][1]\n\n![6af03caac4266a78f02157930a86deb3.jpg][2]\n\n![100a9aef4058a196185c08936a70f7d1.jpg][3]\n\n![246731d2c6706398a4a90646da269338.jpg][4]\n\n![443599be442e86721aefbac4b1f7fc56.jpg][5]\n\n小绵羊\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3465507018.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3541783328.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1743307606.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/240276552.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3585870581.jpg","slug":"2019-01-12-SNH48-xuyang","updated":"2023-09-29T07:51:06.332Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyen000qoko02wqif5zw","content":"

\"1be5a3defcfbb3e567770ea0cab752ba.jpg\"

\n

\"6af03caac4266a78f02157930a86deb3.jpg\"

\n

\"100a9aef4058a196185c08936a70f7d1.jpg\"

\n

\"246731d2c6706398a4a90646da269338.jpg\"

\n

\"443599be442e86721aefbac4b1f7fc56.jpg\"

\n

小绵羊

\n","site":{"data":{}},"excerpt":"","more":"

\"1be5a3defcfbb3e567770ea0cab752ba.jpg\"

\n

\"6af03caac4266a78f02157930a86deb3.jpg\"

\n

\"100a9aef4058a196185c08936a70f7d1.jpg\"

\n

\"246731d2c6706398a4a90646da269338.jpg\"

\n

\"443599be442e86721aefbac4b1f7fc56.jpg\"

\n

小绵羊

\n"},{"title":"英雄联盟全球总决赛淘汰赛之后","published":1,"hideInList":false,"isTop":false,"abbrlink":"e73c603a","date":"2018-10-21T12:26:10.000Z","_content":"\n\n昨天一开始,IG便战胜了号称宇宙超级无敌战舰的KT。打破了无敌神话。\n让我对RNG的比赛更加充满信息。\n结果让人大跌眼镜。\nG2以3:2战胜了我心中的夺冠对象RNG。\n虽然我没有完整看完一场比赛。\n但是我仍然关注这场比赛。\n五年了。\n我从S3便一直关注着皇族。期望他夺冠。\n一年又一年。,今年的他们气势如虹拿下了各大赛事的冠军。几乎所有人都认为这是最有希望的一年。结果却差强人意。\n\n我相信会有人指责他们。\n但是我更想鼓励他们。\n既然已经输了。\n就不要把输的借口放在已经无法挽回的假如上去。\n\n今天的比赛EDG输给了FNC。\n经历了昨天的失落反而对今天的结果看淡了许多。\n\n可能我们一直以为LCK很强大。一直引进外援。把LCK当作假想敌。忽视了其他的对手。LCS他们同样强大且一直在成长。今天的结果便是为了告诉我们要尊重对手,谁都不能被轻视。\n\n原本我会见到小组第二干翻小组第一的。结果很遗憾。\n","source":"_posts/2018-10-21-lol-s8.md","raw":"---\ntitle: 英雄联盟全球总决赛淘汰赛之后\ntags:\n - rng\n - LOL\n - S8\n - 英雄联盟\n - 拳头\npublished: true\nhideInList: false\ncategories: 随笔\nisTop: false\nabbrlink: e73c603a\ndate: 2018-10-21 20:26:10\n---\n\n\n昨天一开始,IG便战胜了号称宇宙超级无敌战舰的KT。打破了无敌神话。\n让我对RNG的比赛更加充满信息。\n结果让人大跌眼镜。\nG2以3:2战胜了我心中的夺冠对象RNG。\n虽然我没有完整看完一场比赛。\n但是我仍然关注这场比赛。\n五年了。\n我从S3便一直关注着皇族。期望他夺冠。\n一年又一年。,今年的他们气势如虹拿下了各大赛事的冠军。几乎所有人都认为这是最有希望的一年。结果却差强人意。\n\n我相信会有人指责他们。\n但是我更想鼓励他们。\n既然已经输了。\n就不要把输的借口放在已经无法挽回的假如上去。\n\n今天的比赛EDG输给了FNC。\n经历了昨天的失落反而对今天的结果看淡了许多。\n\n可能我们一直以为LCK很强大。一直引进外援。把LCK当作假想敌。忽视了其他的对手。LCS他们同样强大且一直在成长。今天的结果便是为了告诉我们要尊重对手,谁都不能被轻视。\n\n原本我会见到小组第二干翻小组第一的。结果很遗憾。\n","slug":"2018-10-21-lol-s8","updated":"2023-09-29T07:51:06.332Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyeo000soko05gkyaby7","content":"

昨天一开始,IG便战胜了号称宇宙超级无敌战舰的KT。打破了无敌神话。
让我对RNG的比赛更加充满信息。
结果让人大跌眼镜。
G2以3:2战胜了我心中的夺冠对象RNG。
虽然我没有完整看完一场比赛。
但是我仍然关注这场比赛。
五年了。
我从S3便一直关注着皇族。期望他夺冠。
一年又一年。,今年的他们气势如虹拿下了各大赛事的冠军。几乎所有人都认为这是最有希望的一年。结果却差强人意。

\n

我相信会有人指责他们。
但是我更想鼓励他们。
既然已经输了。
就不要把输的借口放在已经无法挽回的假如上去。

\n

今天的比赛EDG输给了FNC。
经历了昨天的失落反而对今天的结果看淡了许多。

\n

可能我们一直以为LCK很强大。一直引进外援。把LCK当作假想敌。忽视了其他的对手。LCS他们同样强大且一直在成长。今天的结果便是为了告诉我们要尊重对手,谁都不能被轻视。

\n

原本我会见到小组第二干翻小组第一的。结果很遗憾。

\n","site":{"data":{}},"excerpt":"","more":"

昨天一开始,IG便战胜了号称宇宙超级无敌战舰的KT。打破了无敌神话。
让我对RNG的比赛更加充满信息。
结果让人大跌眼镜。
G2以3:2战胜了我心中的夺冠对象RNG。
虽然我没有完整看完一场比赛。
但是我仍然关注这场比赛。
五年了。
我从S3便一直关注着皇族。期望他夺冠。
一年又一年。,今年的他们气势如虹拿下了各大赛事的冠军。几乎所有人都认为这是最有希望的一年。结果却差强人意。

\n

我相信会有人指责他们。
但是我更想鼓励他们。
既然已经输了。
就不要把输的借口放在已经无法挽回的假如上去。

\n

今天的比赛EDG输给了FNC。
经历了昨天的失落反而对今天的结果看淡了许多。

\n

可能我们一直以为LCK很强大。一直引进外援。把LCK当作假想敌。忽视了其他的对手。LCS他们同样强大且一直在成长。今天的结果便是为了告诉我们要尊重对手,谁都不能被轻视。

\n

原本我会见到小组第二干翻小组第一的。结果很遗憾。

\n"},{"layout":"post","cid":204,"title":"父亲节快乐","slug":"2019-06-17-父亲节快乐","date":"2019-06-17T11:13:04.000Z","updated":"2019-06-17T11:22:06.000Z","status":"publish","author":"老孙","abbrlink":53678,"_content":"\n\n我知道今天来说会有点迟了\n但是今天中午突然看到别人的父亲节有点感慨\n在我读书的时候我很少给家里打电话\n那时每当钱要花完的时候才会想起打电话回去给我的父亲\n现在想想真是不太懂事\n因为那时家里的经济状况并不好\n回想起自己曾经的所作所为甚是惭愧\n此生怕是无以为报\n以后一定要多关心一下日渐老迈的父亲\n从打个电话开始吧\n\n在此祝愿我的老父亲,父亲节快乐","source":"_posts/2019-06-17-父亲节快乐.md","raw":"---\nlayout: post\ncid: 204\ntitle: 父亲节快乐\nslug: happy-fathers-day\ndate: '2019/06/17 19:13:04'\nupdated: '2019/06/17 19:22:06'\nstatus: publish\nauthor: 老孙\ncategories: 随笔\ntags:\n - 父亲节\nabbrlink: 53678\n---\n\n\n我知道今天来说会有点迟了\n但是今天中午突然看到别人的父亲节有点感慨\n在我读书的时候我很少给家里打电话\n那时每当钱要花完的时候才会想起打电话回去给我的父亲\n现在想想真是不太懂事\n因为那时家里的经济状况并不好\n回想起自己曾经的所作所为甚是惭愧\n此生怕是无以为报\n以后一定要多关心一下日渐老迈的父亲\n从打个电话开始吧\n\n在此祝愿我的老父亲,父亲节快乐","published":1,"comments":1,"photos":[],"link":"","_id":"cln4obyep000woko07djvfgw8","content":"

我知道今天来说会有点迟了
但是今天中午突然看到别人的父亲节有点感慨
在我读书的时候我很少给家里打电话
那时每当钱要花完的时候才会想起打电话回去给我的父亲
现在想想真是不太懂事
因为那时家里的经济状况并不好
回想起自己曾经的所作所为甚是惭愧
此生怕是无以为报
以后一定要多关心一下日渐老迈的父亲
从打个电话开始吧

\n

在此祝愿我的老父亲,父亲节快乐

\n","site":{"data":{}},"excerpt":"","more":"

我知道今天来说会有点迟了
但是今天中午突然看到别人的父亲节有点感慨
在我读书的时候我很少给家里打电话
那时每当钱要花完的时候才会想起打电话回去给我的父亲
现在想想真是不太懂事
因为那时家里的经济状况并不好
回想起自己曾经的所作所为甚是惭愧
此生怕是无以为报
以后一定要多关心一下日渐老迈的父亲
从打个电话开始吧

\n

在此祝愿我的老父亲,父亲节快乐

\n"},{"title":"新版《倚天屠龙记》演员颜值在线 深扒众小花旦","published":1,"hideInList":false,"cover":"https://xy07-1251893119.costj.myqcloud.com/2019/03/03/165964777.jpg","abbrlink":"85322f98","date":"2019-03-03T07:34:00.000Z","_content":"\n\n金庸先生的射雕三部曲是至今被翻拍最多的作品了\n其中《倚天屠龙记》自我从小至今看了5个版本\n分别是咆哮教主马景涛版张无忌,李连杰版张无忌,吴启华版,苏有朋版,邓超版。\n新版最让人期待的点就是当年在马景涛版倚天中饰演周芷若的周海媚在新版中饰演了灭绝师太。\n\n> 电视剧新版《倚天屠龙记》开播就遭遇大量吐槽,这并不意外。当初李亚鹏、周迅演的《射雕英雄传》,也被那些“83版射雕”爱好者揶揄很久,但是这两年有很多网友开始怀念李亚鹏版的“射雕”了,这是新的一代人的记忆,而他们也到了怀旧的年纪了。\n> \n> 这并不是说网友的吐槽都是“怀旧病”导致的。新版《倚天屠龙记》也有一些真正的问题,比如被网友推上热搜的“慢动作”就是一例。该剧的武打环节,大量使用慢动作,在空中飞的镜头让人想起纪录片中飞行的鸟类。大量慢镜头的使用,甚至影响到剧情的推进,武打本来是要让人激动,现在却成了难得的休息眼睛的时候。\n![杨逍][1]\n> 新版的杨逍与纪晓芙的感情线相对比较饱满。\n新版《倚天屠龙记》播出后虽然被吐槽“慢动作太多”,影响观赏体验,但戏中演员的演技却颇具看点,而花旦们的颜值更非常抢眼\n\n1.赵敏 扮演者 陈钰琪\n------------\n\n出生日期:1992.7.29\n![赵敏 扮演者 陈钰琪][2]\n陈钰琪是唐嫣旗下力捧的90后花旦,凭借《锦绣未央》中的九公主和《香蜜沉沉烬如霜》里的魔界公主鎏英成名,清新亮丽的外形和可圈可点的演技,令她成为近两年颇具瞩目的小鲜花。\n![陈钰琪][3]\n在《倚天屠龙记》里,她饰演女一号美艳不可方物,且古灵精怪的赵敏,然而由于该剧版本太多,更有黎姿、贾静雯等珠玉在前,导致她很难得到观众的称赞。\n\n2.周芷若 扮演者 祝绪丹\n-------------\n\n出生日期:1992.4.15\n![周芷若 扮演者 祝绪丹][4]\n祝绪丹出道后以《三生三世十里桃花》《谈判官》《一千零一夜》等剧受到关注,修长的身材和甜美的外形,以及细腻的表演圈粉无数。\n![祝绪丹][5]\n她在戏中饰演周芷若,94版《倚天》的“周芷若”周海媚则扮演她的师傅灭绝师太,众所周知,她是杨幂旗下艺人,跟唐嫣旗下扮演赵敏的陈钰琪同龄,两人戏中是对手,戏外也因各自老板的微妙关系带有PK的味道。\n\n3.殷离 扮演者 曹曦月\n------------\n\n出生日期:1994.4.21\n![殷离 扮演者 曹曦月][6]\n曹曦月是明道力捧的新生代花旦,曾诠释了《楚乔传》中泼辣嚣张的反派锦烛,《浪花一朵朵》中程美,和《夜空中最闪亮的星》中的追爱少女夏媛等角色。\n![曹曦月][7]\n《倚天屠龙记》里,曹曦月扮演生性倔强,因练千蛛万毒手毁容的殷离(蛛儿),跟其以往角色反差甚大,而且为了角色“毁容”,也让观众看到她在角色方面的更多可塑性。\n\n4.小昭 扮演者 许雅婷\n------------\n\n出生日期:1994.9.24\n![小昭 扮演者 许雅婷][8]\n秀美绝伦,温柔善良,且深藏不露的小昭由香港90后花旦许雅婷饰演。\n![许雅婷][9]\n许雅婷是“少女标本”演唱组合的成员,出道后音乐和影视双栖发展,参演过《微交少女》 《医护人生》《美人鱼》等20多部影视作品,不仅拥有扎实的表演功力,更拥有明艳的容貌,是一位颜值与演技并存的潜力花旦。\n\n5.殷素素 扮演者 陈欣予\n-------------\n\n出生日期:1990年11月24日\n![殷素素 扮演者 陈欣予][10]\n《倚天屠龙记》首播,#新版殷素素#登上热搜,90后花旦陈欣予获得万千网友点赞打call。\n![陈欣予][11]\n据悉,陈欣予2013年出道,凭借《何以笙箫默》 里暗恋何以琛多年的法律系高冷才女许影和《泡沫之夏》中外表温柔羞怯,内心敏感的姚淑儿成名。\n\n6.邬靖靖 饰 纪晓芙\n-----------\n\n出生日期:1991.6.6\n![邬靖靖 饰 纪晓芙][12]\n美丽聪慧,为爱执着的纪晓芙由90后花旦邬靖靖饰演,熟悉八卦的朋友应该知道,她是知名演员邬倩倩和著名导演尤小刚的侄女。\n![邬靖靖][13]\n据悉,邬靖靖毕业于中国传媒大学,在姑姑和姑父的提携下,大二就开始拍戏,凭《西施秘史》《杨贵妃秘史》《大唐女巡按》《封神英雄榜》等剧成为演技派花旦 ,2014年在于正版《神雕侠侣》里饰演公孙绿萼。\n\n7.杨不悔 扮演者 孙安可\n-------------\n\n出生日期:1998.2.2\n![杨不悔 扮演者 孙安可][14]\n孙安可虽为影视圈新人,但她演戏颇具天分,成功诠释了杨不悔的单纯善良,而且扮相非常清丽。\n![孙安可][15]\n98年出生的孙安可还曾参演过《衰鬼记》《恶魔少爷别吻我》等剧。\n\n8.黄衫女子 扮演者 赵樱子\n--------------\n\n出生日期:1990.12.16\n![黄衫女子 扮演者 赵樱子][16]\n黄衫女子虽然戏份不多,但其绝美的容貌,出尘脱俗气质令人印象深刻,90后花旦赵樱子不仅颜值能打,演技也不俗,堪可与刘诗诗扮演的黄衫女子一拼。\n![赵樱子][17]\n据悉,赵樱子,原名赵韩樱子,中戏校花级人物,2011年入行演戏,以《爱在春天》《因为爱情有多美》等剧成名,2014年在于正版《神雕侠侣》饰演程英,而她参演的《大明皇妃·孙若微传》《长安诺》则未播先热。\n\n9.丁敏君 扮演者 陶珞依\n-------------\n\n出生年月:1991.3.11\n![丁敏君 扮演者 陶珞依][18]\n《倚天屠龙记》里尖酸刻薄,且喜欢耍阴谋诡计的丁敏君师姐由90后花旦陶珞依扮演。\n![陶珞依][19]\n原名苗洛依的她参加世界小姐选美比赛,而且获得全国十强,转战影视圈后参演了《美人心计》《张小五的春天》《大汉情缘云中歌》等30多部影视作品,虽然没有大火,但其出众的外表和精湛的演技受到很多观众的喜爱。\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/165964777.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1350001660.jpeg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1830243572.jpeg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/173079610.jpeg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2692158928.jpeg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1172215275.jpeg\n [7]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3920113436.jpeg\n [8]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1510241126.jpeg\n [9]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/632740546.jpeg\n [10]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/522959024.jpeg\n [11]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1050683161.png\n [12]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1875225909.jpeg\n [13]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3194371837.jpeg\n [14]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1018565258.jpeg\n [15]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1629013396.jpeg\n [16]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2919760031.jpeg\n [17]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2907922160.jpeg\n [18]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2660338200.jpeg\n [19]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3123850066.jpeg","source":"_posts/2019-03-03-yitian.md","raw":"---\ntitle: 新版《倚天屠龙记》演员颜值在线 深扒众小花旦\ntags:\n - 演技\n - 剧情\n - 神雕\n - 金庸\n - 作品\n - 版本\n - 倚天屠龙记\npublished: true\nhideInList: false\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2019/03/03/165964777.jpg'\nabbrlink: 85322f98\ndate: 2019-03-03 15:34:00\n---\n\n\n金庸先生的射雕三部曲是至今被翻拍最多的作品了\n其中《倚天屠龙记》自我从小至今看了5个版本\n分别是咆哮教主马景涛版张无忌,李连杰版张无忌,吴启华版,苏有朋版,邓超版。\n新版最让人期待的点就是当年在马景涛版倚天中饰演周芷若的周海媚在新版中饰演了灭绝师太。\n\n> 电视剧新版《倚天屠龙记》开播就遭遇大量吐槽,这并不意外。当初李亚鹏、周迅演的《射雕英雄传》,也被那些“83版射雕”爱好者揶揄很久,但是这两年有很多网友开始怀念李亚鹏版的“射雕”了,这是新的一代人的记忆,而他们也到了怀旧的年纪了。\n> \n> 这并不是说网友的吐槽都是“怀旧病”导致的。新版《倚天屠龙记》也有一些真正的问题,比如被网友推上热搜的“慢动作”就是一例。该剧的武打环节,大量使用慢动作,在空中飞的镜头让人想起纪录片中飞行的鸟类。大量慢镜头的使用,甚至影响到剧情的推进,武打本来是要让人激动,现在却成了难得的休息眼睛的时候。\n![杨逍][1]\n> 新版的杨逍与纪晓芙的感情线相对比较饱满。\n新版《倚天屠龙记》播出后虽然被吐槽“慢动作太多”,影响观赏体验,但戏中演员的演技却颇具看点,而花旦们的颜值更非常抢眼\n\n1.赵敏 扮演者 陈钰琪\n------------\n\n出生日期:1992.7.29\n![赵敏 扮演者 陈钰琪][2]\n陈钰琪是唐嫣旗下力捧的90后花旦,凭借《锦绣未央》中的九公主和《香蜜沉沉烬如霜》里的魔界公主鎏英成名,清新亮丽的外形和可圈可点的演技,令她成为近两年颇具瞩目的小鲜花。\n![陈钰琪][3]\n在《倚天屠龙记》里,她饰演女一号美艳不可方物,且古灵精怪的赵敏,然而由于该剧版本太多,更有黎姿、贾静雯等珠玉在前,导致她很难得到观众的称赞。\n\n2.周芷若 扮演者 祝绪丹\n-------------\n\n出生日期:1992.4.15\n![周芷若 扮演者 祝绪丹][4]\n祝绪丹出道后以《三生三世十里桃花》《谈判官》《一千零一夜》等剧受到关注,修长的身材和甜美的外形,以及细腻的表演圈粉无数。\n![祝绪丹][5]\n她在戏中饰演周芷若,94版《倚天》的“周芷若”周海媚则扮演她的师傅灭绝师太,众所周知,她是杨幂旗下艺人,跟唐嫣旗下扮演赵敏的陈钰琪同龄,两人戏中是对手,戏外也因各自老板的微妙关系带有PK的味道。\n\n3.殷离 扮演者 曹曦月\n------------\n\n出生日期:1994.4.21\n![殷离 扮演者 曹曦月][6]\n曹曦月是明道力捧的新生代花旦,曾诠释了《楚乔传》中泼辣嚣张的反派锦烛,《浪花一朵朵》中程美,和《夜空中最闪亮的星》中的追爱少女夏媛等角色。\n![曹曦月][7]\n《倚天屠龙记》里,曹曦月扮演生性倔强,因练千蛛万毒手毁容的殷离(蛛儿),跟其以往角色反差甚大,而且为了角色“毁容”,也让观众看到她在角色方面的更多可塑性。\n\n4.小昭 扮演者 许雅婷\n------------\n\n出生日期:1994.9.24\n![小昭 扮演者 许雅婷][8]\n秀美绝伦,温柔善良,且深藏不露的小昭由香港90后花旦许雅婷饰演。\n![许雅婷][9]\n许雅婷是“少女标本”演唱组合的成员,出道后音乐和影视双栖发展,参演过《微交少女》 《医护人生》《美人鱼》等20多部影视作品,不仅拥有扎实的表演功力,更拥有明艳的容貌,是一位颜值与演技并存的潜力花旦。\n\n5.殷素素 扮演者 陈欣予\n-------------\n\n出生日期:1990年11月24日\n![殷素素 扮演者 陈欣予][10]\n《倚天屠龙记》首播,#新版殷素素#登上热搜,90后花旦陈欣予获得万千网友点赞打call。\n![陈欣予][11]\n据悉,陈欣予2013年出道,凭借《何以笙箫默》 里暗恋何以琛多年的法律系高冷才女许影和《泡沫之夏》中外表温柔羞怯,内心敏感的姚淑儿成名。\n\n6.邬靖靖 饰 纪晓芙\n-----------\n\n出生日期:1991.6.6\n![邬靖靖 饰 纪晓芙][12]\n美丽聪慧,为爱执着的纪晓芙由90后花旦邬靖靖饰演,熟悉八卦的朋友应该知道,她是知名演员邬倩倩和著名导演尤小刚的侄女。\n![邬靖靖][13]\n据悉,邬靖靖毕业于中国传媒大学,在姑姑和姑父的提携下,大二就开始拍戏,凭《西施秘史》《杨贵妃秘史》《大唐女巡按》《封神英雄榜》等剧成为演技派花旦 ,2014年在于正版《神雕侠侣》里饰演公孙绿萼。\n\n7.杨不悔 扮演者 孙安可\n-------------\n\n出生日期:1998.2.2\n![杨不悔 扮演者 孙安可][14]\n孙安可虽为影视圈新人,但她演戏颇具天分,成功诠释了杨不悔的单纯善良,而且扮相非常清丽。\n![孙安可][15]\n98年出生的孙安可还曾参演过《衰鬼记》《恶魔少爷别吻我》等剧。\n\n8.黄衫女子 扮演者 赵樱子\n--------------\n\n出生日期:1990.12.16\n![黄衫女子 扮演者 赵樱子][16]\n黄衫女子虽然戏份不多,但其绝美的容貌,出尘脱俗气质令人印象深刻,90后花旦赵樱子不仅颜值能打,演技也不俗,堪可与刘诗诗扮演的黄衫女子一拼。\n![赵樱子][17]\n据悉,赵樱子,原名赵韩樱子,中戏校花级人物,2011年入行演戏,以《爱在春天》《因为爱情有多美》等剧成名,2014年在于正版《神雕侠侣》饰演程英,而她参演的《大明皇妃·孙若微传》《长安诺》则未播先热。\n\n9.丁敏君 扮演者 陶珞依\n-------------\n\n出生年月:1991.3.11\n![丁敏君 扮演者 陶珞依][18]\n《倚天屠龙记》里尖酸刻薄,且喜欢耍阴谋诡计的丁敏君师姐由90后花旦陶珞依扮演。\n![陶珞依][19]\n原名苗洛依的她参加世界小姐选美比赛,而且获得全国十强,转战影视圈后参演了《美人心计》《张小五的春天》《大汉情缘云中歌》等30多部影视作品,虽然没有大火,但其出众的外表和精湛的演技受到很多观众的喜爱。\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/165964777.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1350001660.jpeg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1830243572.jpeg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/173079610.jpeg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2692158928.jpeg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1172215275.jpeg\n [7]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3920113436.jpeg\n [8]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1510241126.jpeg\n [9]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/632740546.jpeg\n [10]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/522959024.jpeg\n [11]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1050683161.png\n [12]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1875225909.jpeg\n [13]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3194371837.jpeg\n [14]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1018565258.jpeg\n [15]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1629013396.jpeg\n [16]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2919760031.jpeg\n [17]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2907922160.jpeg\n [18]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2660338200.jpeg\n [19]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3123850066.jpeg","slug":"2019-03-03-yitian","updated":"2023-09-29T07:51:06.333Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyeq000zoko01d00cfpt","content":"

金庸先生的射雕三部曲是至今被翻拍最多的作品了
其中《倚天屠龙记》自我从小至今看了5个版本
分别是咆哮教主马景涛版张无忌,李连杰版张无忌,吴启华版,苏有朋版,邓超版。
新版最让人期待的点就是当年在马景涛版倚天中饰演周芷若的周海媚在新版中饰演了灭绝师太。

\n
\n

电视剧新版《倚天屠龙记》开播就遭遇大量吐槽,这并不意外。当初李亚鹏、周迅演的《射雕英雄传》,也被那些“83版射雕”爱好者揶揄很久,但是这两年有很多网友开始怀念李亚鹏版的“射雕”了,这是新的一代人的记忆,而他们也到了怀旧的年纪了。

\n

这并不是说网友的吐槽都是“怀旧病”导致的。新版《倚天屠龙记》也有一些真正的问题,比如被网友推上热搜的“慢动作”就是一例。该剧的武打环节,大量使用慢动作,在空中飞的镜头让人想起纪录片中飞行的鸟类。大量慢镜头的使用,甚至影响到剧情的推进,武打本来是要让人激动,现在却成了难得的休息眼睛的时候。
\"杨逍\"
新版的杨逍与纪晓芙的感情线相对比较饱满。
新版《倚天屠龙记》播出后虽然被吐槽“慢动作太多”,影响观赏体验,但戏中演员的演技却颇具看点,而花旦们的颜值更非常抢眼

\n
\n

1.赵敏 扮演者 陈钰琪

出生日期:1992.7.29
\"赵敏
陈钰琪是唐嫣旗下力捧的90后花旦,凭借《锦绣未央》中的九公主和《香蜜沉沉烬如霜》里的魔界公主鎏英成名,清新亮丽的外形和可圈可点的演技,令她成为近两年颇具瞩目的小鲜花。
\"陈钰琪\"
在《倚天屠龙记》里,她饰演女一号美艳不可方物,且古灵精怪的赵敏,然而由于该剧版本太多,更有黎姿、贾静雯等珠玉在前,导致她很难得到观众的称赞。

\n

2.周芷若 扮演者 祝绪丹

出生日期:1992.4.15
\"周芷若
祝绪丹出道后以《三生三世十里桃花》《谈判官》《一千零一夜》等剧受到关注,修长的身材和甜美的外形,以及细腻的表演圈粉无数。
\"祝绪丹\"
她在戏中饰演周芷若,94版《倚天》的“周芷若”周海媚则扮演她的师傅灭绝师太,众所周知,她是杨幂旗下艺人,跟唐嫣旗下扮演赵敏的陈钰琪同龄,两人戏中是对手,戏外也因各自老板的微妙关系带有PK的味道。

\n

3.殷离 扮演者 曹曦月

出生日期:1994.4.21
\"殷离
曹曦月是明道力捧的新生代花旦,曾诠释了《楚乔传》中泼辣嚣张的反派锦烛,《浪花一朵朵》中程美,和《夜空中最闪亮的星》中的追爱少女夏媛等角色。
\"曹曦月\"
《倚天屠龙记》里,曹曦月扮演生性倔强,因练千蛛万毒手毁容的殷离(蛛儿),跟其以往角色反差甚大,而且为了角色“毁容”,也让观众看到她在角色方面的更多可塑性。

\n

4.小昭 扮演者 许雅婷

出生日期:1994.9.24
\"小昭
秀美绝伦,温柔善良,且深藏不露的小昭由香港90后花旦许雅婷饰演。
\"许雅婷\"
许雅婷是“少女标本”演唱组合的成员,出道后音乐和影视双栖发展,参演过《微交少女》 《医护人生》《美人鱼》等20多部影视作品,不仅拥有扎实的表演功力,更拥有明艳的容貌,是一位颜值与演技并存的潜力花旦。

\n

5.殷素素 扮演者 陈欣予

出生日期:1990年11月24日
\"殷素素
《倚天屠龙记》首播,#新版殷素素#登上热搜,90后花旦陈欣予获得万千网友点赞打call。
\"陈欣予\"
据悉,陈欣予2013年出道,凭借《何以笙箫默》 里暗恋何以琛多年的法律系高冷才女许影和《泡沫之夏》中外表温柔羞怯,内心敏感的姚淑儿成名。

\n

6.邬靖靖 饰 纪晓芙

出生日期:1991.6.6
\"邬靖靖
美丽聪慧,为爱执着的纪晓芙由90后花旦邬靖靖饰演,熟悉八卦的朋友应该知道,她是知名演员邬倩倩和著名导演尤小刚的侄女。
\"邬靖靖\"
据悉,邬靖靖毕业于中国传媒大学,在姑姑和姑父的提携下,大二就开始拍戏,凭《西施秘史》《杨贵妃秘史》《大唐女巡按》《封神英雄榜》等剧成为演技派花旦 ,2014年在于正版《神雕侠侣》里饰演公孙绿萼。

\n

7.杨不悔 扮演者 孙安可

出生日期:1998.2.2
\"杨不悔
孙安可虽为影视圈新人,但她演戏颇具天分,成功诠释了杨不悔的单纯善良,而且扮相非常清丽。
\"孙安可\"
98年出生的孙安可还曾参演过《衰鬼记》《恶魔少爷别吻我》等剧。

\n

8.黄衫女子 扮演者 赵樱子

出生日期:1990.12.16
\"黄衫女子
黄衫女子虽然戏份不多,但其绝美的容貌,出尘脱俗气质令人印象深刻,90后花旦赵樱子不仅颜值能打,演技也不俗,堪可与刘诗诗扮演的黄衫女子一拼。
\"赵樱子\"
据悉,赵樱子,原名赵韩樱子,中戏校花级人物,2011年入行演戏,以《爱在春天》《因为爱情有多美》等剧成名,2014年在于正版《神雕侠侣》饰演程英,而她参演的《大明皇妃·孙若微传》《长安诺》则未播先热。

\n

9.丁敏君 扮演者 陶珞依

出生年月:1991.3.11
\"丁敏君
《倚天屠龙记》里尖酸刻薄,且喜欢耍阴谋诡计的丁敏君师姐由90后花旦陶珞依扮演。
\"陶珞依\"
原名苗洛依的她参加世界小姐选美比赛,而且获得全国十强,转战影视圈后参演了《美人心计》《张小五的春天》《大汉情缘云中歌》等30多部影视作品,虽然没有大火,但其出众的外表和精湛的演技受到很多观众的喜爱。

\n","site":{"data":{}},"excerpt":"","more":"

金庸先生的射雕三部曲是至今被翻拍最多的作品了
其中《倚天屠龙记》自我从小至今看了5个版本
分别是咆哮教主马景涛版张无忌,李连杰版张无忌,吴启华版,苏有朋版,邓超版。
新版最让人期待的点就是当年在马景涛版倚天中饰演周芷若的周海媚在新版中饰演了灭绝师太。

\n
\n

电视剧新版《倚天屠龙记》开播就遭遇大量吐槽,这并不意外。当初李亚鹏、周迅演的《射雕英雄传》,也被那些“83版射雕”爱好者揶揄很久,但是这两年有很多网友开始怀念李亚鹏版的“射雕”了,这是新的一代人的记忆,而他们也到了怀旧的年纪了。

\n

这并不是说网友的吐槽都是“怀旧病”导致的。新版《倚天屠龙记》也有一些真正的问题,比如被网友推上热搜的“慢动作”就是一例。该剧的武打环节,大量使用慢动作,在空中飞的镜头让人想起纪录片中飞行的鸟类。大量慢镜头的使用,甚至影响到剧情的推进,武打本来是要让人激动,现在却成了难得的休息眼睛的时候。
\"杨逍\"
新版的杨逍与纪晓芙的感情线相对比较饱满。
新版《倚天屠龙记》播出后虽然被吐槽“慢动作太多”,影响观赏体验,但戏中演员的演技却颇具看点,而花旦们的颜值更非常抢眼

\n
\n

1.赵敏 扮演者 陈钰琪

出生日期:1992.7.29
\"赵敏
陈钰琪是唐嫣旗下力捧的90后花旦,凭借《锦绣未央》中的九公主和《香蜜沉沉烬如霜》里的魔界公主鎏英成名,清新亮丽的外形和可圈可点的演技,令她成为近两年颇具瞩目的小鲜花。
\"陈钰琪\"
在《倚天屠龙记》里,她饰演女一号美艳不可方物,且古灵精怪的赵敏,然而由于该剧版本太多,更有黎姿、贾静雯等珠玉在前,导致她很难得到观众的称赞。

\n

2.周芷若 扮演者 祝绪丹

出生日期:1992.4.15
\"周芷若
祝绪丹出道后以《三生三世十里桃花》《谈判官》《一千零一夜》等剧受到关注,修长的身材和甜美的外形,以及细腻的表演圈粉无数。
\"祝绪丹\"
她在戏中饰演周芷若,94版《倚天》的“周芷若”周海媚则扮演她的师傅灭绝师太,众所周知,她是杨幂旗下艺人,跟唐嫣旗下扮演赵敏的陈钰琪同龄,两人戏中是对手,戏外也因各自老板的微妙关系带有PK的味道。

\n

3.殷离 扮演者 曹曦月

出生日期:1994.4.21
\"殷离
曹曦月是明道力捧的新生代花旦,曾诠释了《楚乔传》中泼辣嚣张的反派锦烛,《浪花一朵朵》中程美,和《夜空中最闪亮的星》中的追爱少女夏媛等角色。
\"曹曦月\"
《倚天屠龙记》里,曹曦月扮演生性倔强,因练千蛛万毒手毁容的殷离(蛛儿),跟其以往角色反差甚大,而且为了角色“毁容”,也让观众看到她在角色方面的更多可塑性。

\n

4.小昭 扮演者 许雅婷

出生日期:1994.9.24
\"小昭
秀美绝伦,温柔善良,且深藏不露的小昭由香港90后花旦许雅婷饰演。
\"许雅婷\"
许雅婷是“少女标本”演唱组合的成员,出道后音乐和影视双栖发展,参演过《微交少女》 《医护人生》《美人鱼》等20多部影视作品,不仅拥有扎实的表演功力,更拥有明艳的容貌,是一位颜值与演技并存的潜力花旦。

\n

5.殷素素 扮演者 陈欣予

出生日期:1990年11月24日
\"殷素素
《倚天屠龙记》首播,#新版殷素素#登上热搜,90后花旦陈欣予获得万千网友点赞打call。
\"陈欣予\"
据悉,陈欣予2013年出道,凭借《何以笙箫默》 里暗恋何以琛多年的法律系高冷才女许影和《泡沫之夏》中外表温柔羞怯,内心敏感的姚淑儿成名。

\n

6.邬靖靖 饰 纪晓芙

出生日期:1991.6.6
\"邬靖靖
美丽聪慧,为爱执着的纪晓芙由90后花旦邬靖靖饰演,熟悉八卦的朋友应该知道,她是知名演员邬倩倩和著名导演尤小刚的侄女。
\"邬靖靖\"
据悉,邬靖靖毕业于中国传媒大学,在姑姑和姑父的提携下,大二就开始拍戏,凭《西施秘史》《杨贵妃秘史》《大唐女巡按》《封神英雄榜》等剧成为演技派花旦 ,2014年在于正版《神雕侠侣》里饰演公孙绿萼。

\n

7.杨不悔 扮演者 孙安可

出生日期:1998.2.2
\"杨不悔
孙安可虽为影视圈新人,但她演戏颇具天分,成功诠释了杨不悔的单纯善良,而且扮相非常清丽。
\"孙安可\"
98年出生的孙安可还曾参演过《衰鬼记》《恶魔少爷别吻我》等剧。

\n

8.黄衫女子 扮演者 赵樱子

出生日期:1990.12.16
\"黄衫女子
黄衫女子虽然戏份不多,但其绝美的容貌,出尘脱俗气质令人印象深刻,90后花旦赵樱子不仅颜值能打,演技也不俗,堪可与刘诗诗扮演的黄衫女子一拼。
\"赵樱子\"
据悉,赵樱子,原名赵韩樱子,中戏校花级人物,2011年入行演戏,以《爱在春天》《因为爱情有多美》等剧成名,2014年在于正版《神雕侠侣》饰演程英,而她参演的《大明皇妃·孙若微传》《长安诺》则未播先热。

\n

9.丁敏君 扮演者 陶珞依

出生年月:1991.3.11
\"丁敏君
《倚天屠龙记》里尖酸刻薄,且喜欢耍阴谋诡计的丁敏君师姐由90后花旦陶珞依扮演。
\"陶珞依\"
原名苗洛依的她参加世界小姐选美比赛,而且获得全国十强,转战影视圈后参演了《美人心计》《张小五的春天》《大汉情缘云中歌》等30多部影视作品,虽然没有大火,但其出众的外表和精湛的演技受到很多观众的喜爱。

\n"},{"title":"CentOS一键安装ShadowsocksR服务(附单/多端口管理)","published":1,"hideInList":false,"cover":"https://xy07-1251893119.costj.myqcloud.com/2019/04/03/4001117836.png","abbrlink":"8a82280f","date":"2019-04-03T11:02:00.000Z","_content":"\n\n```bash\nwget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh\n```\n\n使用wget命令下载文件,-N代表不重新下载文件除非比本地文件更新,--no-check-certificate代表不检查证书。\n\n下载完成后可以看到以下界面,按提示操作输入端口/密码/加密方式/ 协议/混淆等参数即可完成安装。\n![20190211153929924.png][1]\n安装完成后,如需要进入服务界面输入以下命令。\n\n bash ssr.sh\n安装完成后,自动设置为系统服务,所以支持使用服务来启动/停止等操作,同时支持开机启动。\n\n> service ssr start //启动 \n> service ssr stop //停止 \n> service ssr restart //重启 \n> service ssr status\n\nShadowsocksR 默认支持UDP转发,服务端无需任何设置。\n\n本脚本已经集成了 安装/卸载 锐速(ServerSpeeder),但是是否支持请查看 Linux支持内核列表 。\n \n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2019/04/03/4001117836.png\n\n","source":"_posts/2019-04-03-CentOS-ShadowsocksR.md","raw":"---\ntitle: CentOS一键安装ShadowsocksR服务(附单/多端口管理)\ntags:\n - wget\n - 列表\n - 文件\n - 命令\n - 安装\n - ssr\n - service\npublished: true\nhideInList: false\ncategories: 分享\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2019/04/03/4001117836.png'\nabbrlink: 8a82280f\ndate: 2019-04-03 19:02:00\n---\n\n\n```bash\nwget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh\n```\n\n使用wget命令下载文件,-N代表不重新下载文件除非比本地文件更新,--no-check-certificate代表不检查证书。\n\n下载完成后可以看到以下界面,按提示操作输入端口/密码/加密方式/ 协议/混淆等参数即可完成安装。\n![20190211153929924.png][1]\n安装完成后,如需要进入服务界面输入以下命令。\n\n bash ssr.sh\n安装完成后,自动设置为系统服务,所以支持使用服务来启动/停止等操作,同时支持开机启动。\n\n> service ssr start //启动 \n> service ssr stop //停止 \n> service ssr restart //重启 \n> service ssr status\n\nShadowsocksR 默认支持UDP转发,服务端无需任何设置。\n\n本脚本已经集成了 安装/卸载 锐速(ServerSpeeder),但是是否支持请查看 Linux支持内核列表 。\n \n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2019/04/03/4001117836.png\n\n","slug":"2019-04-03-CentOS-ShadowsocksR","updated":"2023-09-29T07:51:06.333Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyer0013oko0257idpe3","content":"
1
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh
\n\n

使用wget命令下载文件,-N代表不重新下载文件除非比本地文件更新,–no-check-certificate代表不检查证书。

\n

下载完成后可以看到以下界面,按提示操作输入端口/密码/加密方式/ 协议/混淆等参数即可完成安装。
\"20190211153929924.png\"
安装完成后,如需要进入服务界面输入以下命令。

\n
bash ssr.sh\n
\n

安装完成后,自动设置为系统服务,所以支持使用服务来启动/停止等操作,同时支持开机启动。

\n
\n

service ssr start //启动
service ssr stop //停止
service ssr restart //重启
service ssr status

\n
\n

ShadowsocksR 默认支持UDP转发,服务端无需任何设置。

\n

本脚本已经集成了 安装/卸载 锐速(ServerSpeeder),但是是否支持请查看 Linux支持内核列表 。

\n","site":{"data":{}},"excerpt":"","more":"
1
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh
\n\n

使用wget命令下载文件,-N代表不重新下载文件除非比本地文件更新,–no-check-certificate代表不检查证书。

\n

下载完成后可以看到以下界面,按提示操作输入端口/密码/加密方式/ 协议/混淆等参数即可完成安装。
\"20190211153929924.png\"
安装完成后,如需要进入服务界面输入以下命令。

\n
bash ssr.sh\n
\n

安装完成后,自动设置为系统服务,所以支持使用服务来启动/停止等操作,同时支持开机启动。

\n
\n

service ssr start //启动
service ssr stop //停止
service ssr restart //重启
service ssr status

\n
\n

ShadowsocksR 默认支持UDP转发,服务端无需任何设置。

\n

本脚本已经集成了 安装/卸载 锐速(ServerSpeeder),但是是否支持请查看 Linux支持内核列表 。

\n"},{"abbrlink":"8327832e","date":"2021-03-24T04:00:00.000Z","excerpt":"配置 主板 精粤h97m-vh CPU i5 5575r魔改 内存 amd专用条 32g 硬盘 fanxiang nvme 256gb 无线网卡 bcm943224pciebt白果拆机 EFI 使用opencore引导。 声卡内建 集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛 无线网卡正常投送 有线网卡内建 下载地址 打赏后联系博主 ","published":1,"title":"精粤h97m-vh+i5 5575r oc0.6.7引导big sur11.1","updated":"2023-04-13T07:33:17.000Z","_content":"# 配置\n\n- 主板 精粤h97m-vh\n- CPU i5 5575r魔改\n- 内存 amd专用条 32g\n- 硬盘 fanxiang nvme 256gb\n- 无线网卡 bcm943224pciebt白果拆机\n\n# EFI\n\n使用opencore引导。\n声卡内建\n集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛\n无线网卡正常投送\n有线网卡内建\n\n# 下载地址\n\n打赏后联系博主\n","source":"_posts/2021-03-24-h97m-vh+i5_5575r_oc0.6.7-big_sur_.md","raw":"---\nabbrlink: 8327832e\ncategories:\n - 分享\ndate: '2021-03-24 12:00:00'\nexcerpt: >-\n 配置 主板 精粤h97m-vh CPU i5 5575r魔改 内存 amd专用条 32g 硬盘 fanxiang nvme 256gb 无线网卡\n bcm943224pciebt白果拆机 EFI 使用opencore引导。 声卡内建 集显iris\n 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛 无线网卡正常投送 有线网卡内建 下载地址 打赏后联系博主 \npublished: true\ntags:\n - 硬盘\n - opencore\n - 网卡\n - i5\n - 主板\n - nvme\n - 精粤\n - 黑苹果\ntitle: 精粤h97m-vh+i5 5575r oc0.6.7引导big sur11.1\nupdated: 'Thu, 13 Apr 2023 07:33:17 GMT'\n---\n# 配置\n\n- 主板 精粤h97m-vh\n- CPU i5 5575r魔改\n- 内存 amd专用条 32g\n- 硬盘 fanxiang nvme 256gb\n- 无线网卡 bcm943224pciebt白果拆机\n\n# EFI\n\n使用opencore引导。\n声卡内建\n集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛\n无线网卡正常投送\n有线网卡内建\n\n# 下载地址\n\n打赏后联系博主\n","slug":"2021-03-24-h97m-vh+i5_5575r_oc0.6.7-big_sur_","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyes0017oko03vhpgdbl","content":"

配置

\n

EFI

使用opencore引导。
声卡内建
集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛
无线网卡正常投送
有线网卡内建

\n

下载地址

打赏后联系博主

\n","site":{"data":{}},"more":"

配置

\n

EFI

使用opencore引导。
声卡内建
集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛
无线网卡正常投送
有线网卡内建

\n

下载地址

打赏后联系博主

\n"},{"title":"NEC VK22 黑苹果opencore引导","published":1,"hideInList":false,"isTop":false,"abbrlink":"89f51950","date":"2021-10-10T07:42:00.000Z","_content":"\n\n \n\n## 关于解锁\n\n安装之前要解锁cfglock\n\n## 关于nvme固态的使用\n\n思路就是用一个U盘格式化成FAT32格式\n\n把oc引导复制在U盘中。\n\n在BIOS中把U盘启动设为第一启动项\n\n这样做得好处是不用修改BIOS直接使用nvme的固态提升读写速度\n\n坏处就是占用一个USB口\n\n## 其他\n\n笔记本黑苹果的难点就在于注入edid。\n\n我的做法是在clover下安装好macos之后再用hackintool注入EDID,然后再转为opencore引导。\n\n其他都很简单我就不多说了。\n\n附上EFI文件,三码自己改\n\n## 已驱动\n\n显卡\n声卡\n网卡 (已更换DW1820A)\n读卡器\nUSB\n触摸板\n \n ## 下载\n\n[请打赏后下载][2]\n\n\n \n [2]: https://blogcdn.asbid.cn/2021/12/03/1638521042.zip","source":"_posts/2021-10-10-NEC_VK22_opencore.md","raw":"---\ntitle: NEC VK22 黑苹果opencore引导\ntags:\n - macos\n - 黑苹果\n - opencore\n - 笔记本\n - clover\n - edid\n - hackintool\npublished: true\nhideInList: false\ncategories: 分享\nisTop: false\nabbrlink: 89f51950\ndate: 2021-10-10 15:42:00\n---\n\n\n \n\n## 关于解锁\n\n安装之前要解锁cfglock\n\n## 关于nvme固态的使用\n\n思路就是用一个U盘格式化成FAT32格式\n\n把oc引导复制在U盘中。\n\n在BIOS中把U盘启动设为第一启动项\n\n这样做得好处是不用修改BIOS直接使用nvme的固态提升读写速度\n\n坏处就是占用一个USB口\n\n## 其他\n\n笔记本黑苹果的难点就在于注入edid。\n\n我的做法是在clover下安装好macos之后再用hackintool注入EDID,然后再转为opencore引导。\n\n其他都很简单我就不多说了。\n\n附上EFI文件,三码自己改\n\n## 已驱动\n\n显卡\n声卡\n网卡 (已更换DW1820A)\n读卡器\nUSB\n触摸板\n \n ## 下载\n\n[请打赏后下载][2]\n\n\n \n [2]: https://blogcdn.asbid.cn/2021/12/03/1638521042.zip","slug":"2021-10-10-NEC_VK22_opencore","updated":"2023-09-29T07:51:06.335Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyet001aoko088smaz6z","content":"

关于解锁

安装之前要解锁cfglock

\n

关于nvme固态的使用

思路就是用一个U盘格式化成FAT32格式

\n

把oc引导复制在U盘中。

\n

在BIOS中把U盘启动设为第一启动项

\n

这样做得好处是不用修改BIOS直接使用nvme的固态提升读写速度

\n

坏处就是占用一个USB口

\n

其他

笔记本黑苹果的难点就在于注入edid。

\n

我的做法是在clover下安装好macos之后再用hackintool注入EDID,然后再转为opencore引导。

\n

其他都很简单我就不多说了。

\n

附上EFI文件,三码自己改

\n

已驱动

显卡
声卡
网卡 (已更换DW1820A)
读卡器
USB
触摸板

\n

下载

请打赏后下载

\n","site":{"data":{}},"excerpt":"","more":"

关于解锁

安装之前要解锁cfglock

\n

关于nvme固态的使用

思路就是用一个U盘格式化成FAT32格式

\n

把oc引导复制在U盘中。

\n

在BIOS中把U盘启动设为第一启动项

\n

这样做得好处是不用修改BIOS直接使用nvme的固态提升读写速度

\n

坏处就是占用一个USB口

\n

其他

笔记本黑苹果的难点就在于注入edid。

\n

我的做法是在clover下安装好macos之后再用hackintool注入EDID,然后再转为opencore引导。

\n

其他都很简单我就不多说了。

\n

附上EFI文件,三码自己改

\n

已驱动

显卡
声卡
网卡 (已更换DW1820A)
读卡器
USB
触摸板

\n

下载

请打赏后下载

\n"},{"title":"NEC VK22t 测评","published":1,"hideInList":false,"cover":"https://blog.asbid.cn/usr/uploads/2021/10/1718321267.jpg","abbrlink":"7e0d420b","date":"2021-10-10T07:52:00.000Z","_content":"\n\n年前就在海鲜市场入手了一台号称最轻量的笔记本电脑,只有800g。\n我看重的是它2k分辨率的夏普屏。忽略了只有4g lpddr3这个残疾的事情。\n无所谓了只是用来上网或者处理文档的话4g内存还是能凑合用的\n笔记本原装的是一块三星的m.2sata接口的硬盘。\n当时我用一块m.2 nvme的固态硬盘没有进入系统,当时便以为不支持nvme,便没有在意。\n近日因为笔记本D壳脱漆。不知道是因为这个不是原装的D壳还是烤漆工艺的问题,大概率是因为奸商重新喷漆翻新的。\n我拆开换了一条m2 nvme用pe系统一看。竟然是可以识别的。就是无法引导。\n目前我用一个u盘装了CLOVER引导。\n后续会尝试修改BIOS来支持nvme启动\nhttps://blog.asbid.cn/vk22t-add-nvme-module-bios.html\n作为一款洋垃圾只有900的价格,用来上网写文字,看视频还是相当ok的。\n本文就是在nec vk22上完成。\n上一张鲁大师看看\n![ludashi.jpg][1]\n![ludashi2.jpg][2]\n 黑苹果引导\nhttps://blog.asbid.cn/nec-vk22-black-apple-opencore-boot.html\n\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/1718321267.jpg\n [2]: https://blog.asbid.cn/usr/uploads/2021/10/2198726438.jpg","source":"_posts/2021-10-10-NEC_VK22t.md","raw":"---\ntitle: NEC VK22t 测评\ntags:\n - 固态\n - 硬盘\n - nvme\n - 笔记本\n - 夏普屏\n - clover\npublished: true\nhideInList: false\ncategories: 分享\ncover: 'https://blog.asbid.cn/usr/uploads/2021/10/1718321267.jpg'\nabbrlink: 7e0d420b\ndate: 2021-10-10 15:52:00\n---\n\n\n年前就在海鲜市场入手了一台号称最轻量的笔记本电脑,只有800g。\n我看重的是它2k分辨率的夏普屏。忽略了只有4g lpddr3这个残疾的事情。\n无所谓了只是用来上网或者处理文档的话4g内存还是能凑合用的\n笔记本原装的是一块三星的m.2sata接口的硬盘。\n当时我用一块m.2 nvme的固态硬盘没有进入系统,当时便以为不支持nvme,便没有在意。\n近日因为笔记本D壳脱漆。不知道是因为这个不是原装的D壳还是烤漆工艺的问题,大概率是因为奸商重新喷漆翻新的。\n我拆开换了一条m2 nvme用pe系统一看。竟然是可以识别的。就是无法引导。\n目前我用一个u盘装了CLOVER引导。\n后续会尝试修改BIOS来支持nvme启动\nhttps://blog.asbid.cn/vk22t-add-nvme-module-bios.html\n作为一款洋垃圾只有900的价格,用来上网写文字,看视频还是相当ok的。\n本文就是在nec vk22上完成。\n上一张鲁大师看看\n![ludashi.jpg][1]\n![ludashi2.jpg][2]\n 黑苹果引导\nhttps://blog.asbid.cn/nec-vk22-black-apple-opencore-boot.html\n\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/1718321267.jpg\n [2]: https://blog.asbid.cn/usr/uploads/2021/10/2198726438.jpg","slug":"2021-10-10-NEC_VK22t","updated":"2023-09-29T07:51:06.335Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyeu001doko0e993e7bg","content":"

年前就在海鲜市场入手了一台号称最轻量的笔记本电脑,只有800g。
我看重的是它2k分辨率的夏普屏。忽略了只有4g lpddr3这个残疾的事情。
无所谓了只是用来上网或者处理文档的话4g内存还是能凑合用的
笔记本原装的是一块三星的m.2sata接口的硬盘。
当时我用一块m.2 nvme的固态硬盘没有进入系统,当时便以为不支持nvme,便没有在意。
近日因为笔记本D壳脱漆。不知道是因为这个不是原装的D壳还是烤漆工艺的问题,大概率是因为奸商重新喷漆翻新的。
我拆开换了一条m2 nvme用pe系统一看。竟然是可以识别的。就是无法引导。
目前我用一个u盘装了CLOVER引导。
后续会尝试修改BIOS来支持nvme启动
https://blog.asbid.cn/vk22t-add-nvme-module-bios.html
作为一款洋垃圾只有900的价格,用来上网写文字,看视频还是相当ok的。
本文就是在nec vk22上完成。
上一张鲁大师看看
\"ludashi.jpg\"
\"ludashi2.jpg\"
黑苹果引导
https://blog.asbid.cn/nec-vk22-black-apple-opencore-boot.html

\n","site":{"data":{}},"excerpt":"","more":"

年前就在海鲜市场入手了一台号称最轻量的笔记本电脑,只有800g。
我看重的是它2k分辨率的夏普屏。忽略了只有4g lpddr3这个残疾的事情。
无所谓了只是用来上网或者处理文档的话4g内存还是能凑合用的
笔记本原装的是一块三星的m.2sata接口的硬盘。
当时我用一块m.2 nvme的固态硬盘没有进入系统,当时便以为不支持nvme,便没有在意。
近日因为笔记本D壳脱漆。不知道是因为这个不是原装的D壳还是烤漆工艺的问题,大概率是因为奸商重新喷漆翻新的。
我拆开换了一条m2 nvme用pe系统一看。竟然是可以识别的。就是无法引导。
目前我用一个u盘装了CLOVER引导。
后续会尝试修改BIOS来支持nvme启动
https://blog.asbid.cn/vk22t-add-nvme-module-bios.html
作为一款洋垃圾只有900的价格,用来上网写文字,看视频还是相当ok的。
本文就是在nec vk22上完成。
上一张鲁大师看看
\"ludashi.jpg\"
\"ludashi2.jpg\"
黑苹果引导
https://blog.asbid.cn/nec-vk22-black-apple-opencore-boot.html

\n"},{"abbrlink":"90206356","date":"2019-08-01T04:52:00.000Z","excerpt":"老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。 刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。 笔记本没有息屏就上班去了。 下班回来一看界面卡死。于是只有强行关机重启。 这下问题来了,识别不了硬盘了。 百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。 有教程说30分钟拯救固态。试了一晚上不行。 看了第二种方法就是去开卡量产。 ...","isTop":false,"published":1,"title":"记一次亿储SSD固态掉盘修复(重新开卡)","updated":"2023-04-13T07:30:32.000Z","_content":"老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。\n刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。\n笔记本没有息屏就上班去了。\n下班回来一看界面卡死。于是只有强行关机重启。\n这下问题来了,识别不了硬盘了。\n百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。\n有教程说30分钟拯救固态。试了一晚上不行。\n看了第二种方法就是去开卡量产。\n摸索了一晚上终于成功了!!!\n\n## 所需物料\n\n---\n\n硬盘盒(USB转接卡) 螺丝刀(拆硬盘用) 开卡软件(文章末尾下载)\n1 首先把硬盘拆开 拆开硬盘发现主控是慧荣sm 2246XT(其实百度也可以百度到,如果是正品的话……)\n![103_2877224_9e544a870ce08b2.jpg][1]\n图是网上找的,主控型号一般会印在主控芯片上,也就是那个小的。\n2 短接JP1,PCB上一般会有标注,如果和我的硬盘一样的话就短接最上面两个(懒 没有作图 网图)\n3 接上硬盘盒 打开开卡软件sm2246XT_MPTool_O1224H\n4 识别到port1之后 不用短接\n![QQ浏览器截图20190801131230.png][2]\n5 此时应该在Parameter里面选择一个合适的flash型号,直接开卡就会成功\n![103_2877224_bd107f5920c8e54.png][3]\n\n参考教程链接\n\n> http://www.upantool.com/jiaocheng/ssd/2017/10569.html\n> http://bbs.mydigit.cn/read.php?tid=2367269\n\n## 开卡工具下载\n\n[sm2246XT_MPTool_O1224H.zip][4]\n\n![bg.jpg][5]\n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/868332940.jpg\n[2]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/3281558957.png\n[3]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/252432522.png\n[4]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/2111427864.zip\n[5]: https://xy07-1251893119.costj.myqcloud.com/2020/12/21/3940912839.jpg\n","source":"_posts/2019-08-01-SSD.md","raw":"---\nabbrlink: '90206356'\ncategories:\n - - 分享\ndate: '2019-08-01 12:52:00'\nexcerpt: >-\n 老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。 刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。\n 笔记本没有息屏就上班去了。 下班回来一看界面卡死。于是只有强行关机重启。 这下问题来了,识别不了硬盘了。\n 百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。 有教程说30分钟拯救固态。试了一晚上不行。\n 看了第二种方法就是去开卡量产。 ...\nisTop: false\npublished: true\ntags:\n - 厂商\n - 固态\n - 主控\n - 开卡\n - 硬盘盒\ntitle: 记一次亿储SSD固态掉盘修复(重新开卡)\nupdated: 'Thu, 13 Apr 2023 07:30:32 GMT'\n---\n老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。\n刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。\n笔记本没有息屏就上班去了。\n下班回来一看界面卡死。于是只有强行关机重启。\n这下问题来了,识别不了硬盘了。\n百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。\n有教程说30分钟拯救固态。试了一晚上不行。\n看了第二种方法就是去开卡量产。\n摸索了一晚上终于成功了!!!\n\n## 所需物料\n\n---\n\n硬盘盒(USB转接卡) 螺丝刀(拆硬盘用) 开卡软件(文章末尾下载)\n1 首先把硬盘拆开 拆开硬盘发现主控是慧荣sm 2246XT(其实百度也可以百度到,如果是正品的话……)\n![103_2877224_9e544a870ce08b2.jpg][1]\n图是网上找的,主控型号一般会印在主控芯片上,也就是那个小的。\n2 短接JP1,PCB上一般会有标注,如果和我的硬盘一样的话就短接最上面两个(懒 没有作图 网图)\n3 接上硬盘盒 打开开卡软件sm2246XT_MPTool_O1224H\n4 识别到port1之后 不用短接\n![QQ浏览器截图20190801131230.png][2]\n5 此时应该在Parameter里面选择一个合适的flash型号,直接开卡就会成功\n![103_2877224_bd107f5920c8e54.png][3]\n\n参考教程链接\n\n> http://www.upantool.com/jiaocheng/ssd/2017/10569.html\n> http://bbs.mydigit.cn/read.php?tid=2367269\n\n## 开卡工具下载\n\n[sm2246XT_MPTool_O1224H.zip][4]\n\n![bg.jpg][5]\n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/868332940.jpg\n[2]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/3281558957.png\n[3]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/252432522.png\n[4]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/2111427864.zip\n[5]: https://xy07-1251893119.costj.myqcloud.com/2020/12/21/3940912839.jpg\n","slug":"2019-08-01-SSD","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyev001foko0ccn1cieg","content":"

老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。
刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。
笔记本没有息屏就上班去了。
下班回来一看界面卡死。于是只有强行关机重启。
这下问题来了,识别不了硬盘了。
百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。
有教程说30分钟拯救固态。试了一晚上不行。
看了第二种方法就是去开卡量产。
摸索了一晚上终于成功了!!!

\n

所需物料


\n

硬盘盒(USB转接卡) 螺丝刀(拆硬盘用) 开卡软件(文章末尾下载)
1 首先把硬盘拆开 拆开硬盘发现主控是慧荣sm 2246XT(其实百度也可以百度到,如果是正品的话……)
\"103_2877224_9e544a870ce08b2.jpg\"
图是网上找的,主控型号一般会印在主控芯片上,也就是那个小的。
2 短接JP1,PCB上一般会有标注,如果和我的硬盘一样的话就短接最上面两个(懒 没有作图 网图)
3 接上硬盘盒 打开开卡软件sm2246XT_MPTool_O1224H
4 识别到port1之后 不用短接
\"QQ浏览器截图20190801131230.png\"
5 此时应该在Parameter里面选择一个合适的flash型号,直接开卡就会成功
\"103_2877224_bd107f5920c8e54.png\"

\n

参考教程链接

\n
\n

http://www.upantool.com/jiaocheng/ssd/2017/10569.html
http://bbs.mydigit.cn/read.php?tid=2367269

\n
\n

开卡工具下载

sm2246XT_MPTool_O1224H.zip

\n

\"bg.jpg\"

\n","site":{"data":{}},"more":"

老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。
刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。
笔记本没有息屏就上班去了。
下班回来一看界面卡死。于是只有强行关机重启。
这下问题来了,识别不了硬盘了。
百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。
有教程说30分钟拯救固态。试了一晚上不行。
看了第二种方法就是去开卡量产。
摸索了一晚上终于成功了!!!

\n

所需物料


\n

硬盘盒(USB转接卡) 螺丝刀(拆硬盘用) 开卡软件(文章末尾下载)
1 首先把硬盘拆开 拆开硬盘发现主控是慧荣sm 2246XT(其实百度也可以百度到,如果是正品的话……)
\"103_2877224_9e544a870ce08b2.jpg\"
图是网上找的,主控型号一般会印在主控芯片上,也就是那个小的。
2 短接JP1,PCB上一般会有标注,如果和我的硬盘一样的话就短接最上面两个(懒 没有作图 网图)
3 接上硬盘盒 打开开卡软件sm2246XT_MPTool_O1224H
4 识别到port1之后 不用短接
\"QQ浏览器截图20190801131230.png\"
5 此时应该在Parameter里面选择一个合适的flash型号,直接开卡就会成功
\"103_2877224_bd107f5920c8e54.png\"

\n

参考教程链接

\n
\n

http://www.upantool.com/jiaocheng/ssd/2017/10569.html
http://bbs.mydigit.cn/read.php?tid=2367269

\n
\n

开卡工具下载

sm2246XT_MPTool_O1224H.zip

\n

\"bg.jpg\"

\n"},{"abbrlink":"156c3684","date":"2021-10-11T02:21:00.000Z","excerpt":"昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios 用编程器写入之后发现无法开机。 用编程器备份的bios是8m,用amibios工具备份下来的只有6m。 后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。 bios尝试计划至此被动完结。 笔记本目前已经被我肢解。 对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点 少折腾还能省钱-_- 在外网找到了一个...","published":1,"title":"关于nec vk22t添加nvme驱动","updated":"2023-04-13T07:29:39.000Z","_content":"昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios\n用编程器写入之后发现无法开机。\n用编程器备份的bios是8m,用amibios工具备份下来的只有6m。\n后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。\nbios尝试计划至此被动完结。\n笔记本目前已经被我肢解。\n对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点\n少折腾还能省钱-_-\n\n在外网找到了一个small版的模块或许有用\nhttps://blog.asbid.cn/nvme-module-small.html\n","source":"_posts/2021-10-11-nec_vk22t-nvme.md","raw":"---\nabbrlink: 156c3684\ncategories:\n - - 分享\ndate: '2021-10-11 10:21:00'\nexcerpt: >-\n 昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios 用编程器写入之后发现无法开机。\n 用编程器备份的bios是8m,用amibios工具备份下来的只有6m。 后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。\n bios尝试计划至此被动完结。 笔记本目前已经被我肢解。 对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点 少折腾还能省钱-_-\n 在外网找到了一个...\npublished: true\ntags:\n - 驱动\n - 主板\n - nvme\n - 笔记本\n - bios\n - 编程器\n - 焊盘\ntitle: 关于nec vk22t添加nvme驱动\nupdated: 'Thu, 13 Apr 2023 07:29:39 GMT'\n---\n昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios\n用编程器写入之后发现无法开机。\n用编程器备份的bios是8m,用amibios工具备份下来的只有6m。\n后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。\nbios尝试计划至此被动完结。\n笔记本目前已经被我肢解。\n对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点\n少折腾还能省钱-_-\n\n在外网找到了一个small版的模块或许有用\nhttps://blog.asbid.cn/nvme-module-small.html\n","slug":"2021-10-11-nec_vk22t-nvme","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyew001joko0et1hdhch","content":"

昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios
用编程器写入之后发现无法开机。
用编程器备份的bios是8m,用amibios工具备份下来的只有6m。
后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。
bios尝试计划至此被动完结。
笔记本目前已经被我肢解。
对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点
少折腾还能省钱-_-

\n

在外网找到了一个small版的模块或许有用
https://blog.asbid.cn/nvme-module-small.html

\n","site":{"data":{}},"more":"

昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios
用编程器写入之后发现无法开机。
用编程器备份的bios是8m,用amibios工具备份下来的只有6m。
后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。
bios尝试计划至此被动完结。
笔记本目前已经被我肢解。
对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点
少折腾还能省钱-_-

\n

在外网找到了一个small版的模块或许有用
https://blog.asbid.cn/nvme-module-small.html

\n"},{"title":"nvme模块small","published":1,"hideInList":false,"isTop":false,"abbrlink":"e3e6b5d8","date":"2021-10-13T06:38:00.000Z","feature":null,"_content":"\n\nNvmExpressDxe_Small_Compressed.ffs \n\n##下载地址\n\n[NvmExpressDxe_Small_Compressed.ffs .zip][1]\n\n资源来自外网没本人有测试,请自行测试\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/3465048984.zip","source":"_posts/2021-10-13-nvme-mod-small.md","raw":"---\ntitle: nvme模块small\ntags:\n - zip\npublished: true\nhideInList: false\nisTop: false\nabbrlink: e3e6b5d8\ndate: 2021-10-13 14:38:00\nfeature:\n---\n\n\nNvmExpressDxe_Small_Compressed.ffs \n\n##下载地址\n\n[NvmExpressDxe_Small_Compressed.ffs .zip][1]\n\n资源来自外网没本人有测试,请自行测试\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/3465048984.zip","slug":"2021-10-13-nvme-mod-small","updated":"2023-09-29T07:51:06.340Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyez001loko06bsidojx","content":"

NvmExpressDxe_Small_Compressed.ffs

\n

##下载地址

\n

[NvmExpressDxe_Small_Compressed.ffs .zip][1]

\n

资源来自外网没本人有测试,请自行测试
[1]: https://blog.asbid.cn/usr/uploads/2021/10/3465048984.zip

\n","site":{"data":{}},"excerpt":"","more":"

NvmExpressDxe_Small_Compressed.ffs

\n

##下载地址

\n

[NvmExpressDxe_Small_Compressed.ffs .zip][1]

\n

资源来自外网没本人有测试,请自行测试
[1]: https://blog.asbid.cn/usr/uploads/2021/10/3465048984.zip

\n"},{"title":"nec vk22t bios 备份","published":1,"hideInList":false,"isTop":false,"abbrlink":"6857bb45","date":"2021-10-13T03:40:00.000Z","feature":null,"_content":"\n\n本人通过编程器从BIOS芯片中读出的原厂bios\n\n##下载地址\n\n\n[vk22.zip][1]\n\n不保证有错误。\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/2626273821.zip","source":"_posts/2021-10-13-nec_vk22t_bios.md","raw":"---\ntitle: nec vk22t bios 备份\ntags:\n - 下载\n - 地址\npublished: true\nhideInList: false\nisTop: false\nabbrlink: 6857bb45\ncategories: 分享\ndate: 2021-10-13 11:40:00\nfeature:\n---\n\n\n本人通过编程器从BIOS芯片中读出的原厂bios\n\n##下载地址\n\n\n[vk22.zip][1]\n\n不保证有错误。\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/2626273821.zip","slug":"2021-10-13-nec_vk22t_bios","updated":"2023-09-29T07:51:06.339Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf0001poko0gmyr00wf","content":"

本人通过编程器从BIOS芯片中读出的原厂bios

\n

##下载地址

\n

[vk22.zip][1]

\n

不保证有错误。
[1]: https://blog.asbid.cn/usr/uploads/2021/10/2626273821.zip

\n","site":{"data":{}},"excerpt":"","more":"

本人通过编程器从BIOS芯片中读出的原厂bios

\n

##下载地址

\n

[vk22.zip][1]

\n

不保证有错误。
[1]: https://blog.asbid.cn/usr/uploads/2021/10/2626273821.zip

\n"},{"abbrlink":"244f7c76","date":"2021-10-19T07:32:28.000Z","excerpt":"用来修复黑苹果扬声器无声的情况 下载地址 归档.zip ","published":1,"title":"onda h410ipc codec提取","updated":"2023-04-13T07:30:57.000Z","_content":"用来修复黑苹果扬声器无声的情况\n\n## 下载地址\n\n[归档.zip][1]\n\n[1]: https://blogcdn.asbid.cn/2021/10/19/1634628706.zip\n","source":"_posts/2021-10-19-onda_h410ipc_codec.md","raw":"---\nabbrlink: 244f7c76\ncategories:\n - - 分享\ndate: '2021-10-19 15:32:28'\nexcerpt: '用来修复黑苹果扬声器无声的情况 下载地址 归档.zip '\npublished: true\ntags:\n - 苹果\n - 情况\n - 地址\n - zip\n - 归档\n - 无声\n - 扬声器\n - 修复\ntitle: onda h410ipc codec提取\nupdated: 'Thu, 13 Apr 2023 07:30:57 GMT'\n---\n用来修复黑苹果扬声器无声的情况\n\n## 下载地址\n\n[归档.zip][1]\n\n[1]: https://blogcdn.asbid.cn/2021/10/19/1634628706.zip\n","slug":"2021-10-19-onda_h410ipc_codec","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf1001soko01igb6ki8","content":"

用来修复黑苹果扬声器无声的情况

\n

下载地址

归档.zip

\n","site":{"data":{}},"more":"

用来修复黑苹果扬声器无声的情况

\n

下载地址

归档.zip

\n"},{"title":"NEC vk22t bios 添加nvme模块支持","published":1,"hideInList":false,"abbrlink":"de19f54c","date":"2021-10-19T03:08:00.000Z","feature":null,"_content":"\n\n## 关于\n偶然发现NEC vk22t的m2是可以识别出nvme协议的固态硬盘,但是不支持nvme的引导。\n所以添加了nvme模块\n需要编程器刷入\n由于手头没有本子测试,有问题可以留言\n\n\n## 下载地址\n\n\n[vk22t.zip][1]\n\n\n\n\n\n\n [1]: https://blogcdn.asbid.cn/2021/10/19/1634612890.zip","source":"_posts/2021-10-19-NEC_vk22t_bios_nvme.md","raw":"---\ntitle: NEC vk22t bios 添加nvme模块支持\ntags:\n - 下载\n - 地址\n - zip\n - vk22t\npublished: true\nhideInList: false\ncategories: 分享\nabbrlink: de19f54c\ndate: 2021-10-19 11:08:00\nfeature:\n---\n\n\n## 关于\n偶然发现NEC vk22t的m2是可以识别出nvme协议的固态硬盘,但是不支持nvme的引导。\n所以添加了nvme模块\n需要编程器刷入\n由于手头没有本子测试,有问题可以留言\n\n\n## 下载地址\n\n\n[vk22t.zip][1]\n\n\n\n\n\n\n [1]: https://blogcdn.asbid.cn/2021/10/19/1634612890.zip","slug":"2021-10-19-NEC_vk22t_bios_nvme","updated":"2023-09-29T07:51:06.340Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf1001xoko08uo5ghw4","content":"

关于

偶然发现NEC vk22t的m2是可以识别出nvme协议的固态硬盘,但是不支持nvme的引导。
所以添加了nvme模块
需要编程器刷入
由于手头没有本子测试,有问题可以留言

\n

下载地址

vk22t.zip

\n","site":{"data":{}},"excerpt":"","more":"

关于

偶然发现NEC vk22t的m2是可以识别出nvme协议的固态硬盘,但是不支持nvme的引导。
所以添加了nvme模块
需要编程器刷入
由于手头没有本子测试,有问题可以留言

\n

下载地址

vk22t.zip

\n"},{"title":"肥猫家rx560 4g vbios备份","published":1,"hideInList":false,"feature":"https://blogcdn.asbid.cn/2021/10/15/1634282558.png","isTop":false,"abbrlink":"882b6242","date":"2021-12-14T07:38:00.000Z","_content":"\n\n原来是海力士颗粒后来返厂维修成了三星颗粒且已经开核为1024sp\n三星颗粒的可以尝试刷此BIOS\n## 下载地址\n![请输入图片描述][1]\n[请打赏后下载][2]\n\n\n [1]: https://blogcdn.asbid.cn/2021/10/15/1634282558.png\n [2]: https://blogcdn.asbid.cn/2021/12/14/1639467491.zip","source":"_posts/2021-12-14-rx560_4g_vbios.md","raw":"---\ntitle: 肥猫家rx560 4g vbios备份\ntags:\n - 下载\n - bios\n - 地址\n - 颗粒\n - 打赏\n - 海力士\npublished: true\nhideInList: false\nfeature: 'https://blogcdn.asbid.cn/2021/10/15/1634282558.png'\nisTop: false\nabbrlink: 882b6242\ndate: 2021-12-14 15:38:00\n---\n\n\n原来是海力士颗粒后来返厂维修成了三星颗粒且已经开核为1024sp\n三星颗粒的可以尝试刷此BIOS\n## 下载地址\n![请输入图片描述][1]\n[请打赏后下载][2]\n\n\n [1]: https://blogcdn.asbid.cn/2021/10/15/1634282558.png\n [2]: https://blogcdn.asbid.cn/2021/12/14/1639467491.zip","slug":"2021-12-14-rx560_4g_vbios","updated":"2023-09-29T07:51:06.341Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf20020oko00eev0xhh","content":"

原来是海力士颗粒后来返厂维修成了三星颗粒且已经开核为1024sp
三星颗粒的可以尝试刷此BIOS

\n

下载地址

\"请输入图片描述\"
请打赏后下载

\n","site":{"data":{}},"excerpt":"","more":"

原来是海力士颗粒后来返厂维修成了三星颗粒且已经开核为1024sp
三星颗粒的可以尝试刷此BIOS

\n

下载地址

\"请输入图片描述\"
请打赏后下载

\n"},{"title":"2023年黑苹果amd免驱显卡购买推荐","published":1,"hideInList":false,"isTop":true,"abbrlink":"82e8a6ff","date":"2022-01-21T08:50:00.000Z","feature":null,"_content":"\n\n## Navi 20系列 从bigsur开始支持\nRX 6600\nRX 6600 XT\nRX 6800\nRX 6800 XT\nRX 6900 XT \n## Navi 10系列 从Catalina开始支持\nRX 5500\nRX 5500 XT\nRX 5600\nRX 5600 XT\nRX 5700\nRX 5700 XT\nRX 5700 XT 50周年纪念版\n如遇到黑屏,需要boot参数agdpmod=pikera才能正确显示\n## Vega 20系列 从Mojave开始支持\nRadeon VII\n## Vega 10系列 从High Sierra开始支持\nVega 64 Liquid\nVega 64\nVega 56\nVega Frontier Edition\nRadeon Pro WX 9100\nRadeon Pro WX 7100\n## Polaris架构10和20系列 从Sierra开始支持\n400系列:\n\nRX 480\nRX 470D\nRX 470\nRX 460\nRX 590\nRX 580X\nRX 580\nRX 570X\nRX 570\nRX 560X\nRX 560\nWX 5100\nWX 4100\nE9550\n\n还有些同Polaris核心的\nrx550\n## R7 / R9系列 从Yosemite开始支持\nR9 Fury X\nR9 Fury\nR9 Nano\nR9 390(需要FakeID)\nR9 290X / 390X\nR9 290/390(需提供FakeID)\nR9 280x / 380x(不一定成功)\nR9 280/380(需要FakeID)\nR9 270X / 370X\nR7 270/370(需提供FakeID)\nR7 265\nR7 260x / 360x\nR9 260/360(根据型号可能需要FakeID)\nR9 255\nR7 250X\nR7 250(需提供FakeID)\nR7 240(需要FakeID)\n## HD 8000系列 从Mountain Lion开始支持\nHD 8740\nHD 8760\nHD 8770\nHD 8850\nHD 8870\nHD 8890\nHD 8950\nHD 8970\n## HD 7000系列 从Mountain Lion开始支持\nDual AMD FirePro D300\nDual AMD FirePro D500\nDual AMD FirePro D700\nFirePro W5100(FakeID needed)\nFirePro W7000\nFirePro W9000\nHD 7700\nHD 7730\nHD 7750\nHD 7770\nHD 7790\nHD 7850\nHD 7870\nHD 7870 XT\nHD 7950\nHD 7970\nHD 7990","source":"_posts/2022-01-21-2023-amd-gpu.md","raw":"---\ntitle: 2023年黑苹果amd免驱显卡购买推荐\ntags:\n - 黑苹果\n - 显卡\n - 免驱\n - amd\npublished: true\nhideInList: false\nisTop: true\nabbrlink: 82e8a6ff\ndate: 2022-01-21 16:50:00\nfeature:\n---\n\n\n## Navi 20系列 从bigsur开始支持\nRX 6600\nRX 6600 XT\nRX 6800\nRX 6800 XT\nRX 6900 XT \n## Navi 10系列 从Catalina开始支持\nRX 5500\nRX 5500 XT\nRX 5600\nRX 5600 XT\nRX 5700\nRX 5700 XT\nRX 5700 XT 50周年纪念版\n如遇到黑屏,需要boot参数agdpmod=pikera才能正确显示\n## Vega 20系列 从Mojave开始支持\nRadeon VII\n## Vega 10系列 从High Sierra开始支持\nVega 64 Liquid\nVega 64\nVega 56\nVega Frontier Edition\nRadeon Pro WX 9100\nRadeon Pro WX 7100\n## Polaris架构10和20系列 从Sierra开始支持\n400系列:\n\nRX 480\nRX 470D\nRX 470\nRX 460\nRX 590\nRX 580X\nRX 580\nRX 570X\nRX 570\nRX 560X\nRX 560\nWX 5100\nWX 4100\nE9550\n\n还有些同Polaris核心的\nrx550\n## R7 / R9系列 从Yosemite开始支持\nR9 Fury X\nR9 Fury\nR9 Nano\nR9 390(需要FakeID)\nR9 290X / 390X\nR9 290/390(需提供FakeID)\nR9 280x / 380x(不一定成功)\nR9 280/380(需要FakeID)\nR9 270X / 370X\nR7 270/370(需提供FakeID)\nR7 265\nR7 260x / 360x\nR9 260/360(根据型号可能需要FakeID)\nR9 255\nR7 250X\nR7 250(需提供FakeID)\nR7 240(需要FakeID)\n## HD 8000系列 从Mountain Lion开始支持\nHD 8740\nHD 8760\nHD 8770\nHD 8850\nHD 8870\nHD 8890\nHD 8950\nHD 8970\n## HD 7000系列 从Mountain Lion开始支持\nDual AMD FirePro D300\nDual AMD FirePro D500\nDual AMD FirePro D700\nFirePro W5100(FakeID needed)\nFirePro W7000\nFirePro W9000\nHD 7700\nHD 7730\nHD 7750\nHD 7770\nHD 7790\nHD 7850\nHD 7870\nHD 7870 XT\nHD 7950\nHD 7970\nHD 7990","slug":"2022-01-21-2023-amd-gpu","updated":"2023-09-29T07:51:06.341Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf20023oko0hxdl1nde","content":"

Navi 20系列 从bigsur开始支持

RX 6600
RX 6600 XT
RX 6800
RX 6800 XT
RX 6900 XT

\n

Navi 10系列 从Catalina开始支持

RX 5500
RX 5500 XT
RX 5600
RX 5600 XT
RX 5700
RX 5700 XT
RX 5700 XT 50周年纪念版
如遇到黑屏,需要boot参数agdpmod=pikera才能正确显示

\n

Vega 20系列 从Mojave开始支持

Radeon VII

\n

Vega 10系列 从High Sierra开始支持

Vega 64 Liquid
Vega 64
Vega 56
Vega Frontier Edition
Radeon Pro WX 9100
Radeon Pro WX 7100
## Polaris架构10和20系列 从Sierra开始支持
400系列:

\n

RX 480
RX 470D
RX 470
RX 460
RX 590
RX 580X
RX 580
RX 570X
RX 570
RX 560X
RX 560
WX 5100
WX 4100
E9550

\n

还有些同Polaris核心的
rx550

\n

R7 / R9系列 从Yosemite开始支持

R9 Fury X
R9 Fury
R9 Nano
R9 390(需要FakeID)
R9 290X / 390X
R9 290/390(需提供FakeID)
R9 280x / 380x(不一定成功)
R9 280/380(需要FakeID)
R9 270X / 370X
R7 270/370(需提供FakeID)
R7 265
R7 260x / 360x
R9 260/360(根据型号可能需要FakeID)
R9 255
R7 250X
R7 250(需提供FakeID)
R7 240(需要FakeID)

\n

HD 8000系列 从Mountain Lion开始支持

HD 8740
HD 8760
HD 8770
HD 8850
HD 8870
HD 8890
HD 8950
HD 8970

\n

HD 7000系列 从Mountain Lion开始支持

Dual AMD FirePro D300
Dual AMD FirePro D500
Dual AMD FirePro D700
FirePro W5100(FakeID needed)
FirePro W7000
FirePro W9000
HD 7700
HD 7730
HD 7750
HD 7770
HD 7790
HD 7850
HD 7870
HD 7870 XT
HD 7950
HD 7970
HD 7990

\n","site":{"data":{}},"excerpt":"","more":"

Navi 20系列 从bigsur开始支持

RX 6600
RX 6600 XT
RX 6800
RX 6800 XT
RX 6900 XT

\n

Navi 10系列 从Catalina开始支持

RX 5500
RX 5500 XT
RX 5600
RX 5600 XT
RX 5700
RX 5700 XT
RX 5700 XT 50周年纪念版
如遇到黑屏,需要boot参数agdpmod=pikera才能正确显示

\n

Vega 20系列 从Mojave开始支持

Radeon VII

\n

Vega 10系列 从High Sierra开始支持

Vega 64 Liquid
Vega 64
Vega 56
Vega Frontier Edition
Radeon Pro WX 9100
Radeon Pro WX 7100
## Polaris架构10和20系列 从Sierra开始支持
400系列:

\n

RX 480
RX 470D
RX 470
RX 460
RX 590
RX 580X
RX 580
RX 570X
RX 570
RX 560X
RX 560
WX 5100
WX 4100
E9550

\n

还有些同Polaris核心的
rx550

\n

R7 / R9系列 从Yosemite开始支持

R9 Fury X
R9 Fury
R9 Nano
R9 390(需要FakeID)
R9 290X / 390X
R9 290/390(需提供FakeID)
R9 280x / 380x(不一定成功)
R9 280/380(需要FakeID)
R9 270X / 370X
R7 270/370(需提供FakeID)
R7 265
R7 260x / 360x
R9 260/360(根据型号可能需要FakeID)
R9 255
R7 250X
R7 250(需提供FakeID)
R7 240(需要FakeID)

\n

HD 8000系列 从Mountain Lion开始支持

HD 8740
HD 8760
HD 8770
HD 8850
HD 8870
HD 8890
HD 8950
HD 8970

\n

HD 7000系列 从Mountain Lion开始支持

Dual AMD FirePro D300
Dual AMD FirePro D500
Dual AMD FirePro D700
FirePro W5100(FakeID needed)
FirePro W7000
FirePro W9000
HD 7700
HD 7730
HD 7750
HD 7770
HD 7790
HD 7850
HD 7870
HD 7870 XT
HD 7950
HD 7970
HD 7990

\n"},{"title":"黑苹果固态避坑指南","published":1,"hideInList":false,"isTop":true,"abbrlink":"36a001e5","date":"2022-04-12T07:51:00.000Z","feature":null,"_content":"\n\n`三星 PM961 / PM981 / PM981a / PM991` 会导致 macOS 无法安装或正常运行\n`三星 983ZET`无法安装 macOS;\n\n2019 年 5 月以前出厂的 `三星 970 EVO Plus` 可能存在和 PM9x1 系列类似的问题,但可以通过在Windows环境升级官方固件解决 macOS 兼容问题;\n\n`镁光 2200S `无法安装或稳定运行 macOS;\n`爱国者 P2000 256GB `无法通过 10.15、11.x、12.x 任何一个版本的正常安装流程,但不排除个例的可能;\nmacOS 不支持使用 Intel 傲腾(Optane Memory)或镁光 3D XPoint 进行加速的笔记本电脑;\n下面的型号是与 macOS IONVMeFamily 兼容性不佳的型号(可能无故卡住或运行不正常)\n`英特尔 600P/660P/760P 系列`\n`金士顿 A2000`:配置 S5Z42105 控制器的版本必须搭配 NVMeFix.kext 1.0.8 及以上,也可能完全无法安装;\n`海力士 PC601/PC611/PC711/BC501`:主要见于联想和戴尔笔记本,部分批次正常部分会卡住;\n`技嘉 GIGABYTE M.2 PCIe SSD(比如 GP-GSM2NE8512GNTD)`\n`威刚剑鱼 ADATA Swordfish 2 TB M.2-2280`\n`海力士 SK Hynix HFS001TD9TNG-L5B0B`\n`海力士 SK Hynix P31`\n`镁光 Micron 2200V MTFDHBA512TCK` -`移速的256G`同样使用的镁光颗粒无法安装;\n`阿斯加特 Asgard AN3+ (STAR1000P)`\n`朗科 Netac NVME SSD 480`\n`西部数据 SN550/570/730/750/850 `都能正常安装和运行 macOS;\n`三星 970EVO/Pro/Plus(升级固件后)`和 `980/980 Pro` 都能正常安装和运行 macOS,但是此系列存在 TRIM 支持问题;\n`海盗船 MP400/MP600 `系列均能正常安装运行 macOS;\n绝大部分常见的 SATA 接口固态盘都能正常安装和运行 macOS;\n不完全支持``` TRIM```(主要影响特定条件下的写入速度,什么是 TRIM?),但安装运行正常的型号:\n`三星 Samsung 950 Pro`\n`三星 Samsung 960 Evo/Pro`\n`三星 Samsung 970 Evo/Pro`\n「重要提示」在 macOS 12.0 及以上版本中,OpenCore 无法再修改 APFS 文件系统的 TRIM 超时数值,部分执行 TRIM 相对较慢的固态硬盘(主要是三星的控制器)将没有足够的时间执行 TRIM 操作。不正确的设置可能导致进入系统缓慢,因此对 macOS TRIM 支持度不佳的硬盘建议将 `SetApfsTrimTimeout `值改成 0 以关闭 TRIM,或 -1 以关闭该功能。此现象在 12.3 及以上的版本中尤其明显。\n完整支持 macOS TRIM 的型号:\n`西部数据 SN5xx/7xx `系列(未完全测试)\n`英睿达 Crucial P1 1TB NVME`(SM2263EN,未完全测试)\n`金典 KingDian S280(SATA)`\n`浦科特 PLEXTOR M5Pro(SATA)`\n`三星 Samsung 850 PRO`(SATA,未完全测试)\n`三星 Samsung 870 EVO`(SATA,未完全测试)","source":"_posts/2022-04-12-ssd.md","raw":"---\ntitle: 黑苹果固态避坑指南\ntags:\n - macos\n - 固态\n - 硬盘\n - samsung\npublished: true\ncategories: 分享\nhideInList: false\nisTop: true\nabbrlink: 36a001e5\ndate: 2022-04-12 15:51:00\nfeature:\n---\n\n\n`三星 PM961 / PM981 / PM981a / PM991` 会导致 macOS 无法安装或正常运行\n`三星 983ZET`无法安装 macOS;\n\n2019 年 5 月以前出厂的 `三星 970 EVO Plus` 可能存在和 PM9x1 系列类似的问题,但可以通过在Windows环境升级官方固件解决 macOS 兼容问题;\n\n`镁光 2200S `无法安装或稳定运行 macOS;\n`爱国者 P2000 256GB `无法通过 10.15、11.x、12.x 任何一个版本的正常安装流程,但不排除个例的可能;\nmacOS 不支持使用 Intel 傲腾(Optane Memory)或镁光 3D XPoint 进行加速的笔记本电脑;\n下面的型号是与 macOS IONVMeFamily 兼容性不佳的型号(可能无故卡住或运行不正常)\n`英特尔 600P/660P/760P 系列`\n`金士顿 A2000`:配置 S5Z42105 控制器的版本必须搭配 NVMeFix.kext 1.0.8 及以上,也可能完全无法安装;\n`海力士 PC601/PC611/PC711/BC501`:主要见于联想和戴尔笔记本,部分批次正常部分会卡住;\n`技嘉 GIGABYTE M.2 PCIe SSD(比如 GP-GSM2NE8512GNTD)`\n`威刚剑鱼 ADATA Swordfish 2 TB M.2-2280`\n`海力士 SK Hynix HFS001TD9TNG-L5B0B`\n`海力士 SK Hynix P31`\n`镁光 Micron 2200V MTFDHBA512TCK` -`移速的256G`同样使用的镁光颗粒无法安装;\n`阿斯加特 Asgard AN3+ (STAR1000P)`\n`朗科 Netac NVME SSD 480`\n`西部数据 SN550/570/730/750/850 `都能正常安装和运行 macOS;\n`三星 970EVO/Pro/Plus(升级固件后)`和 `980/980 Pro` 都能正常安装和运行 macOS,但是此系列存在 TRIM 支持问题;\n`海盗船 MP400/MP600 `系列均能正常安装运行 macOS;\n绝大部分常见的 SATA 接口固态盘都能正常安装和运行 macOS;\n不完全支持``` TRIM```(主要影响特定条件下的写入速度,什么是 TRIM?),但安装运行正常的型号:\n`三星 Samsung 950 Pro`\n`三星 Samsung 960 Evo/Pro`\n`三星 Samsung 970 Evo/Pro`\n「重要提示」在 macOS 12.0 及以上版本中,OpenCore 无法再修改 APFS 文件系统的 TRIM 超时数值,部分执行 TRIM 相对较慢的固态硬盘(主要是三星的控制器)将没有足够的时间执行 TRIM 操作。不正确的设置可能导致进入系统缓慢,因此对 macOS TRIM 支持度不佳的硬盘建议将 `SetApfsTrimTimeout `值改成 0 以关闭 TRIM,或 -1 以关闭该功能。此现象在 12.3 及以上的版本中尤其明显。\n完整支持 macOS TRIM 的型号:\n`西部数据 SN5xx/7xx `系列(未完全测试)\n`英睿达 Crucial P1 1TB NVME`(SM2263EN,未完全测试)\n`金典 KingDian S280(SATA)`\n`浦科特 PLEXTOR M5Pro(SATA)`\n`三星 Samsung 850 PRO`(SATA,未完全测试)\n`三星 Samsung 870 EVO`(SATA,未完全测试)","slug":"2022-04-12-ssd","updated":"2023-09-29T07:51:06.342Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf30026oko0a5a07rta","content":"

三星 PM961 / PM981 / PM981a / PM991 会导致 macOS 无法安装或正常运行
三星 983ZET无法安装 macOS;

\n

2019 年 5 月以前出厂的 三星 970 EVO Plus 可能存在和 PM9x1 系列类似的问题,但可以通过在Windows环境升级官方固件解决 macOS 兼容问题;

\n

镁光 2200S 无法安装或稳定运行 macOS;
爱国者 P2000 256GB 无法通过 10.15、11.x、12.x 任何一个版本的正常安装流程,但不排除个例的可能;
macOS 不支持使用 Intel 傲腾(Optane Memory)或镁光 3D XPoint 进行加速的笔记本电脑;
下面的型号是与 macOS IONVMeFamily 兼容性不佳的型号(可能无故卡住或运行不正常)
英特尔 600P/660P/760P 系列
金士顿 A2000:配置 S5Z42105 控制器的版本必须搭配 NVMeFix.kext 1.0.8 及以上,也可能完全无法安装;
海力士 PC601/PC611/PC711/BC501:主要见于联想和戴尔笔记本,部分批次正常部分会卡住;
技嘉 GIGABYTE M.2 PCIe SSD(比如 GP-GSM2NE8512GNTD)
威刚剑鱼 ADATA Swordfish 2 TB M.2-2280
海力士 SK Hynix HFS001TD9TNG-L5B0B
海力士 SK Hynix P31
镁光 Micron 2200V MTFDHBA512TCK -移速的256G同样使用的镁光颗粒无法安装;
阿斯加特 Asgard AN3+ (STAR1000P)
朗科 Netac NVME SSD 480
西部数据 SN550/570/730/750/850 都能正常安装和运行 macOS;
三星 970EVO/Pro/Plus(升级固件后)980/980 Pro 都能正常安装和运行 macOS,但是此系列存在 TRIM 支持问题;
海盗船 MP400/MP600 系列均能正常安装运行 macOS;
绝大部分常见的 SATA 接口固态盘都能正常安装和运行 macOS;
不完全支持 TRIM(主要影响特定条件下的写入速度,什么是 TRIM?),但安装运行正常的型号:
三星 Samsung 950 Pro
三星 Samsung 960 Evo/Pro
三星 Samsung 970 Evo/Pro
「重要提示」在 macOS 12.0 及以上版本中,OpenCore 无法再修改 APFS 文件系统的 TRIM 超时数值,部分执行 TRIM 相对较慢的固态硬盘(主要是三星的控制器)将没有足够的时间执行 TRIM 操作。不正确的设置可能导致进入系统缓慢,因此对 macOS TRIM 支持度不佳的硬盘建议将 SetApfsTrimTimeout 值改成 0 以关闭 TRIM,或 -1 以关闭该功能。此现象在 12.3 及以上的版本中尤其明显。
完整支持 macOS TRIM 的型号:
西部数据 SN5xx/7xx 系列(未完全测试)
英睿达 Crucial P1 1TB NVME(SM2263EN,未完全测试)
金典 KingDian S280(SATA)
浦科特 PLEXTOR M5Pro(SATA)
三星 Samsung 850 PRO(SATA,未完全测试)
三星 Samsung 870 EVO(SATA,未完全测试)

\n","site":{"data":{}},"excerpt":"","more":"

三星 PM961 / PM981 / PM981a / PM991 会导致 macOS 无法安装或正常运行
三星 983ZET无法安装 macOS;

\n

2019 年 5 月以前出厂的 三星 970 EVO Plus 可能存在和 PM9x1 系列类似的问题,但可以通过在Windows环境升级官方固件解决 macOS 兼容问题;

\n

镁光 2200S 无法安装或稳定运行 macOS;
爱国者 P2000 256GB 无法通过 10.15、11.x、12.x 任何一个版本的正常安装流程,但不排除个例的可能;
macOS 不支持使用 Intel 傲腾(Optane Memory)或镁光 3D XPoint 进行加速的笔记本电脑;
下面的型号是与 macOS IONVMeFamily 兼容性不佳的型号(可能无故卡住或运行不正常)
英特尔 600P/660P/760P 系列
金士顿 A2000:配置 S5Z42105 控制器的版本必须搭配 NVMeFix.kext 1.0.8 及以上,也可能完全无法安装;
海力士 PC601/PC611/PC711/BC501:主要见于联想和戴尔笔记本,部分批次正常部分会卡住;
技嘉 GIGABYTE M.2 PCIe SSD(比如 GP-GSM2NE8512GNTD)
威刚剑鱼 ADATA Swordfish 2 TB M.2-2280
海力士 SK Hynix HFS001TD9TNG-L5B0B
海力士 SK Hynix P31
镁光 Micron 2200V MTFDHBA512TCK -移速的256G同样使用的镁光颗粒无法安装;
阿斯加特 Asgard AN3+ (STAR1000P)
朗科 Netac NVME SSD 480
西部数据 SN550/570/730/750/850 都能正常安装和运行 macOS;
三星 970EVO/Pro/Plus(升级固件后)980/980 Pro 都能正常安装和运行 macOS,但是此系列存在 TRIM 支持问题;
海盗船 MP400/MP600 系列均能正常安装运行 macOS;
绝大部分常见的 SATA 接口固态盘都能正常安装和运行 macOS;
不完全支持 TRIM(主要影响特定条件下的写入速度,什么是 TRIM?),但安装运行正常的型号:
三星 Samsung 950 Pro
三星 Samsung 960 Evo/Pro
三星 Samsung 970 Evo/Pro
「重要提示」在 macOS 12.0 及以上版本中,OpenCore 无法再修改 APFS 文件系统的 TRIM 超时数值,部分执行 TRIM 相对较慢的固态硬盘(主要是三星的控制器)将没有足够的时间执行 TRIM 操作。不正确的设置可能导致进入系统缓慢,因此对 macOS TRIM 支持度不佳的硬盘建议将 SetApfsTrimTimeout 值改成 0 以关闭 TRIM,或 -1 以关闭该功能。此现象在 12.3 及以上的版本中尤其明显。
完整支持 macOS TRIM 的型号:
西部数据 SN5xx/7xx 系列(未完全测试)
英睿达 Crucial P1 1TB NVME(SM2263EN,未完全测试)
金典 KingDian S280(SATA)
浦科特 PLEXTOR M5Pro(SATA)
三星 Samsung 850 PRO(SATA,未完全测试)
三星 Samsung 870 EVO(SATA,未完全测试)

\n"},{"title":"NEC VK22T黑苹果OC0.8.0引导macOS12.4","published":1,"hideInList":false,"isTop":false,"abbrlink":"d0290d4f","date":"2022-06-01T00:33:00.000Z","feature":null,"_content":"\n\n# NEC VK22评测\n\n地址请参阅\n\n\nhttps://jkjoy.cn/2021/89f51950.html\n\n\n## OPENCORE引导下载\n\n[nec vk22.zip](https://blogcdn.asbid.cn/2022/06/01/1654043604.zip)\n","source":"_posts/2022-06-01-NEC_VK22T-OC0.8.0-macOS12.4.md","raw":"---\ntitle: NEC VK22T黑苹果OC0.8.0引导macOS12.4\ntags:\n - 黑苹果\n - opencore\n - vk22\n - nec\npublished: true\nhideInList: false\nisTop: false\nabbrlink: d0290d4f\ndate: 2022-06-01 08:33:00\nfeature:\ncategories: 分享\n---\n\n\n# NEC VK22评测\n\n地址请参阅\n\n\nhttps://jkjoy.cn/2021/89f51950.html\n\n\n## OPENCORE引导下载\n\n[nec vk22.zip](https://blogcdn.asbid.cn/2022/06/01/1654043604.zip)\n","slug":"2022-06-01-NEC_VK22T-OC0.8.0-macOS12.4","updated":"2023-09-29T07:51:06.345Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf30028oko09ts6ekbs","content":"

NEC VK22评测

地址请参阅

\n

https://jkjoy.cn/2021/89f51950.html

\n

OPENCORE引导下载

nec vk22.zip

\n","site":{"data":{}},"excerpt":"","more":"

NEC VK22评测

地址请参阅

\n

https://jkjoy.cn/2021/89f51950.html

\n

OPENCORE引导下载

nec vk22.zip

\n"},{"abbrlink":"68647b75","date":"2022-07-27T02:39:00.000Z","excerpt":"centos下安装RPM安装包 bash sudo yum localinstall file.rpm ubuntu下安装deb安装包 bash sudo dpkg -i 安装包名称.deb ","published":1,"title":"Linux下本地安装包命令","updated":"2023-04-13T07:32:16.000Z","_content":"## centos下安装RPM安装包\n\n```bash\nsudo yum localinstall file.rpm\n```\n\n## ubuntu下安装deb安装包\n\n```bash\n sudo dpkg -i 安装包名称.deb\n```\n","source":"_posts/2022-07-27-Linux-cms.md","raw":"---\nabbrlink: 68647b75\ncategories: 分享\ndate: '2022-07-27 10:39:00'\nexcerpt: >-\n centos下安装RPM安装包 bash sudo yum localinstall file.rpm ubuntu下安装deb安装包 bash sudo\n dpkg -i 安装包名称.deb \npublished: true\ntags:\n - 命令\n - linux\ntitle: Linux下本地安装包命令\nupdated: 'Thu, 13 Apr 2023 07:32:16 GMT'\n---\n## centos下安装RPM安装包\n\n```bash\nsudo yum localinstall file.rpm\n```\n\n## ubuntu下安装deb安装包\n\n```bash\n sudo dpkg -i 安装包名称.deb\n```\n","slug":"2022-07-27-Linux-cms","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf4002boko0c90100qh","content":"

centos下安装RPM安装包

1
sudo yum localinstall file.rpm
\n\n

ubuntu下安装deb安装包

1
sudo dpkg -i 安装包名称.deb
\n","site":{"data":{}},"more":"

centos下安装RPM安装包

1
sudo yum localinstall file.rpm
\n\n

ubuntu下安装deb安装包

1
sudo dpkg -i 安装包名称.deb
\n"},{"title":"精粤H97i gmaing黑苹果引导","published":1,"hideInList":false,"isTop":false,"abbrlink":"df7a6812","date":"2022-07-22T01:32:00.000Z","feature":null,"_content":"\n\n# 配置\n| 配置 | 型号 |\n| ------------ | ------------ |\n| CPU | I5 5575r |\n| 主板| 精粤H97i| \n| 内存|AMD专用条|\n|硬盘|SATA固态256GB|\n|网卡|bcm943224|\n\n# 引导\n下载地址\n!(论坛)https://bbs.asbid.cn\n","source":"_posts/2022-07-22-H97i_gmaing.md","raw":"---\ntitle: 精粤H97i gmaing黑苹果引导\ntags:\n - 黑苹果\n - 精粤\n - h97i\n - bcm943224\npublished: true\ncategories: 分享\nhideInList: false\nisTop: false\nabbrlink: df7a6812\ndate: 2022-07-22 09:32:00\nfeature:\n---\n\n\n# 配置\n| 配置 | 型号 |\n| ------------ | ------------ |\n| CPU | I5 5575r |\n| 主板| 精粤H97i| \n| 内存|AMD专用条|\n|硬盘|SATA固态256GB|\n|网卡|bcm943224|\n\n# 引导\n下载地址\n!(论坛)https://bbs.asbid.cn\n","slug":"2022-07-22-H97i_gmaing","updated":"2023-09-29T07:51:06.346Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf4002doko081pe6hp0","content":"

配置

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
配置型号
CPUI5 5575r
主板精粤H97i
内存AMD专用条
硬盘SATA固态256GB
网卡bcm943224
\n

引导

下载地址
!(论坛)https://bbs.asbid.cn

\n","site":{"data":{}},"excerpt":"","more":"

配置

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
配置型号
CPUI5 5575r
主板精粤H97i
内存AMD专用条
硬盘SATA固态256GB
网卡bcm943224
\n

引导

下载地址
!(论坛)https://bbs.asbid.cn

\n"},{"title":"macOS锁屏时钟fliqlo","published":1,"hideInList":false,"feature":"https://blogcdn.asbid.cn/2022/08/08/1659921276.png","isTop":false,"abbrlink":"342aa622","date":"2022-08-08T01:14:00.000Z","_content":"\n\n一款好看的锁屏时钟\n同时也有Windows版本可以下载\n## 截图\n\n![QQ20220808-091421@2x.png][1]\n## 下载地址\n\n\n \nhttps://pan.asbid.cn/d/123%E7%BD%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/fliqlo171.dmg\n \n\n\n [1]: https://blogcdn.asbid.cn/2022/08/08/1659921276.png","source":"_posts/2022-08-08-macOS-fliqlo.md","raw":"---\ntitle: macOS锁屏时钟fliqlo\ntags:\n - 下载\n - macos\n - fliqlo\npublished: true\ncategories: 分享\nhideInList: false\nfeature: 'https://blogcdn.asbid.cn/2022/08/08/1659921276.png'\nisTop: false\nabbrlink: 342aa622\ndate: 2022-08-08 09:14:00\n---\n\n\n一款好看的锁屏时钟\n同时也有Windows版本可以下载\n## 截图\n\n![QQ20220808-091421@2x.png][1]\n## 下载地址\n\n\n \nhttps://pan.asbid.cn/d/123%E7%BD%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/fliqlo171.dmg\n \n\n\n [1]: https://blogcdn.asbid.cn/2022/08/08/1659921276.png","slug":"2022-08-08-macOS-fliqlo","updated":"2023-09-29T07:51:06.347Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf5002goko06uq18aps","content":"

一款好看的锁屏时钟
同时也有Windows版本可以下载

\n

截图

\"QQ20220808-091421@2x.png\"

\n

下载地址

https://pan.asbid.cn/d/123%E7%BD%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/fliqlo171.dmg

\n","site":{"data":{}},"excerpt":"","more":"

一款好看的锁屏时钟
同时也有Windows版本可以下载

\n

截图

\"QQ20220808-091421@2x.png\"

\n

下载地址

https://pan.asbid.cn/d/123%E7%BD%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/fliqlo171.dmg

\n"},{"title":"Typecho插件CommentsByQQ修改版","published":1,"hideInList":false,"isTop":false,"abbrlink":"93a53ee","date":"2022-09-19T06:25:00.000Z","feature":null,"_content":"\n\n## 简介\n\n基于Typecho插件CommentsByQQ修改\n一直想让qq来通知评论消息。毕竟邮箱之类的还是不太方便。\n原作者的插件QQ机器人已经挂了。所以我自己搭建了一个基于go-http的QQ机器人\n由于本人也是菜鸟,没有后续\n\n## 使用\n\n添加qq机器人153985848为好友\n在后台设置中填写接收消息的qq号即可\n\n## 下载地址\n[CommentsByQQ.zip][1]\n\n\n [1]: https://blogcdn.asbid.cn/2022/09/28/1664332031.zip","source":"_posts/2022-09-19-Typecho-CommentsByQQ.md","raw":"---\ntitle: Typecho插件CommentsByQQ修改版\ntags:\n - typecho\n - chajian\n - CommentsByQQ\npublished: true\ncategories: 分享\nhideInList: false\nisTop: false\nabbrlink: 93a53ee\ndate: 2022-09-19 14:25:00\nfeature:\n---\n\n\n## 简介\n\n基于Typecho插件CommentsByQQ修改\n一直想让qq来通知评论消息。毕竟邮箱之类的还是不太方便。\n原作者的插件QQ机器人已经挂了。所以我自己搭建了一个基于go-http的QQ机器人\n由于本人也是菜鸟,没有后续\n\n## 使用\n\n添加qq机器人153985848为好友\n在后台设置中填写接收消息的qq号即可\n\n## 下载地址\n[CommentsByQQ.zip][1]\n\n\n [1]: https://blogcdn.asbid.cn/2022/09/28/1664332031.zip","slug":"2022-09-19-Typecho-CommentsByQQ","updated":"2023-09-29T07:51:06.347Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf5002ioko0au7d42v6","content":"

简介

基于Typecho插件CommentsByQQ修改
一直想让qq来通知评论消息。毕竟邮箱之类的还是不太方便。
原作者的插件QQ机器人已经挂了。所以我自己搭建了一个基于go-http的QQ机器人
由于本人也是菜鸟,没有后续

\n

使用

添加qq机器人153985848为好友
在后台设置中填写接收消息的qq号即可

\n

下载地址

CommentsByQQ.zip

\n","site":{"data":{}},"excerpt":"","more":"

简介

基于Typecho插件CommentsByQQ修改
一直想让qq来通知评论消息。毕竟邮箱之类的还是不太方便。
原作者的插件QQ机器人已经挂了。所以我自己搭建了一个基于go-http的QQ机器人
由于本人也是菜鸟,没有后续

\n

使用

添加qq机器人153985848为好友
在后台设置中填写接收消息的qq号即可

\n

下载地址

CommentsByQQ.zip

\n"},{"title":"macOS一键安装homebrew国内镜像","published":1,"hideInList":false,"isTop":false,"abbrlink":"d701f25","date":"2022-07-29T07:33:00.000Z","feature":null,"_content":"\n\n官方给出的一键安装由于墙的原因可能无法安装成功。\n所以找到了一个国内镜像的一键安装脚本\n\n```bash\n/bin/zsh -c \"$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)\"\n```","source":"_posts/2022-07-29-macOS-homebrew.md","raw":"---\ntitle: macOS一键安装homebrew国内镜像\ntags:\n - macos\n - homebrew\npublished: true\nhideInList: false\nisTop: false\nabbrlink: d701f25\ncategories: 分享\ndate: 2022-07-29 15:33:00\nfeature:\n---\n\n\n官方给出的一键安装由于墙的原因可能无法安装成功。\n所以找到了一个国内镜像的一键安装脚本\n\n```bash\n/bin/zsh -c \"$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)\"\n```","slug":"2022-07-29-macOS-homebrew","updated":"2023-09-29T07:51:06.346Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf6002loko07qa636nw","content":"

官方给出的一键安装由于墙的原因可能无法安装成功。
所以找到了一个国内镜像的一键安装脚本

\n
1
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
","site":{"data":{}},"excerpt":"","more":"

官方给出的一键安装由于墙的原因可能无法安装成功。
所以找到了一个国内镜像的一键安装脚本

\n
1
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
"},{"title":"华硕b150m-et m2+rx560黑苹果oc0.8.5引导","published":1,"hideInList":false,"feature":"https://blogcdn.asbid.cn/2022/10/21/1666335477.jpg","isTop":false,"abbrlink":"f4d722c5","date":"2022-10-21T06:58:00.000Z","_content":"\n\n## 配置如下\n\ncpu:魔改qhpw 2.2g hz\n主板:华硕b150m-et m2\n内存:8g ddr4 2133mhz\n硬盘:nvme 256gb ssd\n显卡:肥猫家rx560 4gb\n网卡:bcm94360cd\n电源:长城额定300w\n机箱:乔思伯c2黑色\n\n乔思伯这个机箱是个大闷罐,但是显卡功耗低,双烤温度最高75摄氏度\n\n## 截图\n\n![Jietu20221020-144354.jpg][1]\n![Jietu20221021-145738.jpg][2]\n\n## bios设置\n\n关闭 CSM兼容性 \n关闭 VT-D\n关闭 串口\n打开 USB handoff\n关闭 CFG LOCK\n\n## 已驱动\n\n声卡\n网卡\n显卡\n电源管理\n显卡加速\n![Jietu20221021-152807.jpg][3]\n## 引导下载\n [下载地址][4]\n\n\n [1]: https://blogcdn.asbid.cn/2022/10/21/1666335477.jpg\n [2]: https://blogcdn.asbid.cn/2022/10/21/1666335487.jpg\n [3]: https://blogcdn.asbid.cn/2022/10/21/1666337330.jpg\n [4]: https://bbs.dasbid.com/thread/22","source":"_posts/2022-10-21-b150m-et_m2+rx560.md","raw":"---\ntitle: 华硕b150m-et m2+rx560黑苹果oc0.8.5引导\ntags: []\ncategories: 分享\npublished: true\nhideInList: false\nfeature: 'https://blogcdn.asbid.cn/2022/10/21/1666335477.jpg'\nisTop: false\nabbrlink: f4d722c5\ndate: 2022-10-21 14:58:00\n---\n\n\n## 配置如下\n\ncpu:魔改qhpw 2.2g hz\n主板:华硕b150m-et m2\n内存:8g ddr4 2133mhz\n硬盘:nvme 256gb ssd\n显卡:肥猫家rx560 4gb\n网卡:bcm94360cd\n电源:长城额定300w\n机箱:乔思伯c2黑色\n\n乔思伯这个机箱是个大闷罐,但是显卡功耗低,双烤温度最高75摄氏度\n\n## 截图\n\n![Jietu20221020-144354.jpg][1]\n![Jietu20221021-145738.jpg][2]\n\n## bios设置\n\n关闭 CSM兼容性 \n关闭 VT-D\n关闭 串口\n打开 USB handoff\n关闭 CFG LOCK\n\n## 已驱动\n\n声卡\n网卡\n显卡\n电源管理\n显卡加速\n![Jietu20221021-152807.jpg][3]\n## 引导下载\n [下载地址][4]\n\n\n [1]: https://blogcdn.asbid.cn/2022/10/21/1666335477.jpg\n [2]: https://blogcdn.asbid.cn/2022/10/21/1666335487.jpg\n [3]: https://blogcdn.asbid.cn/2022/10/21/1666337330.jpg\n [4]: https://bbs.dasbid.com/thread/22","slug":"2022-10-21-b150m-et_m2+rx560","updated":"2023-09-29T07:51:06.348Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf6002ooko07fxmbgky","content":"

配置如下

cpu:魔改qhpw 2.2g hz
主板:华硕b150m-et m2
内存:8g ddr4 2133mhz
硬盘:nvme 256gb ssd
显卡:肥猫家rx560 4gb
网卡:bcm94360cd
电源:长城额定300w
机箱:乔思伯c2黑色

\n

乔思伯这个机箱是个大闷罐,但是显卡功耗低,双烤温度最高75摄氏度

\n

截图

\"Jietu20221020-144354.jpg\"
\"Jietu20221021-145738.jpg\"

\n

bios设置

关闭 CSM兼容性
关闭 VT-D
关闭 串口
打开 USB handoff
关闭 CFG LOCK

\n

已驱动

声卡
网卡
显卡
电源管理
显卡加速
\"Jietu20221021-152807.jpg\"

\n

引导下载

下载地址

\n","site":{"data":{}},"excerpt":"","more":"

配置如下

cpu:魔改qhpw 2.2g hz
主板:华硕b150m-et m2
内存:8g ddr4 2133mhz
硬盘:nvme 256gb ssd
显卡:肥猫家rx560 4gb
网卡:bcm94360cd
电源:长城额定300w
机箱:乔思伯c2黑色

\n

乔思伯这个机箱是个大闷罐,但是显卡功耗低,双烤温度最高75摄氏度

\n

截图

\"Jietu20221020-144354.jpg\"
\"Jietu20221021-145738.jpg\"

\n

bios设置

关闭 CSM兼容性
关闭 VT-D
关闭 串口
打开 USB handoff
关闭 CFG LOCK

\n

已驱动

声卡
网卡
显卡
电源管理
显卡加速
\"Jietu20221021-152807.jpg\"

\n

引导下载

下载地址

\n"},{"title":"office2016 Mac 版本下载安装及破解激活","published":1,"hideInList":false,"abbrlink":"1387fd73","date":"2022-10-14T00:25:18.000Z","feature":null,"_content":"\n\n一、安装包下载地址\n\nhttp://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft_Office_2016_15.29.16120900_Installer.pkg\n\n二、激活工具\n\n\n\n链接: https://pan.baidu.com/s/1ragcr1M\n\n密码: rcb2\n\n","source":"_posts/2022-10-14-office2016_Mac_.md","raw":"---\ntitle: office2016 Mac 版本下载安装及破解激活\ntags:\n - office\npublished: true\nhideInList: false\ncategories: 分享\nabbrlink: 1387fd73\ndate: 2022-10-14 08:25:18\nfeature:\n---\n\n\n一、安装包下载地址\n\nhttp://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft_Office_2016_15.29.16120900_Installer.pkg\n\n二、激活工具\n\n\n\n链接: https://pan.baidu.com/s/1ragcr1M\n\n密码: rcb2\n\n","slug":"2022-10-14-office2016_Mac_","updated":"2023-09-29T07:51:06.347Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf7002roko0gjnt49x5","content":"

一、安装包下载地址

\n

http://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft_Office_2016_15.29.16120900_Installer.pkg

\n

二、激活工具

\n

链接: https://pan.baidu.com/s/1ragcr1M

\n

密码: rcb2

\n","site":{"data":{}},"excerpt":"","more":"

一、安装包下载地址

\n

http://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft_Office_2016_15.29.16120900_Installer.pkg

\n

二、激活工具

\n

链接: https://pan.baidu.com/s/1ragcr1M

\n

密码: rcb2

\n"},{"title":"NEC VK23T对比体验VK22T","published":1,"hideInList":false,"isTop":false,"abbrlink":"ee234ca2","date":"2022-11-08T06:02:00.000Z","feature":null,"_content":"\n\n由于之前的nec vk22被我折腾坏了。剩下了个充电器,于是在闲鱼上又转悠了半年。买了这台vk23。属实是为了一颗蒜,做了一顿饺子。\n一样的是日本走私货。\n相同点a面贴了贴纸。c面日本文键盘。\n不同点体现在屏幕,vk23是一块分辨率为720p的TN屏。比VK22的2KIPS差远了。\nVK23的内存是可以更换的,但是只有一个内存插槽。这点比vk22稍微好那么一点。有3个usb一个HDMI一个minidp一个读卡器。而且有一个摄像头。重量比vk22重一丢丢。尺寸也只有12.5英寸。用来打字上网办公还是绰绰有余的。\n我买的这款是i3 6100U低压U比i5的主频少了一点,且不能睿频。\n但是相比5200U来说已经很不错了。这个miniDP可以输出4K60HZ也是相当不错的。\n笔记本内部有一个m2插槽,支持2242的nvme协议固态硬盘,且只能支持2个缺口的半速m2硬盘。还有一个2.5寸硬盘位。相对来说也是够用了。无线网卡是intel的8260.可以更换,所以我换了更适合黑苹果的dw1560.\n没错,拿到笔记本还是要黑苹果的。\n关于黑苹果就下文再写了。\n\n ","source":"_posts/2022-11-08-NEC_VK23T-vs-VK22T.md","raw":"---\ntitle: NEC VK23T对比体验VK22T\ntags:\n - nec\n - vk23\n - 测评\ncategories: 分享 \npublished: true\nhideInList: false\nisTop: false\nabbrlink: ee234ca2\ndate: 2022-11-08 14:02:00\nfeature:\n---\n\n\n由于之前的nec vk22被我折腾坏了。剩下了个充电器,于是在闲鱼上又转悠了半年。买了这台vk23。属实是为了一颗蒜,做了一顿饺子。\n一样的是日本走私货。\n相同点a面贴了贴纸。c面日本文键盘。\n不同点体现在屏幕,vk23是一块分辨率为720p的TN屏。比VK22的2KIPS差远了。\nVK23的内存是可以更换的,但是只有一个内存插槽。这点比vk22稍微好那么一点。有3个usb一个HDMI一个minidp一个读卡器。而且有一个摄像头。重量比vk22重一丢丢。尺寸也只有12.5英寸。用来打字上网办公还是绰绰有余的。\n我买的这款是i3 6100U低压U比i5的主频少了一点,且不能睿频。\n但是相比5200U来说已经很不错了。这个miniDP可以输出4K60HZ也是相当不错的。\n笔记本内部有一个m2插槽,支持2242的nvme协议固态硬盘,且只能支持2个缺口的半速m2硬盘。还有一个2.5寸硬盘位。相对来说也是够用了。无线网卡是intel的8260.可以更换,所以我换了更适合黑苹果的dw1560.\n没错,拿到笔记本还是要黑苹果的。\n关于黑苹果就下文再写了。\n\n ","slug":"2022-11-08-NEC_VK23T-vs-VK22T","updated":"2023-09-29T07:51:06.351Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf7002voko07ln09w8r","content":"

由于之前的nec vk22被我折腾坏了。剩下了个充电器,于是在闲鱼上又转悠了半年。买了这台vk23。属实是为了一颗蒜,做了一顿饺子。
一样的是日本走私货。
相同点a面贴了贴纸。c面日本文键盘。
不同点体现在屏幕,vk23是一块分辨率为720p的TN屏。比VK22的2KIPS差远了。
VK23的内存是可以更换的,但是只有一个内存插槽。这点比vk22稍微好那么一点。有3个usb一个HDMI一个minidp一个读卡器。而且有一个摄像头。重量比vk22重一丢丢。尺寸也只有12.5英寸。用来打字上网办公还是绰绰有余的。
我买的这款是i3 6100U低压U比i5的主频少了一点,且不能睿频。
但是相比5200U来说已经很不错了。这个miniDP可以输出4K60HZ也是相当不错的。
笔记本内部有一个m2插槽,支持2242的nvme协议固态硬盘,且只能支持2个缺口的半速m2硬盘。还有一个2.5寸硬盘位。相对来说也是够用了。无线网卡是intel的8260.可以更换,所以我换了更适合黑苹果的dw1560.
没错,拿到笔记本还是要黑苹果的。
关于黑苹果就下文再写了。

\n","site":{"data":{}},"excerpt":"","more":"

由于之前的nec vk22被我折腾坏了。剩下了个充电器,于是在闲鱼上又转悠了半年。买了这台vk23。属实是为了一颗蒜,做了一顿饺子。
一样的是日本走私货。
相同点a面贴了贴纸。c面日本文键盘。
不同点体现在屏幕,vk23是一块分辨率为720p的TN屏。比VK22的2KIPS差远了。
VK23的内存是可以更换的,但是只有一个内存插槽。这点比vk22稍微好那么一点。有3个usb一个HDMI一个minidp一个读卡器。而且有一个摄像头。重量比vk22重一丢丢。尺寸也只有12.5英寸。用来打字上网办公还是绰绰有余的。
我买的这款是i3 6100U低压U比i5的主频少了一点,且不能睿频。
但是相比5200U来说已经很不错了。这个miniDP可以输出4K60HZ也是相当不错的。
笔记本内部有一个m2插槽,支持2242的nvme协议固态硬盘,且只能支持2个缺口的半速m2硬盘。还有一个2.5寸硬盘位。相对来说也是够用了。无线网卡是intel的8260.可以更换,所以我换了更适合黑苹果的dw1560.
没错,拿到笔记本还是要黑苹果的。
关于黑苹果就下文再写了。

\n"},{"title":"VK23黑苹果OpenCore0.8.5引导macOS12.6.1","published":1,"hideInList":false,"feature":"https://blogcdn.asbid.cn/2022/11/08/1667888431.png","isTop":false,"abbrlink":"e61e410b","date":"2022-11-08T06:23:36.000Z","_content":"\n\n## 配置\n网卡更换为DW1560\n\n## 截图\n![1.png][1]\n![QQ20221108-141421.png][2]\n![QQ20221108-141440.png][3]\n![QQ20221108-141449.png][4]\n![QQ20221108-141458.png][5]\n![QQ20221108-141507.png][6]\n![QQ20221108-141517.png][7]\n##\n正常工作\n1.显卡\n2.声卡\n3.有线网卡\n4.无线网卡\n5.摄像头\n6.读卡器\n7.蓝牙\n8.隔空投送\n\n [1]: https://blogcdn.asbid.cn/2022/11/08/1667888431.png\n [2]: https://blogcdn.asbid.cn/2022/11/08/1667888431.png\n [3]: https://blogcdn.asbid.cn/2022/11/08/1667888432.png\n [4]: https://blogcdn.asbid.cn/2022/11/08/1667888433.png\n [5]: https://blogcdn.asbid.cn/2022/11/08/1667888433.png\n [6]: https://blogcdn.asbid.cn/2022/11/08/1667888434.png\n [7]: https://blogcdn.asbid.cn/2022/11/08/1667888434.png","source":"_posts/2022-11-08-VK23-OpenCore0.8.5.md","raw":"---\ntitle: VK23黑苹果OpenCore0.8.5引导macOS12.6.1\ntags: []\npublished: true\nhideInList: false\nfeature: 'https://blogcdn.asbid.cn/2022/11/08/1667888431.png'\nisTop: false\nabbrlink: e61e410b\ndate: 2022-11-08 14:23:36\ncategories: 分享\n---\n\n\n## 配置\n网卡更换为DW1560\n\n## 截图\n![1.png][1]\n![QQ20221108-141421.png][2]\n![QQ20221108-141440.png][3]\n![QQ20221108-141449.png][4]\n![QQ20221108-141458.png][5]\n![QQ20221108-141507.png][6]\n![QQ20221108-141517.png][7]\n##\n正常工作\n1.显卡\n2.声卡\n3.有线网卡\n4.无线网卡\n5.摄像头\n6.读卡器\n7.蓝牙\n8.隔空投送\n\n [1]: https://blogcdn.asbid.cn/2022/11/08/1667888431.png\n [2]: https://blogcdn.asbid.cn/2022/11/08/1667888431.png\n [3]: https://blogcdn.asbid.cn/2022/11/08/1667888432.png\n [4]: https://blogcdn.asbid.cn/2022/11/08/1667888433.png\n [5]: https://blogcdn.asbid.cn/2022/11/08/1667888433.png\n [6]: https://blogcdn.asbid.cn/2022/11/08/1667888434.png\n [7]: https://blogcdn.asbid.cn/2022/11/08/1667888434.png","slug":"2022-11-08-VK23-OpenCore0.8.5","updated":"2023-09-29T07:51:06.352Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf8002yoko0h5w9fg2u","content":"

配置

网卡更换为DW1560

\n

截图

\"1.png\"
\"QQ20221108-141421.png\"
\"QQ20221108-141440.png\"
\"QQ20221108-141449.png\"
\"QQ20221108-141458.png\"
\"QQ20221108-141507.png\"
\"QQ20221108-141517.png\"
##
正常工作
1.显卡
2.声卡
3.有线网卡
4.无线网卡
5.摄像头
6.读卡器
7.蓝牙
8.隔空投送

\n","site":{"data":{}},"excerpt":"","more":"

配置

网卡更换为DW1560

\n

截图

\"1.png\"
\"QQ20221108-141421.png\"
\"QQ20221108-141440.png\"
\"QQ20221108-141449.png\"
\"QQ20221108-141458.png\"
\"QQ20221108-141507.png\"
\"QQ20221108-141517.png\"
##
正常工作
1.显卡
2.声卡
3.有线网卡
4.无线网卡
5.摄像头
6.读卡器
7.蓝牙
8.隔空投送

\n"},{"title":"2022年12月8日终于全国防疫放开管控了","excerpt":"","abbrlink":2091,"date":"2022-12-08T02:23:38.000Z","_content":"\n坚持了三年的疫情,终于在昨天放开管控了。 这意味着疫情的危害已然不如爆发之初的恐怖杀伤力了。 但是这一切不能不防。 很多阳过的朋友在网络上分享自己的心得。 各种囤积的必备药物。 还有被阳性包围保持阴性的必胜法宝。那就是口罩。 如果不想被阳,带口罩还是非常有必要的。\n\n这一次终于我可以到处溜达了。","source":"_posts/2022年12月8日终于全国防疫放开管控了.md","raw":"---\ntitle: 2022年12月8日终于全国防疫放开管控了\ntags:\n - 生活\n - 疫情\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 2091\ndate: 2022-12-08 10:23:38\n---\n\n坚持了三年的疫情,终于在昨天放开管控了。 这意味着疫情的危害已然不如爆发之初的恐怖杀伤力了。 但是这一切不能不防。 很多阳过的朋友在网络上分享自己的心得。 各种囤积的必备药物。 还有被阳性包围保持阴性的必胜法宝。那就是口罩。 如果不想被阳,带口罩还是非常有必要的。\n\n这一次终于我可以到处溜达了。","slug":"2022年12月8日终于全国防疫放开管控了","published":1,"updated":"2023-09-29T07:51:06.352Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyf90032oko03ow66itc","content":"

坚持了三年的疫情,终于在昨天放开管控了。 这意味着疫情的危害已然不如爆发之初的恐怖杀伤力了。 但是这一切不能不防。 很多阳过的朋友在网络上分享自己的心得。 各种囤积的必备药物。 还有被阳性包围保持阴性的必胜法宝。那就是口罩。 如果不想被阳,带口罩还是非常有必要的。

\n\n

这一次终于我可以到处溜达了。

\n","site":{"data":{}},"more":"

坚持了三年的疫情,终于在昨天放开管控了。 这意味着疫情的危害已然不如爆发之初的恐怖杀伤力了。 但是这一切不能不防。 很多阳过的朋友在网络上分享自己的心得。 各种囤积的必备药物。 还有被阳性包围保持阴性的必胜法宝。那就是口罩。 如果不想被阳,带口罩还是非常有必要的。

\n\n

这一次终于我可以到处溜达了。

\n"},{"title":"macOS与Windows双系统时间不同步的解决办法","published":1,"hideInList":false,"isTop":false,"abbrlink":"88405098","date":"2022-11-15T05:07:00.000Z","feature":null,"_content":"\n\n在windows下\n右键点击开始菜单,选择终端(管理员)\n\n \n Reg add HKLM\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1\n\n回车搞定!重启试试!\n","source":"_posts/2022-11-15-macOS-Windows-time.md","raw":"---\ntitle: macOS与Windows双系统时间不同步的解决办法\ntags:\n - macos\n - 时间同步\n - windows\npublished: true\nhideInList: false\nisTop: false\nabbrlink: '88405098'\ndate: 2022-11-15 13:07:00\nfeature:\ncategories: 分享\n---\n\n\n在windows下\n右键点击开始菜单,选择终端(管理员)\n\n \n Reg add HKLM\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1\n\n回车搞定!重启试试!\n","slug":"2022-11-15-macOS-Windows-time","updated":"2023-09-29T07:51:06.352Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyfa0034oko0b2okccuw","content":"

在windows下
右键点击开始菜单,选择终端(管理员)

\n
Reg add HKLM\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1\n
\n

回车搞定!重启试试!

\n","site":{"data":{}},"excerpt":"","more":"

在windows下
右键点击开始菜单,选择终端(管理员)

\n
Reg add HKLM\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1\n
\n

回车搞定!重启试试!

\n"},{"title":"2023国内注册ChatGPT的方法","published":1,"hideInList":false,"feature":"https://www.pythonthree.com/wp-content/uploads/2023/02/1676440083-%E4%BD%BF%E7%94%A8ChatGPT%E7%A4%BA%E4%BE%8B.png","isTop":false,"abbrlink":"156e4c13","date":"2023-04-07T00:34:41.000Z","_content":"#### 国内注册ChatGPT的方法\n\n \n`ChatGPT` 是由 `OpenAI `开发的一个人工智能聊天机器人程序,于 2022 年 11 月推出,基于 GPT-3.5 架构的大型语言模型并通过强化学习进行训练,在这款软件中用户们可以与 AI 人工智能进行多种的对话工作,目前,有部分地区(例如`中国大陆`、`香港`)无法使用此项服务 \n\n\n``ChatGPT``技术开发商``OpenAI``斥巨资买下``AI.com``域名,现在访问[AI.com](https://ai.com)直接跳转到ChatGPT官网。 \n\n\n\n#### ChatGPT功能\n\n- ChatGPT 在搜索和写作上非常强大。\n- ChatGPT 可以根据用户提供的信息,给出合理而有效的搜索结果,\n- ChatGPT 写的短篇小说,\n- ChatGPT 写的信件,内容通畅,用词准确。\n- ChatGPT 撰写专业的电子邮件回复\n- ChatGPT 为营销活动产生新的内容创意\n- ChatGPT 解决任何编码问题或为获取代码\n\n\n\n#### 国内用户注册ChatGPT的方法\n\n 国内用户想要注册 ChatGPT,首先需要有一个**网络环境**,例如``美国``;然后,需要一个可以接收短信验证码的手机号码,之后就可以打开 ChatGPT 的网站**注册 ,邮件验证,电话号码验证**等等。\n\n **如果出现如下的界面,则证明你的网络所在地区无法注册访问ChatGPT。**\n\n``注意:``如果无法搞定上述必要条件的话,可以尝试\n搭建一个梯子 [x-ui:支持多协议多用户的 xray 面板](https://www.sunpeiwen.com/archives/396.html) \n\n##### 注册 OpenAI 账号\n\n 1、点击打开 [https://chat.openai.com/auth/login](https://chat.openai.com/auth/login) 页面中的 ``` Sign up ```进行相应的账号注册(注意网络环境不能是``香港``,``澳门``等地区,不然会提示不能在当前国家服务)。\n\n![注册](https://www.pythonthree.com/wp-content/uploads/2023/02/1676427587-%E6%B3%A8%E5%86%8COpenAI%E8%B4%A6%E5%8F%B7.png) \n2、在新的页面可选择注册 `ChatGPT` 账号的方式,可以使用邮箱(国内邮箱也可以,建议使用国外邮箱),,或者有谷歌账号的邮箱,或者用 Microsoft Account 注册也可以。\n\n![选择创建ChatGPT账号的方式](https://www.pythonthree.com/wp-content/uploads/2023/02/1676427844-%E9%80%89%E6%8B%A9%E5%88%9B%E5%BB%BAChatGPT%E8%B4%A6%E5%8F%B7%E7%9A%84%E6%96%B9%E5%BC%8F.png)\n**使用邮箱注册ChatGPT时**,输入邮箱地址,点击``` Continue ```,之后输入密码,进入下一步骤。\n\n![使用邮箱注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428115-%E4%BD%BF%E7%94%A8%E9%82%AE%E7%AE%B1%E6%B3%A8%E5%86%8CChatGPT.png )\n**使用 Microsoft Account 注册ChatGPT时**,可以使用Microsoft账号登录,如果有Github账号的话,可点击`登录选项`,然后选择使用Github账号 注册。\n\n![使用Microsoft-Account注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428134-%E4%BD%BF%E7%94%A8Microsoft-Account%E6%B3%A8%E5%86%8CChatGPT.png)\n**使用 Google 账号注册ChatGPT时**,输入Google账号地址及密码,然后进入下一步骤。\n\n![使用Google账号注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428153-%E4%BD%BF%E7%94%A8Google%E8%B4%A6%E5%8F%B7%E6%B3%A8%E5%86%8CChatGPT.png)\n3、以**使用邮箱注册ChatGPT**为例,输入邮箱需要在邮箱收到的邮件内点击验证,\n\n![验证ChatGPT邮箱](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431622-%E9%AA%8C%E8%AF%81ChatGPT%E9%82%AE%E7%AE%B1.png )\n4、然后继续在ChatGPT注册页面填入信息\n\n![在ChatGPT注册页面填入信息](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431710-%E5%9C%A8ChatGPT%E6%B3%A8%E5%86%8C%E9%A1%B5%E9%9D%A2%E5%A1%AB%E5%85%A5%E4%BF%A1%E6%81%AF.png) \n5、填写ChatGPT手机短信验证码\n\n![填写ChatGPT手机短信验证码](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431788-%E5%A1%AB%E5%86%99ChatGPT%E6%89%8B%E6%9C%BA%E7%9F%AD%E4%BF%A1%E9%AA%8C%E8%AF%81%E7%A0%81.png)\n\n\n##### 接收手机短信验证码\n\n 需要使用中国以外的手机号码进行验证,例如美国、印度等,可以在俄罗斯的接码平台```sms-activate```来完成,该网站支持中文/英文显示界面,支持支付宝,使用俄罗斯卢布计费。\n\n 1、现在就需要用到注册的第三方接码平台了,访问[ ](https://sms-activate.org/?ref=5366293)[https://sms-activate.org/](https://sms-activate.org/?ref=5366293)。\n\n![注册的第三方接码平台了](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432063-%E6%B3%A8%E5%86%8C%E7%9A%84%E7%AC%AC%E4%B8%89%E6%96%B9%E6%8E%A5%E7%A0%81%E5%B9%B3%E5%8F%B0%E4%BA%86.png) \n\n2、注册完成后需要充值(按照 1 美元兑换 73 卢布),点击右上角**“ 余额充值 ”**,使用支付宝充值 1 美元即可**(sms-activate.org平台规则发生变化,少于10美元充值,需最低充值2美元<2023.3.22>)**。\n\n![注册完成后需要充值](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432200-%E6%B3%A8%E5%86%8C%E5%AE%8C%E6%88%90%E5%90%8E%E9%9C%80%E8%A6%81%E5%85%85%E5%80%BC.png )\n3、在平台左侧搜索 OpenAI ,然后在国家那里找到Indonesia(印度尼西亚),点击选择国家后面的加入购物车即可。\n\n![选择国家](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432316-1676429348918.png) \n4、然后等一会出现如下界面,这里的手机号拷贝出来,输入到上一步中注册OpenAI的界面上,然后点击 Send code按钮,**在下图的界面中等待验证码短信发送**。\n\n![接收输入验证码](https://www.pythonthree.com/wp-content/uploads/2023/02/1676433066-%E6%8E%A5%E6%94%B6%E8%BE%93%E5%85%A5%E9%AA%8C%E8%AF%81%E7%A0%81.jpg) \n```注意:```有效期是20分钟,需要快速操作,若两三分钟没有收到短信验证码,可点击旁边的删除按钮,然后再次选择别的手机号码,未收到验证不扣费。\n\n \n \n\n#### 使用ChatGPT\n\n 账号注册完成了,就可以尽情的使用ChatGPT来玩耍了,重新登录ChatGPT官网,然后[访问Chat](https://chat.openai.com),这时你就可以开始尽情和机器人聊天了。\n\n![使用ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676433542-%E4%BD%BF%E7%94%A8ChatGPT.png)\n\n使用ChatGPT示例,如何写一个吸引人的 标题\n\n![使用ChatGPT示例](https://www.pythonthree.com/wp-content/uploads/2023/02/1676440083-%E4%BD%BF%E7%94%A8ChatGPT%E7%A4%BA%E4%BE%8B.png)\n\n#### 总结\n\n 以上是为你介绍的国内注册 ChatGPT 的方法,希望对你了解 ChatGPT 有所帮助,如有问题,欢迎联系我们。\n\n\n","source":"_posts/2023-guo-nei-zhu-ce-chatgpt-de-fang-fa.md","raw":"---\ntitle: 2023国内注册ChatGPT的方法\ntags:\n - chatgpt\n - 注册\n - 教程\npublished: true\nhideInList: false\nfeature: >-\n https://www.pythonthree.com/wp-content/uploads/2023/02/1676440083-%E4%BD%BF%E7%94%A8ChatGPT%E7%A4%BA%E4%BE%8B.png\nisTop: false\nabbrlink: 156e4c13\ndate: 2023-04-07 08:34:41\ncategories: 分享\n---\n#### 国内注册ChatGPT的方法\n\n \n`ChatGPT` 是由 `OpenAI `开发的一个人工智能聊天机器人程序,于 2022 年 11 月推出,基于 GPT-3.5 架构的大型语言模型并通过强化学习进行训练,在这款软件中用户们可以与 AI 人工智能进行多种的对话工作,目前,有部分地区(例如`中国大陆`、`香港`)无法使用此项服务 \n\n\n``ChatGPT``技术开发商``OpenAI``斥巨资买下``AI.com``域名,现在访问[AI.com](https://ai.com)直接跳转到ChatGPT官网。 \n\n\n\n#### ChatGPT功能\n\n- ChatGPT 在搜索和写作上非常强大。\n- ChatGPT 可以根据用户提供的信息,给出合理而有效的搜索结果,\n- ChatGPT 写的短篇小说,\n- ChatGPT 写的信件,内容通畅,用词准确。\n- ChatGPT 撰写专业的电子邮件回复\n- ChatGPT 为营销活动产生新的内容创意\n- ChatGPT 解决任何编码问题或为获取代码\n\n\n\n#### 国内用户注册ChatGPT的方法\n\n 国内用户想要注册 ChatGPT,首先需要有一个**网络环境**,例如``美国``;然后,需要一个可以接收短信验证码的手机号码,之后就可以打开 ChatGPT 的网站**注册 ,邮件验证,电话号码验证**等等。\n\n **如果出现如下的界面,则证明你的网络所在地区无法注册访问ChatGPT。**\n\n``注意:``如果无法搞定上述必要条件的话,可以尝试\n搭建一个梯子 [x-ui:支持多协议多用户的 xray 面板](https://www.sunpeiwen.com/archives/396.html) \n\n##### 注册 OpenAI 账号\n\n 1、点击打开 [https://chat.openai.com/auth/login](https://chat.openai.com/auth/login) 页面中的 ``` Sign up ```进行相应的账号注册(注意网络环境不能是``香港``,``澳门``等地区,不然会提示不能在当前国家服务)。\n\n![注册](https://www.pythonthree.com/wp-content/uploads/2023/02/1676427587-%E6%B3%A8%E5%86%8COpenAI%E8%B4%A6%E5%8F%B7.png) \n2、在新的页面可选择注册 `ChatGPT` 账号的方式,可以使用邮箱(国内邮箱也可以,建议使用国外邮箱),,或者有谷歌账号的邮箱,或者用 Microsoft Account 注册也可以。\n\n![选择创建ChatGPT账号的方式](https://www.pythonthree.com/wp-content/uploads/2023/02/1676427844-%E9%80%89%E6%8B%A9%E5%88%9B%E5%BB%BAChatGPT%E8%B4%A6%E5%8F%B7%E7%9A%84%E6%96%B9%E5%BC%8F.png)\n**使用邮箱注册ChatGPT时**,输入邮箱地址,点击``` Continue ```,之后输入密码,进入下一步骤。\n\n![使用邮箱注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428115-%E4%BD%BF%E7%94%A8%E9%82%AE%E7%AE%B1%E6%B3%A8%E5%86%8CChatGPT.png )\n**使用 Microsoft Account 注册ChatGPT时**,可以使用Microsoft账号登录,如果有Github账号的话,可点击`登录选项`,然后选择使用Github账号 注册。\n\n![使用Microsoft-Account注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428134-%E4%BD%BF%E7%94%A8Microsoft-Account%E6%B3%A8%E5%86%8CChatGPT.png)\n**使用 Google 账号注册ChatGPT时**,输入Google账号地址及密码,然后进入下一步骤。\n\n![使用Google账号注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428153-%E4%BD%BF%E7%94%A8Google%E8%B4%A6%E5%8F%B7%E6%B3%A8%E5%86%8CChatGPT.png)\n3、以**使用邮箱注册ChatGPT**为例,输入邮箱需要在邮箱收到的邮件内点击验证,\n\n![验证ChatGPT邮箱](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431622-%E9%AA%8C%E8%AF%81ChatGPT%E9%82%AE%E7%AE%B1.png )\n4、然后继续在ChatGPT注册页面填入信息\n\n![在ChatGPT注册页面填入信息](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431710-%E5%9C%A8ChatGPT%E6%B3%A8%E5%86%8C%E9%A1%B5%E9%9D%A2%E5%A1%AB%E5%85%A5%E4%BF%A1%E6%81%AF.png) \n5、填写ChatGPT手机短信验证码\n\n![填写ChatGPT手机短信验证码](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431788-%E5%A1%AB%E5%86%99ChatGPT%E6%89%8B%E6%9C%BA%E7%9F%AD%E4%BF%A1%E9%AA%8C%E8%AF%81%E7%A0%81.png)\n\n\n##### 接收手机短信验证码\n\n 需要使用中国以外的手机号码进行验证,例如美国、印度等,可以在俄罗斯的接码平台```sms-activate```来完成,该网站支持中文/英文显示界面,支持支付宝,使用俄罗斯卢布计费。\n\n 1、现在就需要用到注册的第三方接码平台了,访问[ ](https://sms-activate.org/?ref=5366293)[https://sms-activate.org/](https://sms-activate.org/?ref=5366293)。\n\n![注册的第三方接码平台了](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432063-%E6%B3%A8%E5%86%8C%E7%9A%84%E7%AC%AC%E4%B8%89%E6%96%B9%E6%8E%A5%E7%A0%81%E5%B9%B3%E5%8F%B0%E4%BA%86.png) \n\n2、注册完成后需要充值(按照 1 美元兑换 73 卢布),点击右上角**“ 余额充值 ”**,使用支付宝充值 1 美元即可**(sms-activate.org平台规则发生变化,少于10美元充值,需最低充值2美元<2023.3.22>)**。\n\n![注册完成后需要充值](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432200-%E6%B3%A8%E5%86%8C%E5%AE%8C%E6%88%90%E5%90%8E%E9%9C%80%E8%A6%81%E5%85%85%E5%80%BC.png )\n3、在平台左侧搜索 OpenAI ,然后在国家那里找到Indonesia(印度尼西亚),点击选择国家后面的加入购物车即可。\n\n![选择国家](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432316-1676429348918.png) \n4、然后等一会出现如下界面,这里的手机号拷贝出来,输入到上一步中注册OpenAI的界面上,然后点击 Send code按钮,**在下图的界面中等待验证码短信发送**。\n\n![接收输入验证码](https://www.pythonthree.com/wp-content/uploads/2023/02/1676433066-%E6%8E%A5%E6%94%B6%E8%BE%93%E5%85%A5%E9%AA%8C%E8%AF%81%E7%A0%81.jpg) \n```注意:```有效期是20分钟,需要快速操作,若两三分钟没有收到短信验证码,可点击旁边的删除按钮,然后再次选择别的手机号码,未收到验证不扣费。\n\n \n \n\n#### 使用ChatGPT\n\n 账号注册完成了,就可以尽情的使用ChatGPT来玩耍了,重新登录ChatGPT官网,然后[访问Chat](https://chat.openai.com),这时你就可以开始尽情和机器人聊天了。\n\n![使用ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676433542-%E4%BD%BF%E7%94%A8ChatGPT.png)\n\n使用ChatGPT示例,如何写一个吸引人的 标题\n\n![使用ChatGPT示例](https://www.pythonthree.com/wp-content/uploads/2023/02/1676440083-%E4%BD%BF%E7%94%A8ChatGPT%E7%A4%BA%E4%BE%8B.png)\n\n#### 总结\n\n 以上是为你介绍的国内注册 ChatGPT 的方法,希望对你了解 ChatGPT 有所帮助,如有问题,欢迎联系我们。\n\n\n","slug":"2023-guo-nei-zhu-ce-chatgpt-de-fang-fa","updated":"2023-09-29T07:51:06.353Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygg00aloko092hr1ozm","content":"

国内注册ChatGPT的方法

ChatGPT 是由 OpenAI 开发的一个人工智能聊天机器人程序,于 2022 年 11 月推出,基于 GPT-3.5 架构的大型语言模型并通过强化学习进行训练,在这款软件中用户们可以与 AI 人工智能进行多种的对话工作,目前,有部分地区(例如中国大陆香港)无法使用此项服务

\n

ChatGPT技术开发商OpenAI斥巨资买下AI.com域名,现在访问AI.com直接跳转到ChatGPT官网。

\n

ChatGPT功能

\n

国内用户注册ChatGPT的方法

国内用户想要注册 ChatGPT,首先需要有一个网络环境,例如美国;然后,需要一个可以接收短信验证码的手机号码,之后就可以打开 ChatGPT 的网站注册 ,邮件验证,电话号码验证等等。

\n

如果出现如下的界面,则证明你的网络所在地区无法注册访问ChatGPT。

\n

注意:如果无法搞定上述必要条件的话,可以尝试
搭建一个梯子 x-ui:支持多协议多用户的 xray 面板

\n
注册 OpenAI 账号

1、点击打开 https://chat.openai.com/auth/login 页面中的 Sign up 进行相应的账号注册(注意网络环境不能是香港澳门等地区,不然会提示不能在当前国家服务)。

\n

\"注册\"
2、在新的页面可选择注册 ChatGPT 账号的方式,可以使用邮箱(国内邮箱也可以,建议使用国外邮箱),,或者有谷歌账号的邮箱,或者用 Microsoft Account 注册也可以。

\n

\"选择创建ChatGPT账号的方式\"
使用邮箱注册ChatGPT时,输入邮箱地址,点击Continue,之后输入密码,进入下一步骤。

\n

\"使用邮箱注册ChatGPT\"
使用 Microsoft Account 注册ChatGPT时,可以使用Microsoft账号登录,如果有Github账号的话,可点击登录选项,然后选择使用Github账号 注册。

\n

\"使用Microsoft-Account注册ChatGPT\"
使用 Google 账号注册ChatGPT时,输入Google账号地址及密码,然后进入下一步骤。

\n

\"使用Google账号注册ChatGPT\"
3、以使用邮箱注册ChatGPT为例,输入邮箱需要在邮箱收到的邮件内点击验证,

\n

\"验证ChatGPT邮箱\"
4、然后继续在ChatGPT注册页面填入信息

\n

\"在ChatGPT注册页面填入信息\"
5、填写ChatGPT手机短信验证码

\n

\"填写ChatGPT手机短信验证码\"

\n
接收手机短信验证码

需要使用中国以外的手机号码进行验证,例如美国、印度等,可以在俄罗斯的接码平台sms-activate来完成,该网站支持中文/英文显示界面,支持支付宝,使用俄罗斯卢布计费。

\n

1、现在就需要用到注册的第三方接码平台了,访问 https://sms-activate.org/

\n

\"注册的第三方接码平台了\"

\n

2、注册完成后需要充值(按照 1 美元兑换 73 卢布),点击右上角“ 余额充值 ”,使用支付宝充值 1 美元即可(sms-activate.org平台规则发生变化,少于10美元充值,需最低充值2美元<2023.3.22>)

\n

\"注册完成后需要充值\"
3、在平台左侧搜索 OpenAI ,然后在国家那里找到Indonesia(印度尼西亚),点击选择国家后面的加入购物车即可。

\n

\"选择国家\"
4、然后等一会出现如下界面,这里的手机号拷贝出来,输入到上一步中注册OpenAI的界面上,然后点击 Send code按钮,在下图的界面中等待验证码短信发送

\n

\"接收输入验证码\"
注意:有效期是20分钟,需要快速操作,若两三分钟没有收到短信验证码,可点击旁边的删除按钮,然后再次选择别的手机号码,未收到验证不扣费。

\n

使用ChatGPT

账号注册完成了,就可以尽情的使用ChatGPT来玩耍了,重新登录ChatGPT官网,然后访问Chat,这时你就可以开始尽情和机器人聊天了。

\n

\"使用ChatGPT\"

\n

使用ChatGPT示例,如何写一个吸引人的 标题

\n

\"使用ChatGPT示例\"

\n

总结

以上是为你介绍的国内注册 ChatGPT 的方法,希望对你了解 ChatGPT 有所帮助,如有问题,欢迎联系我们。

\n","site":{"data":{}},"excerpt":"","more":"

国内注册ChatGPT的方法

ChatGPT 是由 OpenAI 开发的一个人工智能聊天机器人程序,于 2022 年 11 月推出,基于 GPT-3.5 架构的大型语言模型并通过强化学习进行训练,在这款软件中用户们可以与 AI 人工智能进行多种的对话工作,目前,有部分地区(例如中国大陆香港)无法使用此项服务

\n

ChatGPT技术开发商OpenAI斥巨资买下AI.com域名,现在访问AI.com直接跳转到ChatGPT官网。

\n

ChatGPT功能

\n

国内用户注册ChatGPT的方法

国内用户想要注册 ChatGPT,首先需要有一个网络环境,例如美国;然后,需要一个可以接收短信验证码的手机号码,之后就可以打开 ChatGPT 的网站注册 ,邮件验证,电话号码验证等等。

\n

如果出现如下的界面,则证明你的网络所在地区无法注册访问ChatGPT。

\n

注意:如果无法搞定上述必要条件的话,可以尝试
搭建一个梯子 x-ui:支持多协议多用户的 xray 面板

\n
注册 OpenAI 账号

1、点击打开 https://chat.openai.com/auth/login 页面中的 Sign up 进行相应的账号注册(注意网络环境不能是香港澳门等地区,不然会提示不能在当前国家服务)。

\n

\"注册\"
2、在新的页面可选择注册 ChatGPT 账号的方式,可以使用邮箱(国内邮箱也可以,建议使用国外邮箱),,或者有谷歌账号的邮箱,或者用 Microsoft Account 注册也可以。

\n

\"选择创建ChatGPT账号的方式\"
使用邮箱注册ChatGPT时,输入邮箱地址,点击Continue,之后输入密码,进入下一步骤。

\n

\"使用邮箱注册ChatGPT\"
使用 Microsoft Account 注册ChatGPT时,可以使用Microsoft账号登录,如果有Github账号的话,可点击登录选项,然后选择使用Github账号 注册。

\n

\"使用Microsoft-Account注册ChatGPT\"
使用 Google 账号注册ChatGPT时,输入Google账号地址及密码,然后进入下一步骤。

\n

\"使用Google账号注册ChatGPT\"
3、以使用邮箱注册ChatGPT为例,输入邮箱需要在邮箱收到的邮件内点击验证,

\n

\"验证ChatGPT邮箱\"
4、然后继续在ChatGPT注册页面填入信息

\n

\"在ChatGPT注册页面填入信息\"
5、填写ChatGPT手机短信验证码

\n

\"填写ChatGPT手机短信验证码\"

\n
接收手机短信验证码

需要使用中国以外的手机号码进行验证,例如美国、印度等,可以在俄罗斯的接码平台sms-activate来完成,该网站支持中文/英文显示界面,支持支付宝,使用俄罗斯卢布计费。

\n

1、现在就需要用到注册的第三方接码平台了,访问 https://sms-activate.org/

\n

\"注册的第三方接码平台了\"

\n

2、注册完成后需要充值(按照 1 美元兑换 73 卢布),点击右上角“ 余额充值 ”,使用支付宝充值 1 美元即可(sms-activate.org平台规则发生变化,少于10美元充值,需最低充值2美元<2023.3.22>)

\n

\"注册完成后需要充值\"
3、在平台左侧搜索 OpenAI ,然后在国家那里找到Indonesia(印度尼西亚),点击选择国家后面的加入购物车即可。

\n

\"选择国家\"
4、然后等一会出现如下界面,这里的手机号拷贝出来,输入到上一步中注册OpenAI的界面上,然后点击 Send code按钮,在下图的界面中等待验证码短信发送

\n

\"接收输入验证码\"
注意:有效期是20分钟,需要快速操作,若两三分钟没有收到短信验证码,可点击旁边的删除按钮,然后再次选择别的手机号码,未收到验证不扣费。

\n

使用ChatGPT

账号注册完成了,就可以尽情的使用ChatGPT来玩耍了,重新登录ChatGPT官网,然后访问Chat,这时你就可以开始尽情和机器人聊天了。

\n

\"使用ChatGPT\"

\n

使用ChatGPT示例,如何写一个吸引人的 标题

\n

\"使用ChatGPT示例\"

\n

总结

以上是为你介绍的国内注册 ChatGPT 的方法,希望对你了解 ChatGPT 有所帮助,如有问题,欢迎联系我们。

\n"},{"title":"8月27.","excerpt":"","abbrlink":39523,"date":"2013-08-27T11:44:21.000Z","_content":"\n额,今天不是什么特别的日子.\n\n就是突然心血来潮,点开自己久未访问的博客,上次更新是在半年前. \n\n又是半年过去了, 一事无成啊. 聊作纪念吧.","source":"_posts/8月27.md","raw":"---\ntitle: 8月27.\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 39523\ndate: 2013-08-27 19:44:21\n---\n\n额,今天不是什么特别的日子.\n\n就是突然心血来潮,点开自己久未访问的博客,上次更新是在半年前. \n\n又是半年过去了, 一事无成啊. 聊作纪念吧.","slug":"8月27","published":1,"updated":"2023-09-29T07:51:06.353Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygh00amoko02r8ia768","content":"

额,今天不是什么特别的日子.

\n

就是突然心血来潮,点开自己久未访问的博客,上次更新是在半年前.

\n

又是半年过去了, 一事无成啊. 聊作纪念吧.

\n","site":{"data":{}},"more":"

额,今天不是什么特别的日子.

\n

就是突然心血来潮,点开自己久未访问的博客,上次更新是在半年前.

\n

又是半年过去了, 一事无成啊. 聊作纪念吧.

\n"},{"layout":"post","cid":373,"title":"42个虚拟信用卡开卡渠道","slug":"42个虚拟信用卡开卡渠道","date":"2022-11-29T00:47:15.000Z","updated":"2022-11-29T00:47:15.000Z","status":"publish","author":"老孙","articleCopyright":"show","Pictype":0,"abbrlink":22526,"banner":null,"postgjc":null,"postjj":null,"_content":"\n\n1. 全球付\nhttp://www.globalcash.hk/\n在线申请,可充值,微信支付,开卡简单。\n\n2. 爱汇旅之卡\nhttp://www.ihui.com/\n此卡是目前最方便容易获得,并大量获得的实体mastercard实体卡,可以直接联系客服大量拿卡,一次上百张甚至是数百张,该卡支持paypal、amazon、google等网站。\n\n3. Tap&go 拍住赏\nhttp://tapngo.com.hk/\n可以支持微信,amazon、applepay 国际阿里云 GCE aws paypal等大部分网站,需要认证,买卡可以去香港总部或者某宝,最低100余额 充值可在香港便利店充值或者网上找人代充!\n\n4. 三三金融:\nhttps://cards.33finance.com\n需要到香港公司进行开卡,也可以找某宝,开出来的卡适用于大部分网站,包括欧贝通/amazon/阿里云/paypal/等等等等,充值也需要到香港便利店或者是到公司充,也可以找人代充。\n\n5. Tierrapay\nwww.tierrapay.com卡段4665\n注册要用欧洲地址,比如英国,需要用pm或者是wmz充值,无需认证即可成功开卡。\n\n6. 通汇香港\nhttps://www.transforex.hk/\n此卡要携带护照和身份证前往香港开通,该公司有礼品卡,固定金额每天限购买3张,经测试,此卡适用于paypal amazon ebay等平台\n\n7. Uphold www.uphold.com\n需要护照和地址证明申请,支持银行 比特币进行充值\n\n8. Payeer\nhttp://www.zhesui.com/payeer/\n目前需要用欧洲国家的资料注册,\n\n9. Advcash\n目前需要用欧洲国家的资料注册\n\n10. Moneypolo\nhttp://www.zhesui.com/moneypolo/需要完成实名认证,以及收费购买。\n\n11. Wirexapp\nhttp://www.zhesui.com/wirex-app-visa/\n4665卡段,目前需要用欧洲国家地址注册申请。没认证只能比特币充值。\n\n12. Payoneer派安盈\n附带美国 日本 英国和欧洲银行账户\nhttp://www.payoneer.com/\n\n13. okpay\n需要用护照通过实名认证才能开卡。\n\n14. Qiwi\nhttps://qiwi.com/\n需要俄罗斯电话卡注册成功才能开卡 (俄罗斯卡可以去淘宝买一个)\n\n15. ecoPayz\nhttp://www.zhesui.com/ecopayz-card/\n目前需要认证,该卡支持大部分网站,可以无限移除替换卡片。\n\n16. 浦发E-GO卡(需要有浦发实体卡)\nhttp://www.zhesui.com/e-go/\n该卡可以开出银联 mastercard visa AME 四种卡片\n\n17. Yandexmoney\nmoney.yandex.ru\n以上虚拟卡渠道基本都是国外电子钱包发行的,类似于国内的支付宝,不同的是除开少数几个支持人民币和国内银行充值的之外,其他基本都需要使用国外银行卡或者是电子钱包、信用卡充值,如果没有的话我们可以通过兑换的方式为该网站充值,具体兑换商可参照电子货币兑换网中国上面所说的兑换网站以及方法:电子货币兑换网中国:http://currencyexchange.net.cn/\n\n18. VirtualCards(支持支付宝充值)\nhttps://VirtualCards.us\n50美元起充,注册成功无需充值既可出卡号\n\n19. payweb\nhttp://payweb.com\n(需要付费、只有实体卡)可以用银联进行充值!\n\n20. Solid Trust Pay\nhttp://SolidTrustPay.com\n\n21. Skrill(需要注册国外账户)\nhttp://www.skrill.com\n要注册欧洲国家的资料才有开卡选项。\n\n22. Neteller(需要注册国外账户)\nwww.neteller.com\n\n23. v-preca(需要日本ip注册 少数中国卡能够充值)\nhttp://vpc.lifecard.co.jp\n\n24. mun-prepaid(需要日本ip注册)\n日元卡或者日本便利店充值\nwww.mun-prepaid.com\n\n25. Giftcardmall\nwww.giftcardmall.com\n此网站要美国信用卡或者是借记卡进行购买\n\n26. netspend(需翻墙 国外身份认证)\nwww.Netspend.com\n\n27. vanilla(实体卡、需要国外身份或者是便利店购买)\n也可以找我们进行购买。\nwww.vanilla.com\n\n28. 通汇香港\nhttps://www.transforex.hk/\n此卡支持amazon googleplay paypal 等网站需要携带护照和身份证到香港总公司进行开卡!用身份证就能通过认证,可以开实体卡和虚拟卡\n\n29. Entropay 欧贝通\nwww.Entropay.com\n不认证可以开五张卡,4067卡段,该卡可以用三三金融卡进行充值,可以自定义充值金额,认证过的账户可以开出10张卡片,可以自由决定充值的金额。欧贝通充值可以用 tapngo卡和三三金融进行充值,经本人测试是中国用户目前最好使的充值方法,tapngo和三三金融可以自行在香港购买。\n\n30. payoneer\npayoneer是目前非常不错的虚拟卡平台,身份证即可申请下来,遗憾的是申请到收到卡需要一个月左右的时间,值得一提的是payoneer更吸引我们的是他有美国银行账户、美元、欧元、日元、英镑银行账户可供我们申请选择,非常值得拥有。\n\n31. Mmvpaymmvpay\n是新加坡的虚拟卡平台可以开出mastercard 虚拟卡,需要新加坡手机号码注册!经过测试,账户不用认证,甚至是不用充值,一个账户直接可以获取5张卡片信息,包含卡号,有效期和卡密信息\n\n32. paypal mastercard\nhttps://www.paypal.com/us/webapps/mpp/paypal-prepaid-mastercard\n此卡是paypal美国发行的mastercard,支持大部分网站消费,绑定以及验证,但是需要美国护照、身份和银行卡信息申请,并且是需要真实的\n\n33. amazon mastercard\nhttps://www.amazon.co.jp/\n三井住友カード株式会社-amazon-mastercardゴード/dp/b0092vb6vkAmazon mastercard是amazon日本网站发行的mastercard虚拟卡账户,同样是需要日本身份证护照地址证明才能申请下来,专门针对日亚的mastercard。\n\n34. Cryptopaycryptopay\n是一个数字交易平台同属4665卡段的虚拟卡,不认证可以开出虚拟卡,但是前提是必须用欧洲国家的地址以及资料进行注册!\n\n35. Capitalistcapitalist\n是一个俄罗斯的电子钱包工具,目前不认证一个账户可以开2张mastercard虚拟卡,分别是一张欧元的一张,一张美元的,认证过后可以开通四张卡片,两张实体卡和两张虚拟卡。\n\n36. Unichangeunichange\n是一个电子货币兑换平台,该平台提供欧元和美元两种币种的虚拟卡。Unichange.me如果你没有某些资料,某些材料,那么万能的商人一定可以满足的了你!\n\n37. PayzaPayza\n也是一个电子钱包工具,类似于paypal之类的电子 钱包,这边主要介绍payza发行的mastercard虚拟卡,申请虚拟卡需要身份证和信用卡认证,可以用预付卡能看得到自己姓名的信用卡。\n\n38. mycard2go\nmycard2go是一个德国的虚拟卡,发卡行为wire bank ag卡种为visa,注册账户无需身份认证,但是需要进行充值了才能开卡,充值成功后自动开通卡片,卡种为欧元,需要用KLARNA网银或者是当地现金进行充值,也可以进行网银。\n\n39. Vandle\nhttps://app.vandle.jp/\nvandle是一家日本的虚拟卡提供平台,它提供mastercard虚拟卡片,需要再日本的便利店进行充值,也可以用日本的信用卡网银进行充值\n\n40. Chocom\nhttp://www.chocom.jp/index.html\nChocom也是一家日本的虚拟卡,可以在日本的便利店,或者是日本信用卡以及Chocom电子钱包进行充值。\n\n41. Docomokouza\ndocomokouza为日本docomo发行的visa虚拟信用卡,甚至是注册无需审查即可申请visa虚拟卡,最短有效期仅10天,还有一种则为3年需要日本的电子货币或者是信用卡对其进行充值。\nhttps://docomokouza.jpmastercard借记卡\n\n42. Nttsmarttrade\nnttsmarttrade是一家日本的在线虚拟卡平台,支持中文界面,非常方便,需要用日本信用卡段进行充值,中国和日本以外的mastercard无法进行充值。http://www.nttsmarttrade.co.jp/mastercardnet/cn/","source":"_posts/42个虚拟信用卡开卡渠道.md","raw":"---\nlayout: post\ncid: 373\ntitle: 42个虚拟信用卡开卡渠道\nslug: 42-virtual-credit-card-opening-channels\ndate: '2022/11/29 08:47:15'\nupdated: '2022/11/29 08:47:15'\nstatus: publish\nauthor: 老孙\ncategories:\n - Note\ntags:\n - 虚拟信用卡\narticleCopyright: show\nPictype: 0\nabbrlink: 22526\nbanner:\npostgjc:\npostjj:\n---\n\n\n1. 全球付\nhttp://www.globalcash.hk/\n在线申请,可充值,微信支付,开卡简单。\n\n2. 爱汇旅之卡\nhttp://www.ihui.com/\n此卡是目前最方便容易获得,并大量获得的实体mastercard实体卡,可以直接联系客服大量拿卡,一次上百张甚至是数百张,该卡支持paypal、amazon、google等网站。\n\n3. Tap&go 拍住赏\nhttp://tapngo.com.hk/\n可以支持微信,amazon、applepay 国际阿里云 GCE aws paypal等大部分网站,需要认证,买卡可以去香港总部或者某宝,最低100余额 充值可在香港便利店充值或者网上找人代充!\n\n4. 三三金融:\nhttps://cards.33finance.com\n需要到香港公司进行开卡,也可以找某宝,开出来的卡适用于大部分网站,包括欧贝通/amazon/阿里云/paypal/等等等等,充值也需要到香港便利店或者是到公司充,也可以找人代充。\n\n5. Tierrapay\nwww.tierrapay.com卡段4665\n注册要用欧洲地址,比如英国,需要用pm或者是wmz充值,无需认证即可成功开卡。\n\n6. 通汇香港\nhttps://www.transforex.hk/\n此卡要携带护照和身份证前往香港开通,该公司有礼品卡,固定金额每天限购买3张,经测试,此卡适用于paypal amazon ebay等平台\n\n7. Uphold www.uphold.com\n需要护照和地址证明申请,支持银行 比特币进行充值\n\n8. Payeer\nhttp://www.zhesui.com/payeer/\n目前需要用欧洲国家的资料注册,\n\n9. Advcash\n目前需要用欧洲国家的资料注册\n\n10. Moneypolo\nhttp://www.zhesui.com/moneypolo/需要完成实名认证,以及收费购买。\n\n11. Wirexapp\nhttp://www.zhesui.com/wirex-app-visa/\n4665卡段,目前需要用欧洲国家地址注册申请。没认证只能比特币充值。\n\n12. Payoneer派安盈\n附带美国 日本 英国和欧洲银行账户\nhttp://www.payoneer.com/\n\n13. okpay\n需要用护照通过实名认证才能开卡。\n\n14. Qiwi\nhttps://qiwi.com/\n需要俄罗斯电话卡注册成功才能开卡 (俄罗斯卡可以去淘宝买一个)\n\n15. ecoPayz\nhttp://www.zhesui.com/ecopayz-card/\n目前需要认证,该卡支持大部分网站,可以无限移除替换卡片。\n\n16. 浦发E-GO卡(需要有浦发实体卡)\nhttp://www.zhesui.com/e-go/\n该卡可以开出银联 mastercard visa AME 四种卡片\n\n17. Yandexmoney\nmoney.yandex.ru\n以上虚拟卡渠道基本都是国外电子钱包发行的,类似于国内的支付宝,不同的是除开少数几个支持人民币和国内银行充值的之外,其他基本都需要使用国外银行卡或者是电子钱包、信用卡充值,如果没有的话我们可以通过兑换的方式为该网站充值,具体兑换商可参照电子货币兑换网中国上面所说的兑换网站以及方法:电子货币兑换网中国:http://currencyexchange.net.cn/\n\n18. VirtualCards(支持支付宝充值)\nhttps://VirtualCards.us\n50美元起充,注册成功无需充值既可出卡号\n\n19. payweb\nhttp://payweb.com\n(需要付费、只有实体卡)可以用银联进行充值!\n\n20. Solid Trust Pay\nhttp://SolidTrustPay.com\n\n21. Skrill(需要注册国外账户)\nhttp://www.skrill.com\n要注册欧洲国家的资料才有开卡选项。\n\n22. Neteller(需要注册国外账户)\nwww.neteller.com\n\n23. v-preca(需要日本ip注册 少数中国卡能够充值)\nhttp://vpc.lifecard.co.jp\n\n24. mun-prepaid(需要日本ip注册)\n日元卡或者日本便利店充值\nwww.mun-prepaid.com\n\n25. Giftcardmall\nwww.giftcardmall.com\n此网站要美国信用卡或者是借记卡进行购买\n\n26. netspend(需翻墙 国外身份认证)\nwww.Netspend.com\n\n27. vanilla(实体卡、需要国外身份或者是便利店购买)\n也可以找我们进行购买。\nwww.vanilla.com\n\n28. 通汇香港\nhttps://www.transforex.hk/\n此卡支持amazon googleplay paypal 等网站需要携带护照和身份证到香港总公司进行开卡!用身份证就能通过认证,可以开实体卡和虚拟卡\n\n29. Entropay 欧贝通\nwww.Entropay.com\n不认证可以开五张卡,4067卡段,该卡可以用三三金融卡进行充值,可以自定义充值金额,认证过的账户可以开出10张卡片,可以自由决定充值的金额。欧贝通充值可以用 tapngo卡和三三金融进行充值,经本人测试是中国用户目前最好使的充值方法,tapngo和三三金融可以自行在香港购买。\n\n30. payoneer\npayoneer是目前非常不错的虚拟卡平台,身份证即可申请下来,遗憾的是申请到收到卡需要一个月左右的时间,值得一提的是payoneer更吸引我们的是他有美国银行账户、美元、欧元、日元、英镑银行账户可供我们申请选择,非常值得拥有。\n\n31. Mmvpaymmvpay\n是新加坡的虚拟卡平台可以开出mastercard 虚拟卡,需要新加坡手机号码注册!经过测试,账户不用认证,甚至是不用充值,一个账户直接可以获取5张卡片信息,包含卡号,有效期和卡密信息\n\n32. paypal mastercard\nhttps://www.paypal.com/us/webapps/mpp/paypal-prepaid-mastercard\n此卡是paypal美国发行的mastercard,支持大部分网站消费,绑定以及验证,但是需要美国护照、身份和银行卡信息申请,并且是需要真实的\n\n33. amazon mastercard\nhttps://www.amazon.co.jp/\n三井住友カード株式会社-amazon-mastercardゴード/dp/b0092vb6vkAmazon mastercard是amazon日本网站发行的mastercard虚拟卡账户,同样是需要日本身份证护照地址证明才能申请下来,专门针对日亚的mastercard。\n\n34. Cryptopaycryptopay\n是一个数字交易平台同属4665卡段的虚拟卡,不认证可以开出虚拟卡,但是前提是必须用欧洲国家的地址以及资料进行注册!\n\n35. Capitalistcapitalist\n是一个俄罗斯的电子钱包工具,目前不认证一个账户可以开2张mastercard虚拟卡,分别是一张欧元的一张,一张美元的,认证过后可以开通四张卡片,两张实体卡和两张虚拟卡。\n\n36. Unichangeunichange\n是一个电子货币兑换平台,该平台提供欧元和美元两种币种的虚拟卡。Unichange.me如果你没有某些资料,某些材料,那么万能的商人一定可以满足的了你!\n\n37. PayzaPayza\n也是一个电子钱包工具,类似于paypal之类的电子 钱包,这边主要介绍payza发行的mastercard虚拟卡,申请虚拟卡需要身份证和信用卡认证,可以用预付卡能看得到自己姓名的信用卡。\n\n38. mycard2go\nmycard2go是一个德国的虚拟卡,发卡行为wire bank ag卡种为visa,注册账户无需身份认证,但是需要进行充值了才能开卡,充值成功后自动开通卡片,卡种为欧元,需要用KLARNA网银或者是当地现金进行充值,也可以进行网银。\n\n39. Vandle\nhttps://app.vandle.jp/\nvandle是一家日本的虚拟卡提供平台,它提供mastercard虚拟卡片,需要再日本的便利店进行充值,也可以用日本的信用卡网银进行充值\n\n40. Chocom\nhttp://www.chocom.jp/index.html\nChocom也是一家日本的虚拟卡,可以在日本的便利店,或者是日本信用卡以及Chocom电子钱包进行充值。\n\n41. Docomokouza\ndocomokouza为日本docomo发行的visa虚拟信用卡,甚至是注册无需审查即可申请visa虚拟卡,最短有效期仅10天,还有一种则为3年需要日本的电子货币或者是信用卡对其进行充值。\nhttps://docomokouza.jpmastercard借记卡\n\n42. Nttsmarttrade\nnttsmarttrade是一家日本的在线虚拟卡平台,支持中文界面,非常方便,需要用日本信用卡段进行充值,中国和日本以外的mastercard无法进行充值。http://www.nttsmarttrade.co.jp/mastercardnet/cn/","published":1,"comments":1,"photos":[],"link":"","_id":"cln4obygi00aooko0evlmaeis","content":"
    \n
  1. 全球付
    http://www.globalcash.hk/
    在线申请,可充值,微信支付,开卡简单。

    \n
  2. \n
  3. 爱汇旅之卡
    http://www.ihui.com/
    此卡是目前最方便容易获得,并大量获得的实体mastercard实体卡,可以直接联系客服大量拿卡,一次上百张甚至是数百张,该卡支持paypal、amazon、google等网站。

    \n
  4. \n
  5. Tap&go 拍住赏
    http://tapngo.com.hk/
    可以支持微信,amazon、applepay 国际阿里云 GCE aws paypal等大部分网站,需要认证,买卡可以去香港总部或者某宝,最低100余额 充值可在香港便利店充值或者网上找人代充!

    \n
  6. \n
  7. 三三金融:
    https://cards.33finance.com
    需要到香港公司进行开卡,也可以找某宝,开出来的卡适用于大部分网站,包括欧贝通/amazon/阿里云/paypal/等等等等,充值也需要到香港便利店或者是到公司充,也可以找人代充。

    \n
  8. \n
  9. Tierrapay
    www.tierrapay.com卡段4665
    注册要用欧洲地址,比如英国,需要用pm或者是wmz充值,无需认证即可成功开卡。

    \n
  10. \n
  11. 通汇香港
    https://www.transforex.hk/
    此卡要携带护照和身份证前往香港开通,该公司有礼品卡,固定金额每天限购买3张,经测试,此卡适用于paypal amazon ebay等平台

    \n
  12. \n
  13. Uphold www.uphold.com
    需要护照和地址证明申请,支持银行 比特币进行充值

    \n
  14. \n
  15. Payeer
    http://www.zhesui.com/payeer/
    目前需要用欧洲国家的资料注册,

    \n
  16. \n
  17. Advcash
    目前需要用欧洲国家的资料注册

    \n
  18. \n
  19. Moneypolo
    http://www.zhesui.com/moneypolo/需要完成实名认证,以及收费购买。

    \n
  20. \n
  21. Wirexapp
    http://www.zhesui.com/wirex-app-visa/
    4665卡段,目前需要用欧洲国家地址注册申请。没认证只能比特币充值。

    \n
  22. \n
  23. Payoneer派安盈
    附带美国 日本 英国和欧洲银行账户
    http://www.payoneer.com/

    \n
  24. \n
  25. okpay
    需要用护照通过实名认证才能开卡。

    \n
  26. \n
  27. Qiwi
    https://qiwi.com/
    需要俄罗斯电话卡注册成功才能开卡 (俄罗斯卡可以去淘宝买一个)

    \n
  28. \n
  29. ecoPayz
    http://www.zhesui.com/ecopayz-card/
    目前需要认证,该卡支持大部分网站,可以无限移除替换卡片。

    \n
  30. \n
  31. 浦发E-GO卡(需要有浦发实体卡)
    http://www.zhesui.com/e-go/
    该卡可以开出银联 mastercard visa AME 四种卡片

    \n
  32. \n
  33. Yandexmoney
    money.yandex.ru
    以上虚拟卡渠道基本都是国外电子钱包发行的,类似于国内的支付宝,不同的是除开少数几个支持人民币和国内银行充值的之外,其他基本都需要使用国外银行卡或者是电子钱包、信用卡充值,如果没有的话我们可以通过兑换的方式为该网站充值,具体兑换商可参照电子货币兑换网中国上面所说的兑换网站以及方法:电子货币兑换网中国:http://currencyexchange.net.cn/

    \n
  34. \n
  35. VirtualCards(支持支付宝充值)
    https://VirtualCards.us
    50美元起充,注册成功无需充值既可出卡号

    \n
  36. \n
  37. payweb
    http://payweb.com
    (需要付费、只有实体卡)可以用银联进行充值!

    \n
  38. \n
  39. Solid Trust Pay
    http://SolidTrustPay.com

    \n
  40. \n
  41. Skrill(需要注册国外账户)
    http://www.skrill.com
    要注册欧洲国家的资料才有开卡选项。

    \n
  42. \n
  43. Neteller(需要注册国外账户)
    www.neteller.com

    \n
  44. \n
  45. v-preca(需要日本ip注册 少数中国卡能够充值)
    http://vpc.lifecard.co.jp

    \n
  46. \n
  47. mun-prepaid(需要日本ip注册)
    日元卡或者日本便利店充值
    www.mun-prepaid.com

    \n
  48. \n
  49. Giftcardmall
    www.giftcardmall.com
    此网站要美国信用卡或者是借记卡进行购买

    \n
  50. \n
  51. netspend(需翻墙 国外身份认证)
    www.Netspend.com

    \n
  52. \n
  53. vanilla(实体卡、需要国外身份或者是便利店购买)
    也可以找我们进行购买。
    www.vanilla.com

    \n
  54. \n
  55. 通汇香港
    https://www.transforex.hk/
    此卡支持amazon googleplay paypal 等网站需要携带护照和身份证到香港总公司进行开卡!用身份证就能通过认证,可以开实体卡和虚拟卡

    \n
  56. \n
  57. Entropay 欧贝通
    www.Entropay.com
    不认证可以开五张卡,4067卡段,该卡可以用三三金融卡进行充值,可以自定义充值金额,认证过的账户可以开出10张卡片,可以自由决定充值的金额。欧贝通充值可以用 tapngo卡和三三金融进行充值,经本人测试是中国用户目前最好使的充值方法,tapngo和三三金融可以自行在香港购买。

    \n
  58. \n
  59. payoneer
    payoneer是目前非常不错的虚拟卡平台,身份证即可申请下来,遗憾的是申请到收到卡需要一个月左右的时间,值得一提的是payoneer更吸引我们的是他有美国银行账户、美元、欧元、日元、英镑银行账户可供我们申请选择,非常值得拥有。

    \n
  60. \n
  61. Mmvpaymmvpay
    是新加坡的虚拟卡平台可以开出mastercard 虚拟卡,需要新加坡手机号码注册!经过测试,账户不用认证,甚至是不用充值,一个账户直接可以获取5张卡片信息,包含卡号,有效期和卡密信息

    \n
  62. \n
  63. paypal mastercard
    https://www.paypal.com/us/webapps/mpp/paypal-prepaid-mastercard
    此卡是paypal美国发行的mastercard,支持大部分网站消费,绑定以及验证,但是需要美国护照、身份和银行卡信息申请,并且是需要真实的

    \n
  64. \n
  65. amazon mastercard
    https://www.amazon.co.jp/
    三井住友カード株式会社-amazon-mastercardゴード/dp/b0092vb6vkAmazon mastercard是amazon日本网站发行的mastercard虚拟卡账户,同样是需要日本身份证护照地址证明才能申请下来,专门针对日亚的mastercard。

    \n
  66. \n
  67. Cryptopaycryptopay
    是一个数字交易平台同属4665卡段的虚拟卡,不认证可以开出虚拟卡,但是前提是必须用欧洲国家的地址以及资料进行注册!

    \n
  68. \n
  69. Capitalistcapitalist
    是一个俄罗斯的电子钱包工具,目前不认证一个账户可以开2张mastercard虚拟卡,分别是一张欧元的一张,一张美元的,认证过后可以开通四张卡片,两张实体卡和两张虚拟卡。

    \n
  70. \n
  71. Unichangeunichange
    是一个电子货币兑换平台,该平台提供欧元和美元两种币种的虚拟卡。Unichange.me如果你没有某些资料,某些材料,那么万能的商人一定可以满足的了你!

    \n
  72. \n
  73. PayzaPayza
    也是一个电子钱包工具,类似于paypal之类的电子 钱包,这边主要介绍payza发行的mastercard虚拟卡,申请虚拟卡需要身份证和信用卡认证,可以用预付卡能看得到自己姓名的信用卡。

    \n
  74. \n
  75. mycard2go
    mycard2go是一个德国的虚拟卡,发卡行为wire bank ag卡种为visa,注册账户无需身份认证,但是需要进行充值了才能开卡,充值成功后自动开通卡片,卡种为欧元,需要用KLARNA网银或者是当地现金进行充值,也可以进行网银。

    \n
  76. \n
  77. Vandle
    https://app.vandle.jp/
    vandle是一家日本的虚拟卡提供平台,它提供mastercard虚拟卡片,需要再日本的便利店进行充值,也可以用日本的信用卡网银进行充值

    \n
  78. \n
  79. Chocom
    http://www.chocom.jp/index.html
    Chocom也是一家日本的虚拟卡,可以在日本的便利店,或者是日本信用卡以及Chocom电子钱包进行充值。

    \n
  80. \n
  81. Docomokouza
    docomokouza为日本docomo发行的visa虚拟信用卡,甚至是注册无需审查即可申请visa虚拟卡,最短有效期仅10天,还有一种则为3年需要日本的电子货币或者是信用卡对其进行充值。
    https://docomokouza.jpmastercard借记卡

    \n
  82. \n
  83. Nttsmarttrade
    nttsmarttrade是一家日本的在线虚拟卡平台,支持中文界面,非常方便,需要用日本信用卡段进行充值,中国和日本以外的mastercard无法进行充值。http://www.nttsmarttrade.co.jp/mastercardnet/cn/

    \n
  84. \n
\n","site":{"data":{}},"excerpt":"","more":"
    \n
  1. 全球付
    http://www.globalcash.hk/
    在线申请,可充值,微信支付,开卡简单。

    \n
  2. \n
  3. 爱汇旅之卡
    http://www.ihui.com/
    此卡是目前最方便容易获得,并大量获得的实体mastercard实体卡,可以直接联系客服大量拿卡,一次上百张甚至是数百张,该卡支持paypal、amazon、google等网站。

    \n
  4. \n
  5. Tap&go 拍住赏
    http://tapngo.com.hk/
    可以支持微信,amazon、applepay 国际阿里云 GCE aws paypal等大部分网站,需要认证,买卡可以去香港总部或者某宝,最低100余额 充值可在香港便利店充值或者网上找人代充!

    \n
  6. \n
  7. 三三金融:
    https://cards.33finance.com
    需要到香港公司进行开卡,也可以找某宝,开出来的卡适用于大部分网站,包括欧贝通/amazon/阿里云/paypal/等等等等,充值也需要到香港便利店或者是到公司充,也可以找人代充。

    \n
  8. \n
  9. Tierrapay
    www.tierrapay.com卡段4665
    注册要用欧洲地址,比如英国,需要用pm或者是wmz充值,无需认证即可成功开卡。

    \n
  10. \n
  11. 通汇香港
    https://www.transforex.hk/
    此卡要携带护照和身份证前往香港开通,该公司有礼品卡,固定金额每天限购买3张,经测试,此卡适用于paypal amazon ebay等平台

    \n
  12. \n
  13. Uphold www.uphold.com
    需要护照和地址证明申请,支持银行 比特币进行充值

    \n
  14. \n
  15. Payeer
    http://www.zhesui.com/payeer/
    目前需要用欧洲国家的资料注册,

    \n
  16. \n
  17. Advcash
    目前需要用欧洲国家的资料注册

    \n
  18. \n
  19. Moneypolo
    http://www.zhesui.com/moneypolo/需要完成实名认证,以及收费购买。

    \n
  20. \n
  21. Wirexapp
    http://www.zhesui.com/wirex-app-visa/
    4665卡段,目前需要用欧洲国家地址注册申请。没认证只能比特币充值。

    \n
  22. \n
  23. Payoneer派安盈
    附带美国 日本 英国和欧洲银行账户
    http://www.payoneer.com/

    \n
  24. \n
  25. okpay
    需要用护照通过实名认证才能开卡。

    \n
  26. \n
  27. Qiwi
    https://qiwi.com/
    需要俄罗斯电话卡注册成功才能开卡 (俄罗斯卡可以去淘宝买一个)

    \n
  28. \n
  29. ecoPayz
    http://www.zhesui.com/ecopayz-card/
    目前需要认证,该卡支持大部分网站,可以无限移除替换卡片。

    \n
  30. \n
  31. 浦发E-GO卡(需要有浦发实体卡)
    http://www.zhesui.com/e-go/
    该卡可以开出银联 mastercard visa AME 四种卡片

    \n
  32. \n
  33. Yandexmoney
    money.yandex.ru
    以上虚拟卡渠道基本都是国外电子钱包发行的,类似于国内的支付宝,不同的是除开少数几个支持人民币和国内银行充值的之外,其他基本都需要使用国外银行卡或者是电子钱包、信用卡充值,如果没有的话我们可以通过兑换的方式为该网站充值,具体兑换商可参照电子货币兑换网中国上面所说的兑换网站以及方法:电子货币兑换网中国:http://currencyexchange.net.cn/

    \n
  34. \n
  35. VirtualCards(支持支付宝充值)
    https://VirtualCards.us
    50美元起充,注册成功无需充值既可出卡号

    \n
  36. \n
  37. payweb
    http://payweb.com
    (需要付费、只有实体卡)可以用银联进行充值!

    \n
  38. \n
  39. Solid Trust Pay
    http://SolidTrustPay.com

    \n
  40. \n
  41. Skrill(需要注册国外账户)
    http://www.skrill.com
    要注册欧洲国家的资料才有开卡选项。

    \n
  42. \n
  43. Neteller(需要注册国外账户)
    www.neteller.com

    \n
  44. \n
  45. v-preca(需要日本ip注册 少数中国卡能够充值)
    http://vpc.lifecard.co.jp

    \n
  46. \n
  47. mun-prepaid(需要日本ip注册)
    日元卡或者日本便利店充值
    www.mun-prepaid.com

    \n
  48. \n
  49. Giftcardmall
    www.giftcardmall.com
    此网站要美国信用卡或者是借记卡进行购买

    \n
  50. \n
  51. netspend(需翻墙 国外身份认证)
    www.Netspend.com

    \n
  52. \n
  53. vanilla(实体卡、需要国外身份或者是便利店购买)
    也可以找我们进行购买。
    www.vanilla.com

    \n
  54. \n
  55. 通汇香港
    https://www.transforex.hk/
    此卡支持amazon googleplay paypal 等网站需要携带护照和身份证到香港总公司进行开卡!用身份证就能通过认证,可以开实体卡和虚拟卡

    \n
  56. \n
  57. Entropay 欧贝通
    www.Entropay.com
    不认证可以开五张卡,4067卡段,该卡可以用三三金融卡进行充值,可以自定义充值金额,认证过的账户可以开出10张卡片,可以自由决定充值的金额。欧贝通充值可以用 tapngo卡和三三金融进行充值,经本人测试是中国用户目前最好使的充值方法,tapngo和三三金融可以自行在香港购买。

    \n
  58. \n
  59. payoneer
    payoneer是目前非常不错的虚拟卡平台,身份证即可申请下来,遗憾的是申请到收到卡需要一个月左右的时间,值得一提的是payoneer更吸引我们的是他有美国银行账户、美元、欧元、日元、英镑银行账户可供我们申请选择,非常值得拥有。

    \n
  60. \n
  61. Mmvpaymmvpay
    是新加坡的虚拟卡平台可以开出mastercard 虚拟卡,需要新加坡手机号码注册!经过测试,账户不用认证,甚至是不用充值,一个账户直接可以获取5张卡片信息,包含卡号,有效期和卡密信息

    \n
  62. \n
  63. paypal mastercard
    https://www.paypal.com/us/webapps/mpp/paypal-prepaid-mastercard
    此卡是paypal美国发行的mastercard,支持大部分网站消费,绑定以及验证,但是需要美国护照、身份和银行卡信息申请,并且是需要真实的

    \n
  64. \n
  65. amazon mastercard
    https://www.amazon.co.jp/
    三井住友カード株式会社-amazon-mastercardゴード/dp/b0092vb6vkAmazon mastercard是amazon日本网站发行的mastercard虚拟卡账户,同样是需要日本身份证护照地址证明才能申请下来,专门针对日亚的mastercard。

    \n
  66. \n
  67. Cryptopaycryptopay
    是一个数字交易平台同属4665卡段的虚拟卡,不认证可以开出虚拟卡,但是前提是必须用欧洲国家的地址以及资料进行注册!

    \n
  68. \n
  69. Capitalistcapitalist
    是一个俄罗斯的电子钱包工具,目前不认证一个账户可以开2张mastercard虚拟卡,分别是一张欧元的一张,一张美元的,认证过后可以开通四张卡片,两张实体卡和两张虚拟卡。

    \n
  70. \n
  71. Unichangeunichange
    是一个电子货币兑换平台,该平台提供欧元和美元两种币种的虚拟卡。Unichange.me如果你没有某些资料,某些材料,那么万能的商人一定可以满足的了你!

    \n
  72. \n
  73. PayzaPayza
    也是一个电子钱包工具,类似于paypal之类的电子 钱包,这边主要介绍payza发行的mastercard虚拟卡,申请虚拟卡需要身份证和信用卡认证,可以用预付卡能看得到自己姓名的信用卡。

    \n
  74. \n
  75. mycard2go
    mycard2go是一个德国的虚拟卡,发卡行为wire bank ag卡种为visa,注册账户无需身份认证,但是需要进行充值了才能开卡,充值成功后自动开通卡片,卡种为欧元,需要用KLARNA网银或者是当地现金进行充值,也可以进行网银。

    \n
  76. \n
  77. Vandle
    https://app.vandle.jp/
    vandle是一家日本的虚拟卡提供平台,它提供mastercard虚拟卡片,需要再日本的便利店进行充值,也可以用日本的信用卡网银进行充值

    \n
  78. \n
  79. Chocom
    http://www.chocom.jp/index.html
    Chocom也是一家日本的虚拟卡,可以在日本的便利店,或者是日本信用卡以及Chocom电子钱包进行充值。

    \n
  80. \n
  81. Docomokouza
    docomokouza为日本docomo发行的visa虚拟信用卡,甚至是注册无需审查即可申请visa虚拟卡,最短有效期仅10天,还有一种则为3年需要日本的电子货币或者是信用卡对其进行充值。
    https://docomokouza.jpmastercard借记卡

    \n
  82. \n
  83. Nttsmarttrade
    nttsmarttrade是一家日本的在线虚拟卡平台,支持中文界面,非常方便,需要用日本信用卡段进行充值,中国和日本以外的mastercard无法进行充值。http://www.nttsmarttrade.co.jp/mastercardnet/cn/

    \n
  84. \n
\n"},{"abbrlink":"94ed24f6","date":"2023-04-22T05:29:06.000Z","excerpt":"说明 下载之后用软件写入U盘或者硬盘. 引导的修改请参照教程 下载 链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦 ","title":"黑群晖DSM918 引导7.1.0镜像分享","updated":"2023-04-22T05:29:11.000Z","cover":null,"_content":"## 说明\n\n下载之后用软件写入U盘或者硬盘.\n\n引导的修改请参照教程\n\n## 下载\n\n\n链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦\n","source":"_posts/DSM918黑群晖引导7.1.0.md","raw":"---\nabbrlink: 94ed24f6\ncategories:\n - - 分享\ndate: '2023-04-22 13:29:06'\nexcerpt: >-\n 说明 下载之后用软件写入U盘或者硬盘. 引导的修改请参照教程 下载 链接:\n https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj\n 复制这段内容后打开百度网盘手机App,操作更方便哦 \ntags:\n - 黑群晖\n - 镜像\n - DSM918\ntitle: 黑群晖DSM918 引导7.1.0镜像分享\nupdated: 'Sat, 22 Apr 2023 05:29:11 GMT'\ncover:\n---\n## 说明\n\n下载之后用软件写入U盘或者硬盘.\n\n引导的修改请参照教程\n\n## 下载\n\n\n链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦\n","slug":"DSM918黑群晖引导7.1.0","published":1,"comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygi00aqoko01uj5098h","content":"

说明

下载之后用软件写入U盘或者硬盘.

\n

引导的修改请参照教程

\n

下载

链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦

\n","site":{"data":{}},"more":"

说明

下载之后用软件写入U盘或者硬盘.

\n

引导的修改请参照教程

\n

下载

链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦

\n"},{"title":"Git在windows下区分大小写","abbrlink":61166,"date":"2023-03-21T11:03:13.000Z","_content":"在`.deploy_git`目录下运行\n```bash\ngit config core.ignorecase false\n```\n可解决github pages 下CNAME被改为小写导致绑定域名失效的情况","source":"_posts/Git在windows下区分大小写.md","raw":"---\ntitle: Git在windows下区分大小写\ntags:\n - git\ncategories:\n - 分享\nabbrlink: 61166\ndate: 2023-03-21 19:03:13\n---\n在`.deploy_git`目录下运行\n```bash\ngit config core.ignorecase false\n```\n可解决github pages 下CNAME被改为小写导致绑定域名失效的情况","slug":"Git在windows下区分大小写","published":1,"updated":"2023-09-29T07:51:06.362Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygj00asoko0ctp79eo3","content":"

.deploy_git目录下运行

\n
1
git config core.ignorecase false
\n

可解决github pages 下CNAME被改为小写导致绑定域名失效的情况

\n","site":{"data":{}},"excerpt":"","more":"

.deploy_git目录下运行

\n
1
git config core.ignorecase false
\n

可解决github pages 下CNAME被改为小写导致绑定域名失效的情况

\n"},{"title":"CentOS系统时间和时区查看以及修改的方法","excerpt":"","abbrlink":8952,"date":"2016-11-14T05:38:48.000Z","_content":"\n一、时间修改 远程连接到centos 或者直接登录系统 \n\n```\ndate \n```\n查看系统时间 \n\n\n```\ndate -s \n```\n修改时间 看下面的例子\n\n ```\n date -s  03/04/2013\n ```\n (将系统日期设定为2013年03月04日)\n```\ndate -s  110:38\n```\n(将系统时间设定为上午 10:38) \n\n二、时区修改 \n\n先查看时区 \n```\ndate -R  \n``` \n\n修改时区: (将Asia/shanghai-上海时区写入当前时区)\n\n ```\n cp -f /usr/share/zoneinfo/Asia/Shanghai     /etc/localtime \n ```\n \n 提示是否覆盖,输入Y回车, 然后 \n ```\n date\n ```\n 查看时区和时间(CST,中国时区)","source":"_posts/CentOS系统时间和时区查看以及修改的方法.md","raw":"---\ntitle: CentOS系统时间和时区查看以及修改的方法\ntags:\n - centos\n - VPS\nexcerpt: ''\ncategories: 分享\nabbrlink: 8952\ndate: 2016-11-14 13:38:48\n---\n\n一、时间修改 远程连接到centos 或者直接登录系统 \n\n```\ndate \n```\n查看系统时间 \n\n\n```\ndate -s \n```\n修改时间 看下面的例子\n\n ```\n date -s  03/04/2013\n ```\n (将系统日期设定为2013年03月04日)\n```\ndate -s  110:38\n```\n(将系统时间设定为上午 10:38) \n\n二、时区修改 \n\n先查看时区 \n```\ndate -R  \n``` \n\n修改时区: (将Asia/shanghai-上海时区写入当前时区)\n\n ```\n cp -f /usr/share/zoneinfo/Asia/Shanghai     /etc/localtime \n ```\n \n 提示是否覆盖,输入Y回车, 然后 \n ```\n date\n ```\n 查看时区和时间(CST,中国时区)","slug":"CentOS系统时间和时区查看以及修改的方法","published":1,"updated":"2023-09-29T07:51:06.353Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygk00avoko05lpmhi95","content":"

一、时间修改 远程连接到centos 或者直接登录系统

\n
1
date 
\n

查看系统时间

\n
1
date -s 
\n

修改时间 看下面的例子

\n
1
date -s  03/04/2013
\n

(将系统日期设定为2013年03月04日)

\n
1
date -s  110:38
\n

(将系统时间设定为上午 10:38)

\n

二、时区修改

\n

先查看时区

\n
1
date -R  
\n\n

修改时区: (将Asia/shanghai-上海时区写入当前时区)

\n
1
cp -f /usr/share/zoneinfo/Asia/Shanghai     /etc/localtime 
\n

提示是否覆盖,输入Y回车, 然后

1
date

查看时区和时间(CST,中国时区)

\n","site":{"data":{}},"more":"

一、时间修改 远程连接到centos 或者直接登录系统

\n
1
date 
\n

查看系统时间

\n
1
date -s 
\n

修改时间 看下面的例子

\n
1
date -s  03/04/2013
\n

(将系统日期设定为2013年03月04日)

\n
1
date -s  110:38
\n

(将系统时间设定为上午 10:38)

\n

二、时区修改

\n

先查看时区

\n
1
date -R  
\n\n

修改时区: (将Asia/shanghai-上海时区写入当前时区)

\n
1
cp -f /usr/share/zoneinfo/Asia/Shanghai     /etc/localtime 
\n

提示是否覆盖,输入Y回车, 然后

1
date

查看时区和时间(CST,中国时区)

\n"},{"abbrlink":"1c81ee10","date":"2023-06-16T02:59:36.682Z","excerpt":"...","title":"LEDE 软路由安装“koolss”离线插件包提示含非法关键字的解决方法","updated":"2023-09-29T07:51:06.362Z","cover":null,"_content":"用SSH登录软路由\n\n```\nssh root@192.168.1.1\n```\n\n然后输入\n\n```\nsed -i 's/\\tdetect_package/\\t# detect_package/g' /koolshare/scripts/ks_tar_install.sh\n```\n\n再安装科学上网插件即可\n\n[koolss](https://blog-1312096806.cos.ap-guangzhou.myqcloud.com/halo/koolss_2.2.2.tar.gz)\n\n","source":"_posts/LEDE 软路由安装“XX上网”离线插件包提示含非法关键字的解决方法.md","raw":"---\nabbrlink: 1c81ee10\ncategories:\n - - 分享\ndate: '2023-06-16T10:59:36.682323+08:00'\nexcerpt: ...\ntags:\n - openwrt\n - lede\n - 软路由\n - 科学上网\ntitle: LEDE 软路由安装“koolss”离线插件包提示含非法关键字的解决方法\nupdated: '2023-6-16T11:4:22.86+8:0'\ncover:\n---\n用SSH登录软路由\n\n```\nssh root@192.168.1.1\n```\n\n然后输入\n\n```\nsed -i 's/\\tdetect_package/\\t# detect_package/g' /koolshare/scripts/ks_tar_install.sh\n```\n\n再安装科学上网插件即可\n\n[koolss](https://blog-1312096806.cos.ap-guangzhou.myqcloud.com/halo/koolss_2.2.2.tar.gz)\n\n","slug":"LEDE 软路由安装“XX上网”离线插件包提示含非法关键字的解决方法","published":1,"comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygl00axoko039iy1kiz","content":"

用SSH登录软路由

\n
1
ssh root@192.168.1.1
\n\n

然后输入

\n
1
sed -i 's/\\tdetect_package/\\t# detect_package/g' /koolshare/scripts/ks_tar_install.sh
\n\n

再安装科学上网插件即可

\n

koolss

\n","site":{"data":{}},"more":"

用SSH登录软路由

\n
1
ssh root@192.168.1.1
\n\n

然后输入

\n
1
sed -i 's/\\tdetect_package/\\t# detect_package/g' /koolshare/scripts/ks_tar_install.sh
\n\n

再安装科学上网插件即可

\n

koolss

\n"},{"title":"Vi编辑器的基本使用方法","abbrlink":22356,"date":"2016-11-16T00:37:48.000Z","_content":"\nvi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。\n由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。\nVi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。 \n\n1、vi的基本概念 \n\n基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:\n\n1) 命令行模式command mode) \n\n控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。 \n\n2) 插入模式(Insert mode)\n\n只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。 \n\n3) 底行模式(last line mode) \n\n将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。 \n\n2、vi的基本操作\n\n a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!\n \n b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 \n \n c) Insert 的切换 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。 \n \n d) 退出vi及保存文件\n\n在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:\n\nw filename (输入 「w filename」将文章以指定的文件名filename保存)\n\nwq (输入「wq」,存盘并退出vi)\n\nq! (输入q!, 不存盘强制退出vi)\n\n3、命令行模式(command mode)功能键 \n\n1). 插入模式 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。 \n\n2). 从插入模式切换为命令行模式 按「ESC」键。 \n\n3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往“后”移动一页。 按「ctrl」+「f」:屏幕往“前”移动一页。 按「ctrl」+「u」:屏幕往“后”移动半页。 按「ctrl」+「d」:屏幕往“前”移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的“行尾”。 按「^」:移动到光标所在行的“行首” 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如:5l,56l。 \n\n4). 删除文字 「x」:每按一次,删除光标所在位置的“后面”一个字符。 「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。 「dd」:删除光标所在行。 「#dd」:从光标所在行开始删除#行 \n\n5). 复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。 \n\n6). 替换 「r」:替换光标所在处的字符。 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。 \n\n7). 回复上一次操作 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。 \n\n8). 更改 「cw」:更改光标所在处的字到字尾处 「c#w」:例如,「c3w」表示更改3个字 9). 跳至指定的行 「ctrl」+「g」列出光标所在行的行号。 「#G」:例如,「15G」,表示移动光标至文章的第15行行首。 \n\n4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。 \n\nA) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。 \n\nB) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。 \n\nC) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。 \n\nD) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。 \n\nE) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。 \n\n5、vi命令列表 \n\n1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字“0”,光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字 \n\n2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。 \n\n对于第一次用vi,有几点注意要提醒一下: \n\n1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。\n\n切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。\n\n2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。\n\n3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)","source":"_posts/Vi编辑器的基本使用方法!.md","raw":"---\ntitle: Vi编辑器的基本使用方法\ntags:\n - Linux\ncategories: 分享\nabbrlink: 22356\ndate: 2016-11-16 08:37:48\n---\n\nvi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。\n由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。\nVi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。 \n\n1、vi的基本概念 \n\n基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:\n\n1) 命令行模式command mode) \n\n控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。 \n\n2) 插入模式(Insert mode)\n\n只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。 \n\n3) 底行模式(last line mode) \n\n将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。 \n\n2、vi的基本操作\n\n a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!\n \n b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 \n \n c) Insert 的切换 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。 \n \n d) 退出vi及保存文件\n\n在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:\n\nw filename (输入 「w filename」将文章以指定的文件名filename保存)\n\nwq (输入「wq」,存盘并退出vi)\n\nq! (输入q!, 不存盘强制退出vi)\n\n3、命令行模式(command mode)功能键 \n\n1). 插入模式 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。 \n\n2). 从插入模式切换为命令行模式 按「ESC」键。 \n\n3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往“后”移动一页。 按「ctrl」+「f」:屏幕往“前”移动一页。 按「ctrl」+「u」:屏幕往“后”移动半页。 按「ctrl」+「d」:屏幕往“前”移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的“行尾”。 按「^」:移动到光标所在行的“行首” 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如:5l,56l。 \n\n4). 删除文字 「x」:每按一次,删除光标所在位置的“后面”一个字符。 「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。 「dd」:删除光标所在行。 「#dd」:从光标所在行开始删除#行 \n\n5). 复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。 \n\n6). 替换 「r」:替换光标所在处的字符。 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。 \n\n7). 回复上一次操作 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。 \n\n8). 更改 「cw」:更改光标所在处的字到字尾处 「c#w」:例如,「c3w」表示更改3个字 9). 跳至指定的行 「ctrl」+「g」列出光标所在行的行号。 「#G」:例如,「15G」,表示移动光标至文章的第15行行首。 \n\n4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。 \n\nA) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。 \n\nB) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。 \n\nC) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。 \n\nD) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。 \n\nE) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。 \n\n5、vi命令列表 \n\n1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字“0”,光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字 \n\n2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。 \n\n对于第一次用vi,有几点注意要提醒一下: \n\n1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。\n\n切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。\n\n2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。\n\n3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)","slug":"Vi编辑器的基本使用方法!","published":1,"updated":"2023-09-29T07:51:06.363Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygl00azoko066h93056","content":"

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。
由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。
Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。

\n

1、vi的基本概念

\n

基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

\n
    \n
  1. 命令行模式command mode)
  2. \n
\n

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。

\n
    \n
  1. 插入模式(Insert mode)
  2. \n
\n

只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。

\n
    \n
  1. 底行模式(last line mode)
  2. \n
\n

将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。

\n

2、vi的基本操作

\n

a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!

\n

b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

\n

c) Insert 的切换 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。

\n

d) 退出vi及保存文件

\n

在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:

\n

w filename (输入 「w filename」将文章以指定的文件名filename保存)

\n

wq (输入「wq」,存盘并退出vi)

\n

q! (输入q!, 不存盘强制退出vi)

\n

3、命令行模式(command mode)功能键

\n

1). 插入模式 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

\n

2). 从插入模式切换为命令行模式 按「ESC」键。

\n

3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往“后”移动一页。 按「ctrl」+「f」:屏幕往“前”移动一页。 按「ctrl」+「u」:屏幕往“后”移动半页。 按「ctrl」+「d」:屏幕往“前”移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的“行尾”。 按「^」:移动到光标所在行的“行首” 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如:5l,56l。

\n

4). 删除文字 「x」:每按一次,删除光标所在位置的“后面”一个字符。 「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。 「dd」:删除光标所在行。 「#dd」:从光标所在行开始删除#行

\n

5). 复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

\n

6). 替换 「r」:替换光标所在处的字符。 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

\n

7). 回复上一次操作 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。

\n

8). 更改 「cw」:更改光标所在处的字到字尾处 「c#w」:例如,「c3w」表示更改3个字 9). 跳至指定的行 「ctrl」+「g」列出光标所在行的行号。 「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

\n

4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。

\n

A) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。

\n

B) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

\n

C) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

\n

D) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。

\n

E) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

\n

5、vi命令列表

\n

1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字“0”,光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字

\n

2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。

\n

对于第一次用vi,有几点注意要提醒一下:

\n

1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。

\n

切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

\n

2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。

\n

3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)

\n","site":{"data":{}},"excerpt":"","more":"

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。
由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。
Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。

\n

1、vi的基本概念

\n

基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

\n
    \n
  1. 命令行模式command mode)
  2. \n
\n

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。

\n
    \n
  1. 插入模式(Insert mode)
  2. \n
\n

只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。

\n
    \n
  1. 底行模式(last line mode)
  2. \n
\n

将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。

\n

2、vi的基本操作

\n

a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!

\n

b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

\n

c) Insert 的切换 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。

\n

d) 退出vi及保存文件

\n

在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:

\n

w filename (输入 「w filename」将文章以指定的文件名filename保存)

\n

wq (输入「wq」,存盘并退出vi)

\n

q! (输入q!, 不存盘强制退出vi)

\n

3、命令行模式(command mode)功能键

\n

1). 插入模式 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

\n

2). 从插入模式切换为命令行模式 按「ESC」键。

\n

3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往“后”移动一页。 按「ctrl」+「f」:屏幕往“前”移动一页。 按「ctrl」+「u」:屏幕往“后”移动半页。 按「ctrl」+「d」:屏幕往“前”移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的“行尾”。 按「^」:移动到光标所在行的“行首” 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如:5l,56l。

\n

4). 删除文字 「x」:每按一次,删除光标所在位置的“后面”一个字符。 「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。 「dd」:删除光标所在行。 「#dd」:从光标所在行开始删除#行

\n

5). 复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

\n

6). 替换 「r」:替换光标所在处的字符。 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

\n

7). 回复上一次操作 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。

\n

8). 更改 「cw」:更改光标所在处的字到字尾处 「c#w」:例如,「c3w」表示更改3个字 9). 跳至指定的行 「ctrl」+「g」列出光标所在行的行号。 「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

\n

4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。

\n

A) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。

\n

B) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

\n

C) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

\n

D) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。

\n

E) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

\n

5、vi命令列表

\n

1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字“0”,光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字

\n

2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。

\n

对于第一次用vi,有几点注意要提醒一下:

\n

1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。

\n

切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

\n

2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。

\n

3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)

\n"},{"layout":"post","cid":342,"title":"centos7 ssh连接慢的解决方法","slug":"centos7_ssh连接慢的解决方法","date":"2022-08-12T08:52:00.000Z","updated":"2022-08-12T08:55:00.000Z","status":"publish","author":"老孙","dtMode":0,"radioPostImg":"none","abbrlink":58592,"icon":null,"thumbnail":null,"_content":"\n\n```bash\nvim /etc/ssh/sshd_config\n```\n按i编辑插入\n找到\n`UseDNS`去掉前面的#号 改为 no\n\n`GSSAPIAuthentication` 改为 no\n\n然后`:wq `保存退出\n\n```bash\nsystemctl restart sshd\n```\n重启","source":"_posts/centos7_ssh连接慢的解决方法.md","raw":"---\nlayout: post\ncid: 342\ntitle: centos7 ssh连接慢的解决方法\nslug: solution-to-slow-ssh-connection-of-centos-7\ndate: '2022/08/12 16:52:00'\nupdated: '2022/08/12 16:55:00'\nstatus: publish\nauthor: 老孙\ncategories: 分享\ntags:\n - centos\ndtMode: 0\nradioPostImg: none\nabbrlink: 58592\nicon:\nthumbnail:\n---\n\n\n```bash\nvim /etc/ssh/sshd_config\n```\n按i编辑插入\n找到\n`UseDNS`去掉前面的#号 改为 no\n\n`GSSAPIAuthentication` 改为 no\n\n然后`:wq `保存退出\n\n```bash\nsystemctl restart sshd\n```\n重启","published":1,"comments":1,"photos":[],"link":"","_id":"cln4obygm00b1oko07rdt1v5y","content":"
1
vim /etc/ssh/sshd_config
\n

按i编辑插入
找到
UseDNS去掉前面的#号 改为 no

\n

GSSAPIAuthentication 改为 no

\n

然后:wq 保存退出

\n
1
systemctl restart sshd
\n

重启

\n","site":{"data":{}},"excerpt":"","more":"
1
vim /etc/ssh/sshd_config
\n

按i编辑插入
找到
UseDNS去掉前面的#号 改为 no

\n

GSSAPIAuthentication 改为 no

\n

然后:wq 保存退出

\n
1
systemctl restart sshd
\n

重启

\n"},{"layout":"post","cid":374,"title":"centos7安装后没有网络","slug":"centos7安装后没有网络","date":"2022-11-29T01:56:00.000Z","updated":"2022-11-29T01:57:00.000Z","status":"publish","author":"老孙","abbrlink":6609,"_content":"\n\n以`root`账号登陆\n用`ip addr`命令查看网络参数。\n打开`eth0`网卡的配置文件\n\n```bash\nvi /etc/sysconfig/network-scripts/ifcfg-eth0\n```\n\n把`NOBOOT`参数`no`,修改为`yes`\n重启网络或者重启服务器都可","source":"_posts/centos7安装后没有网络.md","raw":"---\nlayout: post\ncid: 374\ntitle: centos7安装后没有网络\nslug: there-is-no-network-after-centos7-installation\ndate: '2022/11/29 09:56:00'\nupdated: '2022/11/29 09:57:00'\nstatus: publish\nauthor: 老孙\ncategories: 分享\ntags:\n - centos\nabbrlink: 6609\n---\n\n\n以`root`账号登陆\n用`ip addr`命令查看网络参数。\n打开`eth0`网卡的配置文件\n\n```bash\nvi /etc/sysconfig/network-scripts/ifcfg-eth0\n```\n\n把`NOBOOT`参数`no`,修改为`yes`\n重启网络或者重启服务器都可","published":1,"comments":1,"photos":[],"link":"","_id":"cln4obygm00b4oko05ez0aioh","content":"

root账号登陆
ip addr命令查看网络参数。
打开eth0网卡的配置文件

\n
1
vi /etc/sysconfig/network-scripts/ifcfg-eth0
\n\n

NOBOOT参数no,修改为yes
重启网络或者重启服务器都可

\n","site":{"data":{}},"excerpt":"","more":"

root账号登陆
ip addr命令查看网络参数。
打开eth0网卡的配置文件

\n
1
vi /etc/sysconfig/network-scripts/ifcfg-eth0
\n\n

NOBOOT参数no,修改为yes
重启网络或者重启服务器都可

\n"},{"title":"Cloud Torrent for centos一键安装","published":1,"hideInList":false,"isTop":false,"abbrlink":"eac40a64","date":"2017-05-27T13:54:00.000Z","feature":null,"_content":"\n\n支持 离线下载 BT和磁力链接和边下边播 的老司机坐骑 —— Cloud Torrent\n声明:本文章仅提供 BT/磁力链接 下载工具的安装方法和说明,任何使用此工具 下载版权侵权文件或导致任何经济损失,皆和本人无任何关系!如果你不同意或有异议,请关闭这个网页!\n![10-1.png][1]\n - 系统需求\nCentOS / Debian / Ubuntu 都可以,因为是 Go语言写的\n- 脚本版本:\nVer: 1.0.3\n\n- Cloud Torrent特点\n支持 BT下载\n支持 磁力链接下载\n支持 搜索磁力链接\n支持 离线下载\n支持 边下边播( 格式限制:mp4/wbem/ogg,同时需要手动输入链接)\n可视化界面 Web UI\n- 安装步骤\n\n\n wget -N --no-check-certificate https://www.xuanlove.download/sh/cloudt.sh && chmod +x cloudt.sh && bash cloudt.sh\n\n\n下载运行完毕脚本,就会直接开始安装 Cloud Torrent ,安装过程中如果出现让你选择Y和N的,都选Y。\n安装完成之后,就会提醒你,输入要开放的端口(推荐:默认 8000)\n启动后,访问 http://VPS_IP:8000 即可看到Web UI界面了。\n- 脚本使用说明\n\n \n\n bash cloudt.sh\n #可以直接输入这个命令,会自动判断是否需要 安装/启动/停止 Cloud Torrent\n  \n bash cloudt.sh install\n #安装 Cloud Torrent\n  \n bash cloudt.sh start\n #启动 Cloud Torrent\n  \n bash cloudt.sh stop\n #停止 Cloud Torrent\n  \n bash cloudt.sh tail\n #查看 Cloud Torrent 日志\n  \n bash cloudt.sh uninstall\n #卸载 Cloud Torrent\n\n\n- Cloud Torrent使用说明\nCloud Torrent可以直接在输入中输入 磁力链接 或者 在线的BT种子(不支持本地上传),点击下面的 蓝色的按钮,就会开始解析资源。\n--- \n\n按钮说明\n----\n\n成功解析后,就会显示如下的界面,开始下载。\nFiles 是查看正在下载的文件列表, Start 是启动下载(默认解析后直接启动下载), Stop 是停止下载。\n还有,如果你下载完毕或者点了 Stop 停止下载,那么 Stop 就会变成 Remove 删除任务的按钮了。\n\n搜索磁力链接\n----------\n\nCloud Torrent支持搜索磁力链接,在输入栏中直接输入你要搜索的文件名称,同时点击 绿色的按钮 选择一个搜索源,然后点击 蓝色的Search 按钮就可以搜索了。\n注意:Cloud Torrent是国外人写的,所以这些搜索源均是国外的磁力链接网站,搜索到的资源基本没有中文的,所以非特殊需求的这个功能就没什么卵用了。\n\n注意事项\n------\n\nBT和磁力链接的速度是和, 磁力链接/BT 的用户上传共享量 和 中心服务器的宽带质量,以及你下载 磁力链接/BT 的VPS的宽带有关系。\n这种软件在某些程度上比不上 国内的迅雷,毕竟迅雷 用户了很大共享了很多的上传速度,而且还有缓存的中心服务器,所以才会那么快。\n如果你是国外的VPS,特别是美国的,一定要注意下载 BT/磁力链接 容易遇到蜜罐,然后被投诉封VPS。建议使用欧洲的罗马尼亚,那里的VPS无视版权,当然拉回本地,速度肯定也不会多快\n# 无法访问你的 http://IP:端口\n可能是防火墙规则的问题,使用下面这个命令来开放端口\n\n iptables -I INPUT -p tcp --dport 端口 -j ACCEPT\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/05/27/823290012.png\n\n\n\n\n\n","source":"_posts/cloud-torrent-for-centos-yi-jian-an-zhuang.md","raw":"---\ntitle: Cloud Torrent for centos一键安装\ncategories: 分享\ntags:\n - torrent\n - 磁力\n - 下载\n - cloud torrent\n - centos\npublished: true\nhideInList: false\nisTop: false\nabbrlink: eac40a64\ndate: 2017-05-27 21:54:00\nfeature:\n---\n\n\n支持 离线下载 BT和磁力链接和边下边播 的老司机坐骑 —— Cloud Torrent\n声明:本文章仅提供 BT/磁力链接 下载工具的安装方法和说明,任何使用此工具 下载版权侵权文件或导致任何经济损失,皆和本人无任何关系!如果你不同意或有异议,请关闭这个网页!\n![10-1.png][1]\n - 系统需求\nCentOS / Debian / Ubuntu 都可以,因为是 Go语言写的\n- 脚本版本:\nVer: 1.0.3\n\n- Cloud Torrent特点\n支持 BT下载\n支持 磁力链接下载\n支持 搜索磁力链接\n支持 离线下载\n支持 边下边播( 格式限制:mp4/wbem/ogg,同时需要手动输入链接)\n可视化界面 Web UI\n- 安装步骤\n\n\n wget -N --no-check-certificate https://www.xuanlove.download/sh/cloudt.sh && chmod +x cloudt.sh && bash cloudt.sh\n\n\n下载运行完毕脚本,就会直接开始安装 Cloud Torrent ,安装过程中如果出现让你选择Y和N的,都选Y。\n安装完成之后,就会提醒你,输入要开放的端口(推荐:默认 8000)\n启动后,访问 http://VPS_IP:8000 即可看到Web UI界面了。\n- 脚本使用说明\n\n \n\n bash cloudt.sh\n #可以直接输入这个命令,会自动判断是否需要 安装/启动/停止 Cloud Torrent\n  \n bash cloudt.sh install\n #安装 Cloud Torrent\n  \n bash cloudt.sh start\n #启动 Cloud Torrent\n  \n bash cloudt.sh stop\n #停止 Cloud Torrent\n  \n bash cloudt.sh tail\n #查看 Cloud Torrent 日志\n  \n bash cloudt.sh uninstall\n #卸载 Cloud Torrent\n\n\n- Cloud Torrent使用说明\nCloud Torrent可以直接在输入中输入 磁力链接 或者 在线的BT种子(不支持本地上传),点击下面的 蓝色的按钮,就会开始解析资源。\n--- \n\n按钮说明\n----\n\n成功解析后,就会显示如下的界面,开始下载。\nFiles 是查看正在下载的文件列表, Start 是启动下载(默认解析后直接启动下载), Stop 是停止下载。\n还有,如果你下载完毕或者点了 Stop 停止下载,那么 Stop 就会变成 Remove 删除任务的按钮了。\n\n搜索磁力链接\n----------\n\nCloud Torrent支持搜索磁力链接,在输入栏中直接输入你要搜索的文件名称,同时点击 绿色的按钮 选择一个搜索源,然后点击 蓝色的Search 按钮就可以搜索了。\n注意:Cloud Torrent是国外人写的,所以这些搜索源均是国外的磁力链接网站,搜索到的资源基本没有中文的,所以非特殊需求的这个功能就没什么卵用了。\n\n注意事项\n------\n\nBT和磁力链接的速度是和, 磁力链接/BT 的用户上传共享量 和 中心服务器的宽带质量,以及你下载 磁力链接/BT 的VPS的宽带有关系。\n这种软件在某些程度上比不上 国内的迅雷,毕竟迅雷 用户了很大共享了很多的上传速度,而且还有缓存的中心服务器,所以才会那么快。\n如果你是国外的VPS,特别是美国的,一定要注意下载 BT/磁力链接 容易遇到蜜罐,然后被投诉封VPS。建议使用欧洲的罗马尼亚,那里的VPS无视版权,当然拉回本地,速度肯定也不会多快\n# 无法访问你的 http://IP:端口\n可能是防火墙规则的问题,使用下面这个命令来开放端口\n\n iptables -I INPUT -p tcp --dport 端口 -j ACCEPT\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/05/27/823290012.png\n\n\n\n\n\n","slug":"cloud-torrent-for-centos-yi-jian-an-zhuang","updated":"2023-09-29T07:51:06.364Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygn00b7oko01rmaep60","content":"

支持 离线下载 BT和磁力链接和边下边播 的老司机坐骑 —— Cloud Torrent
声明:本文章仅提供 BT/磁力链接 下载工具的安装方法和说明,任何使用此工具 下载版权侵权文件或导致任何经济损失,皆和本人无任何关系!如果你不同意或有异议,请关闭这个网页!
\"10-1.png\"

\n\n

下载运行完毕脚本,就会直接开始安装 Cloud Torrent ,安装过程中如果出现让你选择Y和N的,都选Y。
安装完成之后,就会提醒你,输入要开放的端口(推荐:默认 8000)
启动后,访问 http://VPS_IP:8000 即可看到Web UI界面了。

\n\n
\n

按钮说明

成功解析后,就会显示如下的界面,开始下载。
Files 是查看正在下载的文件列表, Start 是启动下载(默认解析后直接启动下载), Stop 是停止下载。
还有,如果你下载完毕或者点了 Stop 停止下载,那么 Stop 就会变成 Remove 删除任务的按钮了。

\n

搜索磁力链接

Cloud Torrent支持搜索磁力链接,在输入栏中直接输入你要搜索的文件名称,同时点击 绿色的按钮 选择一个搜索源,然后点击 蓝色的Search 按钮就可以搜索了。
注意:Cloud Torrent是国外人写的,所以这些搜索源均是国外的磁力链接网站,搜索到的资源基本没有中文的,所以非特殊需求的这个功能就没什么卵用了。

\n

注意事项

BT和磁力链接的速度是和, 磁力链接/BT 的用户上传共享量 和 中心服务器的宽带质量,以及你下载 磁力链接/BT 的VPS的宽带有关系。
这种软件在某些程度上比不上 国内的迅雷,毕竟迅雷 用户了很大共享了很多的上传速度,而且还有缓存的中心服务器,所以才会那么快。
如果你是国外的VPS,特别是美国的,一定要注意下载 BT/磁力链接 容易遇到蜜罐,然后被投诉封VPS。建议使用欧洲的罗马尼亚,那里的VPS无视版权,当然拉回本地,速度肯定也不会多快

\n

无法访问你的 http://IP:端口

可能是防火墙规则的问题,使用下面这个命令来开放端口

\n
iptables -I INPUT -p tcp --dport 端口 -j ACCEPT\n
\n","site":{"data":{}},"excerpt":"","more":"

支持 离线下载 BT和磁力链接和边下边播 的老司机坐骑 —— Cloud Torrent
声明:本文章仅提供 BT/磁力链接 下载工具的安装方法和说明,任何使用此工具 下载版权侵权文件或导致任何经济损失,皆和本人无任何关系!如果你不同意或有异议,请关闭这个网页!
\"10-1.png\"

\n\n

下载运行完毕脚本,就会直接开始安装 Cloud Torrent ,安装过程中如果出现让你选择Y和N的,都选Y。
安装完成之后,就会提醒你,输入要开放的端口(推荐:默认 8000)
启动后,访问 http://VPS_IP:8000 即可看到Web UI界面了。

\n\n
\n

按钮说明

成功解析后,就会显示如下的界面,开始下载。
Files 是查看正在下载的文件列表, Start 是启动下载(默认解析后直接启动下载), Stop 是停止下载。
还有,如果你下载完毕或者点了 Stop 停止下载,那么 Stop 就会变成 Remove 删除任务的按钮了。

\n

搜索磁力链接

Cloud Torrent支持搜索磁力链接,在输入栏中直接输入你要搜索的文件名称,同时点击 绿色的按钮 选择一个搜索源,然后点击 蓝色的Search 按钮就可以搜索了。
注意:Cloud Torrent是国外人写的,所以这些搜索源均是国外的磁力链接网站,搜索到的资源基本没有中文的,所以非特殊需求的这个功能就没什么卵用了。

\n

注意事项

BT和磁力链接的速度是和, 磁力链接/BT 的用户上传共享量 和 中心服务器的宽带质量,以及你下载 磁力链接/BT 的VPS的宽带有关系。
这种软件在某些程度上比不上 国内的迅雷,毕竟迅雷 用户了很大共享了很多的上传速度,而且还有缓存的中心服务器,所以才会那么快。
如果你是国外的VPS,特别是美国的,一定要注意下载 BT/磁力链接 容易遇到蜜罐,然后被投诉封VPS。建议使用欧洲的罗马尼亚,那里的VPS无视版权,当然拉回本地,速度肯定也不会多快

\n

无法访问你的 http://IP:端口

可能是防火墙规则的问题,使用下面这个命令来开放端口

\n
iptables -I INPUT -p tcp --dport 端口 -j ACCEPT\n
\n"},{"layout":"post","cid":334,"title":"edge 浏览器,出现“你的连接不是专用连接提示”,怎么办?","slug":"edge_浏览器,出现“你的连接不是专用连接提示”,怎么办?","date":"2022-07-08T01:04:36.000Z","updated":"2022-07-08T01:04:36.000Z","status":"publish","author":"老孙","abbrlink":25686,"icon":null,"thumbnail":null,"_content":"\n\n调整键盘为英文输入状态,刷新一下页面,鼠标点击当前页面任意位置,然后依次按键:thisisunsafe\n\n按完上面的按键,页面会自动刷新,然后就可以正常访问了。","source":"_posts/edge_浏览器,出现“你的连接不是专用连接提示”,怎么办?.md","raw":"---\nlayout: post\ncid: 334\ntitle: edge 浏览器,出现“你的连接不是专用连接提示”,怎么办?\nslug: >-\n what-should-i-do-if-your-connection-is-not-a-private-connection-prompt-appears-in-edge-browser\ndate: '2022/07/08 09:04:36'\nupdated: '2022/07/08 09:04:36'\nstatus: publish\nauthor: 老孙\ncategories:\n - 分享\ntags:\n - edge\nabbrlink: 25686\nicon:\nthumbnail:\n---\n\n\n调整键盘为英文输入状态,刷新一下页面,鼠标点击当前页面任意位置,然后依次按键:thisisunsafe\n\n按完上面的按键,页面会自动刷新,然后就可以正常访问了。","published":1,"comments":1,"photos":[],"link":"","_id":"cln4obygn00bboko04ivg7ado","content":"

调整键盘为英文输入状态,刷新一下页面,鼠标点击当前页面任意位置,然后依次按键:thisisunsafe

\n

按完上面的按键,页面会自动刷新,然后就可以正常访问了。

\n","site":{"data":{}},"excerpt":"","more":"

调整键盘为英文输入状态,刷新一下页面,鼠标点击当前页面任意位置,然后依次按键:thisisunsafe

\n

按完上面的按键,页面会自动刷新,然后就可以正常访问了。

\n"},{"abbrlink":"b564ae15","date":"2023-04-07T00:33:27.000Z","excerpt":"关于Qv2ray 在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。 V2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。 其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作...","published":1,"title":"Qv2ray客户端及内核下载","updated":"2023-04-13T07:27:22.000Z","_content":"### 关于Qv2ray\n\n在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。\n\nV2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。\n\n其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作为V2ray/SS/SSR/Trojan客户端使用。\n\n### 支持的协议\n\nVmess(V2ray)\nSS(Shadowsocks)\nSSR(ShadowsocksR)\nTrojan\nTrojan-go\nNaiveProxy\nVless\n\n### 下载\n\n#### 客户端下载\n\nhttps://github.com/Qv2ray/Qv2ray/releases\n\n#### 内核下载\n\nhttps://github.com/v2fly/v2ray-core/releases/tag/v4.31.0\n\n### 相关文章\n\n- [x-ui:支持多协议多用户的 xray 面板](https://www.sunpeiwen.com/archives/396.html)\n x-ui:支持多协议多用户的 xray 面板\n- [注册Vultr教程和送100美金活动!](https://www.sunpeiwen.com/archives/481.html)\n 可选日本机房延迟低速度快稳定\n","source":"_posts/qv2ray-ke-hu-duan-ji-nei-he-xia-zai.md","raw":"---\nabbrlink: b564ae15\ncategories:\n - - 分享\ndate: '2023-04-07 08:33:27'\nexcerpt: >-\n 关于Qv2ray 在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。\n V2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。\n 其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作...\npublished: true\ntags:\n - V2RAY\n - 梯子\ntitle: Qv2ray客户端及内核下载\nupdated: 'Thu, 13 Apr 2023 07:27:22 GMT'\n---\n### 关于Qv2ray\n\n在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。\n\nV2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。\n\n其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作为V2ray/SS/SSR/Trojan客户端使用。\n\n### 支持的协议\n\nVmess(V2ray)\nSS(Shadowsocks)\nSSR(ShadowsocksR)\nTrojan\nTrojan-go\nNaiveProxy\nVless\n\n### 下载\n\n#### 客户端下载\n\nhttps://github.com/Qv2ray/Qv2ray/releases\n\n#### 内核下载\n\nhttps://github.com/v2fly/v2ray-core/releases/tag/v4.31.0\n\n### 相关文章\n\n- [x-ui:支持多协议多用户的 xray 面板](https://www.sunpeiwen.com/archives/396.html)\n x-ui:支持多协议多用户的 xray 面板\n- [注册Vultr教程和送100美金活动!](https://www.sunpeiwen.com/archives/481.html)\n 可选日本机房延迟低速度快稳定\n","slug":"qv2ray-ke-hu-duan-ji-nei-he-xia-zai","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygo00beoko0cvrs4xid","content":"

关于Qv2ray

在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。

\n

V2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。

\n

其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作为V2ray/SS/SSR/Trojan客户端使用。

\n

支持的协议

Vmess(V2ray)
SS(Shadowsocks)
SSR(ShadowsocksR)
Trojan
Trojan-go
NaiveProxy
Vless

\n

下载

客户端下载

https://github.com/Qv2ray/Qv2ray/releases

\n

内核下载

https://github.com/v2fly/v2ray-core/releases/tag/v4.31.0

\n

相关文章

\n","site":{"data":{}},"more":"

关于Qv2ray

在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。

\n

V2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。

\n

其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作为V2ray/SS/SSR/Trojan客户端使用。

\n

支持的协议

Vmess(V2ray)
SS(Shadowsocks)
SSR(ShadowsocksR)
Trojan
Trojan-go
NaiveProxy
Vless

\n

下载

客户端下载

https://github.com/Qv2ray/Qv2ray/releases

\n

内核下载

https://github.com/v2fly/v2ray-core/releases/tag/v4.31.0

\n

相关文章

\n"},{"abbrlink":"54321412","cover":"https://blogcdn.asbid.cn/2023/01/11/1673403142.png","date":"2023-01-11T02:15:24.000Z","excerpt":" 魔趣的官网已经跳转到马丁龙猪的博客文章 宣布删库跑路。 我也曾刷过魔趣。也捐赠过。 很多人对马丁龙猪褒贬不一。 无论怎么说,这也是一个时代里曾留下过的痕迹了 当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。 ","published":1,"title":"魔趣倒了 安卓的刷机时代正式宣布结束了","updated":"2023-04-13T07:28:45.000Z","_content":"![QQ截图20230111101157.png][1]\n魔趣的官网已经跳转到马丁龙猪的博客文章\n\n宣布删库跑路。\n我也曾刷过魔趣。也捐赠过。\n很多人对马丁龙猪褒贬不一。\n\n无论怎么说,这也是一个时代里曾留下过的痕迹了\n\n当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。\n\n[1]: https://blogcdn.asbid.cn/2023/01/11/1673403142.png\n","source":"_posts/mokee-rom.md","raw":"---\nabbrlink: '54321412'\ncategories: 随笔\ncover: 'https://blogcdn.asbid.cn/2023/01/11/1673403142.png'\ndate: '2023-01-11 10:15:24'\nexcerpt: ' 魔趣的官网已经跳转到马丁龙猪的博客文章 宣布删库跑路。 我也曾刷过魔趣。也捐赠过。 很多人对马丁龙猪褒贬不一。 无论怎么说,这也是一个时代里曾留下过的痕迹了 当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。 '\npublished: true\ntags:\n - 魔趣\n - 安卓\n - 刷机\ntitle: 魔趣倒了 安卓的刷机时代正式宣布结束了\nupdated: 'Thu, 13 Apr 2023 07:28:45 GMT'\n---\n![QQ截图20230111101157.png][1]\n魔趣的官网已经跳转到马丁龙猪的博客文章\n\n宣布删库跑路。\n我也曾刷过魔趣。也捐赠过。\n很多人对马丁龙猪褒贬不一。\n\n无论怎么说,这也是一个时代里曾留下过的痕迹了\n\n当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。\n\n[1]: https://blogcdn.asbid.cn/2023/01/11/1673403142.png\n","slug":"mokee-rom","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygo00bhoko0ff58cnor","content":"

\"QQ截图20230111101157.png\"
魔趣的官网已经跳转到马丁龙猪的博客文章

\n

宣布删库跑路。
我也曾刷过魔趣。也捐赠过。
很多人对马丁龙猪褒贬不一。

\n

无论怎么说,这也是一个时代里曾留下过的痕迹了

\n

当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。

\n","site":{"data":{}},"more":"

\"QQ截图20230111101157.png\"
魔趣的官网已经跳转到马丁龙猪的博客文章

\n

宣布删库跑路。
我也曾刷过魔趣。也捐赠过。
很多人对马丁龙猪褒贬不一。

\n

无论怎么说,这也是一个时代里曾留下过的痕迹了

\n

当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。

\n"},{"title":"一个时代终将落幕","excerpt":"","abbrlink":15539,"date":"2018-10-30T17:18:49.000Z","_content":"\n惊闻金庸先生去世的消息。 \n\n自此金古梁黄四大家代表的武侠时代落下帷幕。 \n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/682de8655140a4f918512469001bb2f3.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_1024,h_682) \n\nring给我发消息 \n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/Screenshot_2018-10-31-01-08-52-085_com.tencent.mm_.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_512,h_1024) \n\n她始终记得我最喜欢古龙 \n\n但是她可能不知道金庸先生的小说我几乎都读过 \n\n很少联系的我们以后怕是再难相见了吧。 \n\n难忘记那曾陪伴我度过漫长青春岁月的武侠小说 \n\n那也是我的青春 \n\n飞雪连天射白鹿。 笑书神侠倚碧鸳。 \n\n金庸先生千古!","source":"_posts/一个时代终将落幕.md","raw":"---\ntitle: 一个时代终将落幕\ntags:\n - 武侠\n - 生活\n - 金庸\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 15539\ndate: 2018-10-31 01:18:49\n---\n\n惊闻金庸先生去世的消息。 \n\n自此金古梁黄四大家代表的武侠时代落下帷幕。 \n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/682de8655140a4f918512469001bb2f3.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_1024,h_682) \n\nring给我发消息 \n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/Screenshot_2018-10-31-01-08-52-085_com.tencent.mm_.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_512,h_1024) \n\n她始终记得我最喜欢古龙 \n\n但是她可能不知道金庸先生的小说我几乎都读过 \n\n很少联系的我们以后怕是再难相见了吧。 \n\n难忘记那曾陪伴我度过漫长青春岁月的武侠小说 \n\n那也是我的青春 \n\n飞雪连天射白鹿。 笑书神侠倚碧鸳。 \n\n金庸先生千古!","slug":"一个时代终将落幕","published":1,"updated":"2023-09-29T07:51:06.372Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygp00bkoko03c7x68kt","content":"

惊闻金庸先生去世的消息。

\n

自此金古梁黄四大家代表的武侠时代落下帷幕。

\n

ring给我发消息

\n

\n

她始终记得我最喜欢古龙

\n

但是她可能不知道金庸先生的小说我几乎都读过

\n

很少联系的我们以后怕是再难相见了吧。

\n

难忘记那曾陪伴我度过漫长青春岁月的武侠小说

\n

那也是我的青春

\n

飞雪连天射白鹿。 笑书神侠倚碧鸳。

\n

金庸先生千古!

\n","site":{"data":{}},"more":"

惊闻金庸先生去世的消息。

\n

自此金古梁黄四大家代表的武侠时代落下帷幕。

\n

ring给我发消息

\n

\n

她始终记得我最喜欢古龙

\n

但是她可能不知道金庸先生的小说我几乎都读过

\n

很少联系的我们以后怕是再难相见了吧。

\n

难忘记那曾陪伴我度过漫长青春岁月的武侠小说

\n

那也是我的青春

\n

飞雪连天射白鹿。 笑书神侠倚碧鸳。

\n

金庸先生千古!

\n"},{"title":"一周之始","excerpt":"","abbrlink":65173,"date":"2011-08-08T11:44:32.000Z","_content":"\n今天8月8号,星期一。\n\n立秋。\n\n网络上有人称今天是爸爸节。 \n\n清早起床去拱北转车。\n\n这时天还下着小雨。 \n\n如同往常,会在拱北车站买一份炒河粉做早餐,然后在巴士站坐等31路。 \n\n珠海的公交车一直都很多人,降价之后的公交车挤得更加密不透风。 \n\n都是上班的人们。\n\n赶时间,拼命的往车上塞。\n\n就像自己家灌香肠一样,使劲往里塞肉。 \n\n我喜欢看着这些行色匆匆的路人。\n\n尽管我觉得这样会很拥挤。 \n\n八点二十到了站,天已经晴了。\n\n太阳有些晒人。 不得不顶着阳光去往公司的方向。\n\n颇有段距离。\n\n刚好在八点半的时候到达公司打卡。 \n\n上班的环境的确不怎么样。 \n\n一进实验室热浪扑面而来。\n\n这样的情况之下任谁都会抱怨。\n\n小公司就这点,爱斤斤计较。 \n\n空调坏了能用就行,也不修。\n\n一点都不制冷。也不管。 \n\n热。闷热。 \n\n热的我实在都懒得动了。 \n\n边插科打诨的聊天打屁,边动动手打印几张图片,调几个墨水上机测试一下,然后写打印测试报告。 \n\n好了。\n\n就这样一天过去了。 \n\n多么充实的一天啊。\n\n过的真他妈有意义。 \n\nPS 今天是爸爸节的话,我就祝我老爸身体健康长命百岁。 \n\n虽然儿子不太听话经常惹你生气。 \n\n可儿子长大了。\n\n您能别管的事就尽量别管了吧。 \n\n气坏了身子,儿子也愧疚。","source":"_posts/一周之始.md","raw":"---\ntitle: 一周之始\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 65173\ndate: 2011-08-08 19:44:32\n---\n\n今天8月8号,星期一。\n\n立秋。\n\n网络上有人称今天是爸爸节。 \n\n清早起床去拱北转车。\n\n这时天还下着小雨。 \n\n如同往常,会在拱北车站买一份炒河粉做早餐,然后在巴士站坐等31路。 \n\n珠海的公交车一直都很多人,降价之后的公交车挤得更加密不透风。 \n\n都是上班的人们。\n\n赶时间,拼命的往车上塞。\n\n就像自己家灌香肠一样,使劲往里塞肉。 \n\n我喜欢看着这些行色匆匆的路人。\n\n尽管我觉得这样会很拥挤。 \n\n八点二十到了站,天已经晴了。\n\n太阳有些晒人。 不得不顶着阳光去往公司的方向。\n\n颇有段距离。\n\n刚好在八点半的时候到达公司打卡。 \n\n上班的环境的确不怎么样。 \n\n一进实验室热浪扑面而来。\n\n这样的情况之下任谁都会抱怨。\n\n小公司就这点,爱斤斤计较。 \n\n空调坏了能用就行,也不修。\n\n一点都不制冷。也不管。 \n\n热。闷热。 \n\n热的我实在都懒得动了。 \n\n边插科打诨的聊天打屁,边动动手打印几张图片,调几个墨水上机测试一下,然后写打印测试报告。 \n\n好了。\n\n就这样一天过去了。 \n\n多么充实的一天啊。\n\n过的真他妈有意义。 \n\nPS 今天是爸爸节的话,我就祝我老爸身体健康长命百岁。 \n\n虽然儿子不太听话经常惹你生气。 \n\n可儿子长大了。\n\n您能别管的事就尽量别管了吧。 \n\n气坏了身子,儿子也愧疚。","slug":"一周之始","published":1,"updated":"2023-09-29T07:51:06.373Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygp00bmoko06e55e2qs","content":"

今天8月8号,星期一。

\n

立秋。

\n

网络上有人称今天是爸爸节。

\n

清早起床去拱北转车。

\n

这时天还下着小雨。

\n

如同往常,会在拱北车站买一份炒河粉做早餐,然后在巴士站坐等31路。

\n

珠海的公交车一直都很多人,降价之后的公交车挤得更加密不透风。

\n

都是上班的人们。

\n

赶时间,拼命的往车上塞。

\n

就像自己家灌香肠一样,使劲往里塞肉。

\n

我喜欢看着这些行色匆匆的路人。

\n

尽管我觉得这样会很拥挤。

\n

八点二十到了站,天已经晴了。

\n

太阳有些晒人。 不得不顶着阳光去往公司的方向。

\n

颇有段距离。

\n

刚好在八点半的时候到达公司打卡。

\n

上班的环境的确不怎么样。

\n

一进实验室热浪扑面而来。

\n

这样的情况之下任谁都会抱怨。

\n

小公司就这点,爱斤斤计较。

\n

空调坏了能用就行,也不修。

\n

一点都不制冷。也不管。

\n

热。闷热。

\n

热的我实在都懒得动了。

\n

边插科打诨的聊天打屁,边动动手打印几张图片,调几个墨水上机测试一下,然后写打印测试报告。

\n

好了。

\n

就这样一天过去了。

\n

多么充实的一天啊。

\n

过的真他妈有意义。

\n

PS 今天是爸爸节的话,我就祝我老爸身体健康长命百岁。

\n

虽然儿子不太听话经常惹你生气。

\n

可儿子长大了。

\n

您能别管的事就尽量别管了吧。

\n

气坏了身子,儿子也愧疚。

\n","site":{"data":{}},"more":"

今天8月8号,星期一。

\n

立秋。

\n

网络上有人称今天是爸爸节。

\n

清早起床去拱北转车。

\n

这时天还下着小雨。

\n

如同往常,会在拱北车站买一份炒河粉做早餐,然后在巴士站坐等31路。

\n

珠海的公交车一直都很多人,降价之后的公交车挤得更加密不透风。

\n

都是上班的人们。

\n

赶时间,拼命的往车上塞。

\n

就像自己家灌香肠一样,使劲往里塞肉。

\n

我喜欢看着这些行色匆匆的路人。

\n

尽管我觉得这样会很拥挤。

\n

八点二十到了站,天已经晴了。

\n

太阳有些晒人。 不得不顶着阳光去往公司的方向。

\n

颇有段距离。

\n

刚好在八点半的时候到达公司打卡。

\n

上班的环境的确不怎么样。

\n

一进实验室热浪扑面而来。

\n

这样的情况之下任谁都会抱怨。

\n

小公司就这点,爱斤斤计较。

\n

空调坏了能用就行,也不修。

\n

一点都不制冷。也不管。

\n

热。闷热。

\n

热的我实在都懒得动了。

\n

边插科打诨的聊天打屁,边动动手打印几张图片,调几个墨水上机测试一下,然后写打印测试报告。

\n

好了。

\n

就这样一天过去了。

\n

多么充实的一天啊。

\n

过的真他妈有意义。

\n

PS 今天是爸爸节的话,我就祝我老爸身体健康长命百岁。

\n

虽然儿子不太听话经常惹你生气。

\n

可儿子长大了。

\n

您能别管的事就尽量别管了吧。

\n

气坏了身子,儿子也愧疚。

\n"},{"title":"上海","excerpt":"","abbrlink":63050,"date":"2017-12-31T03:17:24.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2017/12/wx_camera_151463479906610797492.jpg) \n时隔十年再次回到了上海! \n老二在上海据说混的还可以… \n过完年不在上海大概就要去深圳了… \n中午吃完饭就去找老二,他今天竟然还在加班…","source":"_posts/上海.md","raw":"---\ntitle: 上海\ntags:\n - 上海\n - 影像\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 63050\ndate: 2017-12-31 11:17:24\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2017/12/wx_camera_151463479906610797492.jpg) \n时隔十年再次回到了上海! \n老二在上海据说混的还可以… \n过完年不在上海大概就要去深圳了… \n中午吃完饭就去找老二,他今天竟然还在加班…","slug":"上海","published":1,"updated":"2023-09-29T07:51:06.373Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygp00bpoko04ksq9jyj","content":"


时隔十年再次回到了上海!
老二在上海据说混的还可以…
过完年不在上海大概就要去深圳了…
中午吃完饭就去找老二,他今天竟然还在加班…

\n","site":{"data":{}},"more":"


时隔十年再次回到了上海!
老二在上海据说混的还可以…
过完年不在上海大概就要去深圳了…
中午吃完饭就去找老二,他今天竟然还在加班…

\n"},{"title":"中元节","excerpt":"","abbrlink":17944,"date":"2011-08-14T06:45:22.000Z","_content":"\n今天中元节。\n\n农历七月十五是_中元节_,又称鬼节、_盂兰盆节_ \n\n道家全年的盛会分三次(合称为\"三元\"),认为\"三元\"就是天官、地官及水官\"三官\"的别称,正月十五、七月十五以及十月十五各为三官大帝的诞辰。\n\n根据五杂俎的记载:\"道经以正月十五日为上元,七月十五日为中元,十月十五日为下元。\"\n\n正月十五日称为\"上元\",主要是举行赐福的仪式;\n\n七月十五日称为\"中元\",用以赦免亡魂的罪(中元法事是为亡魂赦罪,但是绝对不能完全解除罪孽,只是减轻了一些,希望他们早日安息。);\n\n十月十五日称为\"下元\",则是为有过失的人解除厄运。\n\n道教《太上三官经》云:\"天官赐福,地官赦罪,水官解厄\",\"一切众生皆是天、地、水官统摄\"。\n\n中元节时,道教宫观如地安门火神庙、西便门外白云观为了祈祷\"风调雨顺、国泰民安\"照例举办\"祈福吉祥道场\"。\n\n因为惧厉的心理,民众于日常生活中复合儒、佛、道三教,成为农历7月15日的中元节,民间则称农历7月为\"鬼月\"。    \n\n佛教传入后,佛教徒根据印度一种佛教仪式追荐祖先,佛教也在这一天,举行超渡法会,称为\"屋兰玛纳\"(印度话ULLAMBANA)也就是\"孟兰会\"。\n\n孟兰盆的意义是倒悬,人生的痛苦有如倒挂在树头上的蝙蝠,悬挂著、苦不堪言。\n\n为了使众生免於倒悬之苦,便需要诵经,布绝食物给孤魂野鬼。\n\n此举正好和中国的鬼月祭拜不谋而合,因而中元节和孟兰会便同时流传下来。","source":"_posts/中元节.md","raw":"---\ntitle: 中元节\ntags:\n - 中元节\n - 鬼节\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 17944\ndate: 2011-08-14 14:45:22\n---\n\n今天中元节。\n\n农历七月十五是_中元节_,又称鬼节、_盂兰盆节_ \n\n道家全年的盛会分三次(合称为\"三元\"),认为\"三元\"就是天官、地官及水官\"三官\"的别称,正月十五、七月十五以及十月十五各为三官大帝的诞辰。\n\n根据五杂俎的记载:\"道经以正月十五日为上元,七月十五日为中元,十月十五日为下元。\"\n\n正月十五日称为\"上元\",主要是举行赐福的仪式;\n\n七月十五日称为\"中元\",用以赦免亡魂的罪(中元法事是为亡魂赦罪,但是绝对不能完全解除罪孽,只是减轻了一些,希望他们早日安息。);\n\n十月十五日称为\"下元\",则是为有过失的人解除厄运。\n\n道教《太上三官经》云:\"天官赐福,地官赦罪,水官解厄\",\"一切众生皆是天、地、水官统摄\"。\n\n中元节时,道教宫观如地安门火神庙、西便门外白云观为了祈祷\"风调雨顺、国泰民安\"照例举办\"祈福吉祥道场\"。\n\n因为惧厉的心理,民众于日常生活中复合儒、佛、道三教,成为农历7月15日的中元节,民间则称农历7月为\"鬼月\"。    \n\n佛教传入后,佛教徒根据印度一种佛教仪式追荐祖先,佛教也在这一天,举行超渡法会,称为\"屋兰玛纳\"(印度话ULLAMBANA)也就是\"孟兰会\"。\n\n孟兰盆的意义是倒悬,人生的痛苦有如倒挂在树头上的蝙蝠,悬挂著、苦不堪言。\n\n为了使众生免於倒悬之苦,便需要诵经,布绝食物给孤魂野鬼。\n\n此举正好和中国的鬼月祭拜不谋而合,因而中元节和孟兰会便同时流传下来。","slug":"中元节","published":1,"updated":"2023-09-29T07:51:06.374Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygq00bsoko0b3m95fuz","content":"

今天中元节。

\n

农历七月十五是_中元节_,又称鬼节、盂兰盆节

\n

道家全年的盛会分三次(合称为”三元”),认为”三元”就是天官、地官及水官”三官”的别称,正月十五、七月十五以及十月十五各为三官大帝的诞辰。

\n

根据五杂俎的记载:”道经以正月十五日为上元,七月十五日为中元,十月十五日为下元。”

\n

正月十五日称为”上元”,主要是举行赐福的仪式;

\n

七月十五日称为”中元”,用以赦免亡魂的罪(中元法事是为亡魂赦罪,但是绝对不能完全解除罪孽,只是减轻了一些,希望他们早日安息。);

\n

十月十五日称为”下元”,则是为有过失的人解除厄运。

\n

道教《太上三官经》云:”天官赐福,地官赦罪,水官解厄”,”一切众生皆是天、地、水官统摄”。

\n

中元节时,道教宫观如地安门火神庙、西便门外白云观为了祈祷”风调雨顺、国泰民安”照例举办”祈福吉祥道场”。

\n

因为惧厉的心理,民众于日常生活中复合儒、佛、道三教,成为农历7月15日的中元节,民间则称农历7月为”鬼月”。    

\n

佛教传入后,佛教徒根据印度一种佛教仪式追荐祖先,佛教也在这一天,举行超渡法会,称为”屋兰玛纳”(印度话ULLAMBANA)也就是”孟兰会”。

\n

孟兰盆的意义是倒悬,人生的痛苦有如倒挂在树头上的蝙蝠,悬挂著、苦不堪言。

\n

为了使众生免於倒悬之苦,便需要诵经,布绝食物给孤魂野鬼。

\n

此举正好和中国的鬼月祭拜不谋而合,因而中元节和孟兰会便同时流传下来。

\n","site":{"data":{}},"more":"

今天中元节。

\n

农历七月十五是_中元节_,又称鬼节、盂兰盆节

\n

道家全年的盛会分三次(合称为”三元”),认为”三元”就是天官、地官及水官”三官”的别称,正月十五、七月十五以及十月十五各为三官大帝的诞辰。

\n

根据五杂俎的记载:”道经以正月十五日为上元,七月十五日为中元,十月十五日为下元。”

\n

正月十五日称为”上元”,主要是举行赐福的仪式;

\n

七月十五日称为”中元”,用以赦免亡魂的罪(中元法事是为亡魂赦罪,但是绝对不能完全解除罪孽,只是减轻了一些,希望他们早日安息。);

\n

十月十五日称为”下元”,则是为有过失的人解除厄运。

\n

道教《太上三官经》云:”天官赐福,地官赦罪,水官解厄”,”一切众生皆是天、地、水官统摄”。

\n

中元节时,道教宫观如地安门火神庙、西便门外白云观为了祈祷”风调雨顺、国泰民安”照例举办”祈福吉祥道场”。

\n

因为惧厉的心理,民众于日常生活中复合儒、佛、道三教,成为农历7月15日的中元节,民间则称农历7月为”鬼月”。    

\n

佛教传入后,佛教徒根据印度一种佛教仪式追荐祖先,佛教也在这一天,举行超渡法会,称为”屋兰玛纳”(印度话ULLAMBANA)也就是”孟兰会”。

\n

孟兰盆的意义是倒悬,人生的痛苦有如倒挂在树头上的蝙蝠,悬挂著、苦不堪言。

\n

为了使众生免於倒悬之苦,便需要诵经,布绝食物给孤魂野鬼。

\n

此举正好和中国的鬼月祭拜不谋而合,因而中元节和孟兰会便同时流传下来。

\n"},{"title":"下雨了","excerpt":"","abbrlink":28203,"date":"2018-01-06T03:04:19.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/01/IMG_20180106_102356.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n\n老家下雪了。\n珠海下雨了。 \n最近更新博客勤了许多。 \n可能是太闲了。 \n人都发霉了。 \n辞职了。 \n在同事的挽留下决定做到这个月20号办理离职。 \n之后或许会去上海工作。 \n也可能去深圳。 \n还是需要看看深圳这边的条件是什么。","source":"_posts/下雨了.md","raw":"---\ntitle: 下雨了\ntags:\n - 影像\n - 珠海\n - 雨天\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 28203\ndate: 2018-01-06 11:04:19\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/01/IMG_20180106_102356.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n\n老家下雪了。\n珠海下雨了。 \n最近更新博客勤了许多。 \n可能是太闲了。 \n人都发霉了。 \n辞职了。 \n在同事的挽留下决定做到这个月20号办理离职。 \n之后或许会去上海工作。 \n也可能去深圳。 \n还是需要看看深圳这边的条件是什么。","slug":"下雨了","published":1,"updated":"2023-09-29T07:51:06.373Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygq00bvoko03fm2af8w","content":"

\n

老家下雪了。
珠海下雨了。
最近更新博客勤了许多。
可能是太闲了。
人都发霉了。
辞职了。
在同事的挽留下决定做到这个月20号办理离职。
之后或许会去上海工作。
也可能去深圳。
还是需要看看深圳这边的条件是什么。

\n","site":{"data":{}},"more":"

\n

老家下雪了。
珠海下雨了。
最近更新博客勤了许多。
可能是太闲了。
人都发霉了。
辞职了。
在同事的挽留下决定做到这个月20号办理离职。
之后或许会去上海工作。
也可能去深圳。
还是需要看看深圳这边的条件是什么。

\n"},{"title":"中国式相亲之现状","excerpt":"","abbrlink":11338,"date":"2019-02-24T09:54:02.000Z","_content":"\n最近芒果台在播的《我家那闺女》\n\n我有在看,我特别喜欢的就是焦俊艳,美丽大方,主要是素颜也非常耐看 \n\n其中所有父亲都焦虑的一个问题 \n\n儿女的婚事 \n\n说到这里最常见的套路莫过于相亲。 \n\n所谓的相亲呢就是原本八竿子打不到一起去的两个人由于媒人这个神奇的存在而有了交集。 \n\n当然我不抗拒相亲,相亲的确是给很多人解决了社交圈子小的问题,但是相亲很多时候存在的意义就是门当户对的思想。\n\n转念一想也没错。\n\n不同的成长环境造成很多人的三观未必一致。\n\n降低风险。 \n\n最让我不能容忍的网络上的个别思想。 \n\n认为学历低就是别人挑剩下来的。\n\n这种人有种莫名的优越感认为自己就应该卖个价钱的感觉。\n\n就好像在说我是你用不起的女人。 \n\n这奇葩的观点我真是不敢苟同。 \n\n很多高学历的人反而会更加慎重的对待自己的婚姻。 \n\n虽说婚姻与爱情不能混为一谈,但是爱情毕竟是基础。 \n\n相亲中的男女就好似在做买卖。 \n\n我有房有车有学历有工作有存款你有啥 \n\n说难听点一个像货比三家另外一个像待价而沽 \n\n真。买卖婚姻是也","source":"_posts/中国式相亲之现状.md","raw":"---\ntitle: 中国式相亲之现状\ntags:\n - 中国\n - 吐槽\n - 相亲\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 11338\ndate: 2019-02-24 17:54:02\n---\n\n最近芒果台在播的《我家那闺女》\n\n我有在看,我特别喜欢的就是焦俊艳,美丽大方,主要是素颜也非常耐看 \n\n其中所有父亲都焦虑的一个问题 \n\n儿女的婚事 \n\n说到这里最常见的套路莫过于相亲。 \n\n所谓的相亲呢就是原本八竿子打不到一起去的两个人由于媒人这个神奇的存在而有了交集。 \n\n当然我不抗拒相亲,相亲的确是给很多人解决了社交圈子小的问题,但是相亲很多时候存在的意义就是门当户对的思想。\n\n转念一想也没错。\n\n不同的成长环境造成很多人的三观未必一致。\n\n降低风险。 \n\n最让我不能容忍的网络上的个别思想。 \n\n认为学历低就是别人挑剩下来的。\n\n这种人有种莫名的优越感认为自己就应该卖个价钱的感觉。\n\n就好像在说我是你用不起的女人。 \n\n这奇葩的观点我真是不敢苟同。 \n\n很多高学历的人反而会更加慎重的对待自己的婚姻。 \n\n虽说婚姻与爱情不能混为一谈,但是爱情毕竟是基础。 \n\n相亲中的男女就好似在做买卖。 \n\n我有房有车有学历有工作有存款你有啥 \n\n说难听点一个像货比三家另外一个像待价而沽 \n\n真。买卖婚姻是也","slug":"中国式相亲之现状","published":1,"updated":"2023-09-29T07:51:06.374Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygr00byoko0f9geg7qr","content":"

最近芒果台在播的《我家那闺女》

\n

我有在看,我特别喜欢的就是焦俊艳,美丽大方,主要是素颜也非常耐看

\n

其中所有父亲都焦虑的一个问题

\n

儿女的婚事

\n

说到这里最常见的套路莫过于相亲。

\n

所谓的相亲呢就是原本八竿子打不到一起去的两个人由于媒人这个神奇的存在而有了交集。

\n

当然我不抗拒相亲,相亲的确是给很多人解决了社交圈子小的问题,但是相亲很多时候存在的意义就是门当户对的思想。

\n

转念一想也没错。

\n

不同的成长环境造成很多人的三观未必一致。

\n

降低风险。

\n

最让我不能容忍的网络上的个别思想。

\n

认为学历低就是别人挑剩下来的。

\n

这种人有种莫名的优越感认为自己就应该卖个价钱的感觉。

\n

就好像在说我是你用不起的女人。

\n

这奇葩的观点我真是不敢苟同。

\n

很多高学历的人反而会更加慎重的对待自己的婚姻。

\n

虽说婚姻与爱情不能混为一谈,但是爱情毕竟是基础。

\n

相亲中的男女就好似在做买卖。

\n

我有房有车有学历有工作有存款你有啥

\n

说难听点一个像货比三家另外一个像待价而沽

\n

真。买卖婚姻是也

\n","site":{"data":{}},"more":"

最近芒果台在播的《我家那闺女》

\n

我有在看,我特别喜欢的就是焦俊艳,美丽大方,主要是素颜也非常耐看

\n

其中所有父亲都焦虑的一个问题

\n

儿女的婚事

\n

说到这里最常见的套路莫过于相亲。

\n

所谓的相亲呢就是原本八竿子打不到一起去的两个人由于媒人这个神奇的存在而有了交集。

\n

当然我不抗拒相亲,相亲的确是给很多人解决了社交圈子小的问题,但是相亲很多时候存在的意义就是门当户对的思想。

\n

转念一想也没错。

\n

不同的成长环境造成很多人的三观未必一致。

\n

降低风险。

\n

最让我不能容忍的网络上的个别思想。

\n

认为学历低就是别人挑剩下来的。

\n

这种人有种莫名的优越感认为自己就应该卖个价钱的感觉。

\n

就好像在说我是你用不起的女人。

\n

这奇葩的观点我真是不敢苟同。

\n

很多高学历的人反而会更加慎重的对待自己的婚姻。

\n

虽说婚姻与爱情不能混为一谈,但是爱情毕竟是基础。

\n

相亲中的男女就好似在做买卖。

\n

我有房有车有学历有工作有存款你有啥

\n

说难听点一个像货比三家另外一个像待价而沽

\n

真。买卖婚姻是也

\n"},{"title":"中秋节快乐","excerpt":"","abbrlink":17218,"date":"2011-09-12T15:56:37.000Z","_content":"\n睡到中午起床。 \n\n到姨奶奶家吃饭。\n\n喝了一两茅台,倒了。 \n\n睡到三四点。 \n\n打了2局麻将输了四十五。 \n\n陪表妹玩没有规则的围棋。 \n\n超没意思。 \n\n吃完晚饭,站在17层的高楼之上看澳门的烟火。 \n\n虽然很绚烂,只是一瞬间罢了。 \n\n虽然现在很晚很晚了。 \n\n在2011中秋节结束之前,我祝愿我父母的身体能够好起来,我祝愿我的外公外婆身体健康。 \n\n我祝愿我的亲戚朋友都能够万事如意。 \n\n如同我小表妹说的,我祝你们都学习进步…… - -!","source":"_posts/中秋节快乐.md","raw":"---\ntitle: 中秋节快乐\ntags:\n - 中秋节\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 17218\ndate: 2011-09-12 23:56:37\n---\n\n睡到中午起床。 \n\n到姨奶奶家吃饭。\n\n喝了一两茅台,倒了。 \n\n睡到三四点。 \n\n打了2局麻将输了四十五。 \n\n陪表妹玩没有规则的围棋。 \n\n超没意思。 \n\n吃完晚饭,站在17层的高楼之上看澳门的烟火。 \n\n虽然很绚烂,只是一瞬间罢了。 \n\n虽然现在很晚很晚了。 \n\n在2011中秋节结束之前,我祝愿我父母的身体能够好起来,我祝愿我的外公外婆身体健康。 \n\n我祝愿我的亲戚朋友都能够万事如意。 \n\n如同我小表妹说的,我祝你们都学习进步…… - -!","slug":"中秋节快乐","published":1,"updated":"2023-09-29T07:51:06.375Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygr00c2oko0g5g17r02","content":"

睡到中午起床。

\n

到姨奶奶家吃饭。

\n

喝了一两茅台,倒了。

\n

睡到三四点。

\n

打了2局麻将输了四十五。

\n

陪表妹玩没有规则的围棋。

\n

超没意思。

\n

吃完晚饭,站在17层的高楼之上看澳门的烟火。

\n

虽然很绚烂,只是一瞬间罢了。

\n

虽然现在很晚很晚了。

\n

在2011中秋节结束之前,我祝愿我父母的身体能够好起来,我祝愿我的外公外婆身体健康。

\n

我祝愿我的亲戚朋友都能够万事如意。

\n

如同我小表妹说的,我祝你们都学习进步…… - -!

\n","site":{"data":{}},"more":"

睡到中午起床。

\n

到姨奶奶家吃饭。

\n

喝了一两茅台,倒了。

\n

睡到三四点。

\n

打了2局麻将输了四十五。

\n

陪表妹玩没有规则的围棋。

\n

超没意思。

\n

吃完晚饭,站在17层的高楼之上看澳门的烟火。

\n

虽然很绚烂,只是一瞬间罢了。

\n

虽然现在很晚很晚了。

\n

在2011中秋节结束之前,我祝愿我父母的身体能够好起来,我祝愿我的外公外婆身体健康。

\n

我祝愿我的亲戚朋友都能够万事如意。

\n

如同我小表妹说的,我祝你们都学习进步…… - -!

\n"},{"title":"估计也只有QQ邮箱记得今天是什么日子","excerpt":"","abbrlink":36456,"date":"2018-07-27T02:29:52.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/07/Screenshot_2018-07-27-10-02-57-231_com.tencent.mobileqq.png?x-oss-process=image/resize,m_fill,w_512,h_1024) 连我自己都忘记了。 看来年纪越大越不想记起自己年龄这回事","source":"_posts/估计也只有QQ邮箱记得今天是什么日子.md","raw":"---\ntitle: 估计也只有QQ邮箱记得今天是什么日子\ntags:\n - 生日\n - 生活\nexcerpt: ''\ncategories: 随笔\nabbrlink: 36456\ndate: 2018-07-27 10:29:52\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/07/Screenshot_2018-07-27-10-02-57-231_com.tencent.mobileqq.png?x-oss-process=image/resize,m_fill,w_512,h_1024) 连我自己都忘记了。 看来年纪越大越不想记起自己年龄这回事","slug":"估计也只有QQ邮箱记得今天是什么日子","published":1,"updated":"2023-09-29T07:51:06.375Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygr00c5oko05iw6cb5r","content":"

连我自己都忘记了。 看来年纪越大越不想记起自己年龄这回事

\n","site":{"data":{}},"more":"

连我自己都忘记了。 看来年纪越大越不想记起自己年龄这回事

\n"},{"title":"你好2018","excerpt":"","abbrlink":31224,"date":"2018-01-02T04:25:57.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/01/wx_camera_15148204218371171678685.jpg) 新的一年终于还是来了。 昨天刚从上海赶回来,到宿舍已经是接近十二点钟了。匆匆洗了洗,就睡了。 这次的上海之行,总体来说还是挺满意的。看到了许久不见的好朋友老二,还见到了聊了很久的小萱萱。 小萱萱真的很可爱,还给我准备了礼物,可我来去匆匆的,都没准备,再加上我这直男审美,真不知道她会喜欢什么礼物。我先自我原谅一波。但心里还是很愧疚。 老二所在的公司我去看了。挺大的园区,就是离萱萱的学校远了一些。老二希望我留在上海一起工作。我手头上事情还没处理说,只能告诉他过完春节再决定去哪里。 眼下只有努力工作。至于提升自我价值,目前还在思考。 今年是我外婆去世三周年的日子,依照我们当地的习俗,今年是要给我外婆立碑的。所以我们这些后辈应该都是要回去老家的。 我不想在家逗留。实在是因为混的不怎么好。抵挡不住村里人的议论纷纷。 2018年我希望所有的一切都顺利。 我的家人都健康。 不求闻达于诸侯,只求无愧于心。","source":"_posts/你好2018.md","raw":"---\ntitle: 你好2018\ntags:\n - '2018'\n - 上海\n - 新年\n - 生活\n - 规划\n - 过年\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 31224\ndate: 2018-01-02 12:25:57\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/01/wx_camera_15148204218371171678685.jpg) 新的一年终于还是来了。 昨天刚从上海赶回来,到宿舍已经是接近十二点钟了。匆匆洗了洗,就睡了。 这次的上海之行,总体来说还是挺满意的。看到了许久不见的好朋友老二,还见到了聊了很久的小萱萱。 小萱萱真的很可爱,还给我准备了礼物,可我来去匆匆的,都没准备,再加上我这直男审美,真不知道她会喜欢什么礼物。我先自我原谅一波。但心里还是很愧疚。 老二所在的公司我去看了。挺大的园区,就是离萱萱的学校远了一些。老二希望我留在上海一起工作。我手头上事情还没处理说,只能告诉他过完春节再决定去哪里。 眼下只有努力工作。至于提升自我价值,目前还在思考。 今年是我外婆去世三周年的日子,依照我们当地的习俗,今年是要给我外婆立碑的。所以我们这些后辈应该都是要回去老家的。 我不想在家逗留。实在是因为混的不怎么好。抵挡不住村里人的议论纷纷。 2018年我希望所有的一切都顺利。 我的家人都健康。 不求闻达于诸侯,只求无愧于心。","slug":"你好2018","published":1,"updated":"2023-09-29T07:51:06.375Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygs00c8oko05vou10rf","content":"

新的一年终于还是来了。 昨天刚从上海赶回来,到宿舍已经是接近十二点钟了。匆匆洗了洗,就睡了。 这次的上海之行,总体来说还是挺满意的。看到了许久不见的好朋友老二,还见到了聊了很久的小萱萱。 小萱萱真的很可爱,还给我准备了礼物,可我来去匆匆的,都没准备,再加上我这直男审美,真不知道她会喜欢什么礼物。我先自我原谅一波。但心里还是很愧疚。 老二所在的公司我去看了。挺大的园区,就是离萱萱的学校远了一些。老二希望我留在上海一起工作。我手头上事情还没处理说,只能告诉他过完春节再决定去哪里。 眼下只有努力工作。至于提升自我价值,目前还在思考。 今年是我外婆去世三周年的日子,依照我们当地的习俗,今年是要给我外婆立碑的。所以我们这些后辈应该都是要回去老家的。 我不想在家逗留。实在是因为混的不怎么好。抵挡不住村里人的议论纷纷。 2018年我希望所有的一切都顺利。 我的家人都健康。 不求闻达于诸侯,只求无愧于心。

\n","site":{"data":{}},"more":"

新的一年终于还是来了。 昨天刚从上海赶回来,到宿舍已经是接近十二点钟了。匆匆洗了洗,就睡了。 这次的上海之行,总体来说还是挺满意的。看到了许久不见的好朋友老二,还见到了聊了很久的小萱萱。 小萱萱真的很可爱,还给我准备了礼物,可我来去匆匆的,都没准备,再加上我这直男审美,真不知道她会喜欢什么礼物。我先自我原谅一波。但心里还是很愧疚。 老二所在的公司我去看了。挺大的园区,就是离萱萱的学校远了一些。老二希望我留在上海一起工作。我手头上事情还没处理说,只能告诉他过完春节再决定去哪里。 眼下只有努力工作。至于提升自我价值,目前还在思考。 今年是我外婆去世三周年的日子,依照我们当地的习俗,今年是要给我外婆立碑的。所以我们这些后辈应该都是要回去老家的。 我不想在家逗留。实在是因为混的不怎么好。抵挡不住村里人的议论纷纷。 2018年我希望所有的一切都顺利。 我的家人都健康。 不求闻达于诸侯,只求无愧于心。

\n"},{"title":"使用 Docker 构建 Pleroma 实例","abbrlink":"e48ebe86","date":"2023-07-24T13:57:00.000Z","cover":null,"_content":"\nPleroma 是一个去中心化的社区程序,其基于 ActivityPub 协议。\n而 ActivityPub 包括 Mastodon(Pawoo 等)、Misskey(misskey.io 等)、Pleroma 等等。\n在这些开源产品中,Pleroma 实机上部署环境步骤复杂繁琐。\n但它是对服务器性能要求最低的微博客工具,它的配置要求多低呢?\n现在 docker 的出现大大简化了部署的方式,只需要简单三步即可轻松搭建实例。\n\n本文将介绍如何使用 docker 构建 Pleroma 实例。\n以宝塔面板为例\n### 先安装docker\n在应用商店中查找docker并安装\n### 获取 docker-compose.yml 模板\n```\ngit clone https://git.pleroma.social/pleroma/pleroma-docker-compose.git\ncd pleroma-docker-compose \n```\n接下来所有操作(除 nginx 配置)如果没有加以说明都在这个目录下进行。\n### 需要修改的内容\n打开`./enviroments/pleroma/pleroma.env`,修改其中的配置:\n```\nDB_USER=pleroma # 数据库用户名\nDB_PASS=pleroma # 数据库密码\nDB_HOST=pleroma-db # 数据库地址\nDB_NAME=pleroma # 数据库名\nINSTANCE_NAME=Pleroma # 实例名\nADMIN_EMAIL=admin@ops.pleroma.social # 管理员邮箱\nNOTIFY_EMAIL=pleroma+admin@ops.pleroma.social # 通知邮箱\nDOMAIN=s.pwq.app # 实例域名\nPORT=4000 # 实例运行端口\n```\n只需要修改域名和邮箱即可\n打开`./volumes/pleroma/config.exs`\n在下面添加\n```\nimport Config\nconfig :pleroma, configurable_from_database: true\n```\n### 启动容器\n随后运行 \n```\ndocker-compose up -d\n```\n启动容器。\n### 添加反向代理\n```\n#PROXY-START/\n\nlocation ^~ /\n{\n # 4000 是你的实例容器运行端口,如果你修改过,记得改成你的端口。\n proxy_pass http://127.0.0.1:4000;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header REMOTE-HOST $remote_addr;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n # proxy_hide_header Upgrade;\n}\n```\n### 创建管理员账户\n```\ndocker exec -it pleroma ./opt/pleroma/bin/pleroma_ctl user new admin 邮箱 --admin\n```\n运行后会出现一个链接,复制在浏览器即可重置密码.\n### 修改文件夹权限\n`/root/pleroma-docker-compose/volumes/pleroma`下的`uploads`权限设置为`777`\n当然如果你用S3协议的对象存储则不需要修改\n直接在后台设置S3即可.\n\n### 演示地址\nhttps://chaihu.top\n","source":"_posts/使用 Docker 构建 Pleroma 实例.md","raw":"---\ntitle: 使用 Docker 构建 Pleroma 实例\ntags:\n - Docker\n - Pleroma\ncategories: 推荐\nabbrlink: e48ebe86\ndate: 2023-07-24 21:57:00\ncover:\n---\n\nPleroma 是一个去中心化的社区程序,其基于 ActivityPub 协议。\n而 ActivityPub 包括 Mastodon(Pawoo 等)、Misskey(misskey.io 等)、Pleroma 等等。\n在这些开源产品中,Pleroma 实机上部署环境步骤复杂繁琐。\n但它是对服务器性能要求最低的微博客工具,它的配置要求多低呢?\n现在 docker 的出现大大简化了部署的方式,只需要简单三步即可轻松搭建实例。\n\n本文将介绍如何使用 docker 构建 Pleroma 实例。\n以宝塔面板为例\n### 先安装docker\n在应用商店中查找docker并安装\n### 获取 docker-compose.yml 模板\n```\ngit clone https://git.pleroma.social/pleroma/pleroma-docker-compose.git\ncd pleroma-docker-compose \n```\n接下来所有操作(除 nginx 配置)如果没有加以说明都在这个目录下进行。\n### 需要修改的内容\n打开`./enviroments/pleroma/pleroma.env`,修改其中的配置:\n```\nDB_USER=pleroma # 数据库用户名\nDB_PASS=pleroma # 数据库密码\nDB_HOST=pleroma-db # 数据库地址\nDB_NAME=pleroma # 数据库名\nINSTANCE_NAME=Pleroma # 实例名\nADMIN_EMAIL=admin@ops.pleroma.social # 管理员邮箱\nNOTIFY_EMAIL=pleroma+admin@ops.pleroma.social # 通知邮箱\nDOMAIN=s.pwq.app # 实例域名\nPORT=4000 # 实例运行端口\n```\n只需要修改域名和邮箱即可\n打开`./volumes/pleroma/config.exs`\n在下面添加\n```\nimport Config\nconfig :pleroma, configurable_from_database: true\n```\n### 启动容器\n随后运行 \n```\ndocker-compose up -d\n```\n启动容器。\n### 添加反向代理\n```\n#PROXY-START/\n\nlocation ^~ /\n{\n # 4000 是你的实例容器运行端口,如果你修改过,记得改成你的端口。\n proxy_pass http://127.0.0.1:4000;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header REMOTE-HOST $remote_addr;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n # proxy_hide_header Upgrade;\n}\n```\n### 创建管理员账户\n```\ndocker exec -it pleroma ./opt/pleroma/bin/pleroma_ctl user new admin 邮箱 --admin\n```\n运行后会出现一个链接,复制在浏览器即可重置密码.\n### 修改文件夹权限\n`/root/pleroma-docker-compose/volumes/pleroma`下的`uploads`权限设置为`777`\n当然如果你用S3协议的对象存储则不需要修改\n直接在后台设置S3即可.\n\n### 演示地址\nhttps://chaihu.top\n","slug":"使用 Docker 构建 Pleroma 实例","published":1,"updated":"2023-09-29T07:51:06.376Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygs00cboko02qmzgblk","content":"

Pleroma 是一个去中心化的社区程序,其基于 ActivityPub 协议。
而 ActivityPub 包括 Mastodon(Pawoo 等)、Misskey(misskey.io 等)、Pleroma 等等。
在这些开源产品中,Pleroma 实机上部署环境步骤复杂繁琐。
但它是对服务器性能要求最低的微博客工具,它的配置要求多低呢?
现在 docker 的出现大大简化了部署的方式,只需要简单三步即可轻松搭建实例。

\n

本文将介绍如何使用 docker 构建 Pleroma 实例。
以宝塔面板为例

\n

先安装docker

在应用商店中查找docker并安装

\n

获取 docker-compose.yml 模板

1
2
git clone https://git.pleroma.social/pleroma/pleroma-docker-compose.git
cd pleroma-docker-compose
\n

接下来所有操作(除 nginx 配置)如果没有加以说明都在这个目录下进行。

\n

需要修改的内容

打开./enviroments/pleroma/pleroma.env,修改其中的配置:

\n
1
2
3
4
5
6
7
8
9
DB_USER=pleroma # 数据库用户名
DB_PASS=pleroma # 数据库密码
DB_HOST=pleroma-db # 数据库地址
DB_NAME=pleroma # 数据库名
INSTANCE_NAME=Pleroma # 实例名
ADMIN_EMAIL=admin@ops.pleroma.social # 管理员邮箱
NOTIFY_EMAIL=pleroma+admin@ops.pleroma.social # 通知邮箱
DOMAIN=s.pwq.app # 实例域名
PORT=4000 # 实例运行端口
\n

只需要修改域名和邮箱即可
打开./volumes/pleroma/config.exs
在下面添加

\n
1
2
import Config
config :pleroma, configurable_from_database: true
\n

启动容器

随后运行

\n
1
docker-compose up -d
\n

启动容器。

\n

添加反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#PROXY-START/

location ^~ /
{
# 4000 是你的实例容器运行端口,如果你修改过,记得改成你的端口。
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# proxy_hide_header Upgrade;
}
\n

创建管理员账户

1
docker exec -it pleroma ./opt/pleroma/bin/pleroma_ctl user new admin 邮箱 --admin
\n

运行后会出现一个链接,复制在浏览器即可重置密码.

\n

修改文件夹权限

/root/pleroma-docker-compose/volumes/pleroma下的uploads权限设置为777
当然如果你用S3协议的对象存储则不需要修改
直接在后台设置S3即可.

\n

演示地址

https://chaihu.top

\n","site":{"data":{}},"excerpt":"","more":"

Pleroma 是一个去中心化的社区程序,其基于 ActivityPub 协议。
而 ActivityPub 包括 Mastodon(Pawoo 等)、Misskey(misskey.io 等)、Pleroma 等等。
在这些开源产品中,Pleroma 实机上部署环境步骤复杂繁琐。
但它是对服务器性能要求最低的微博客工具,它的配置要求多低呢?
现在 docker 的出现大大简化了部署的方式,只需要简单三步即可轻松搭建实例。

\n

本文将介绍如何使用 docker 构建 Pleroma 实例。
以宝塔面板为例

\n

先安装docker

在应用商店中查找docker并安装

\n

获取 docker-compose.yml 模板

1
2
git clone https://git.pleroma.social/pleroma/pleroma-docker-compose.git
cd pleroma-docker-compose
\n

接下来所有操作(除 nginx 配置)如果没有加以说明都在这个目录下进行。

\n

需要修改的内容

打开./enviroments/pleroma/pleroma.env,修改其中的配置:

\n
1
2
3
4
5
6
7
8
9
DB_USER=pleroma # 数据库用户名
DB_PASS=pleroma # 数据库密码
DB_HOST=pleroma-db # 数据库地址
DB_NAME=pleroma # 数据库名
INSTANCE_NAME=Pleroma # 实例名
ADMIN_EMAIL=admin@ops.pleroma.social # 管理员邮箱
NOTIFY_EMAIL=pleroma+admin@ops.pleroma.social # 通知邮箱
DOMAIN=s.pwq.app # 实例域名
PORT=4000 # 实例运行端口
\n

只需要修改域名和邮箱即可
打开./volumes/pleroma/config.exs
在下面添加

\n
1
2
import Config
config :pleroma, configurable_from_database: true
\n

启动容器

随后运行

\n
1
docker-compose up -d
\n

启动容器。

\n

添加反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#PROXY-START/

location ^~ /
{
# 4000 是你的实例容器运行端口,如果你修改过,记得改成你的端口。
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# proxy_hide_header Upgrade;
}
\n

创建管理员账户

1
docker exec -it pleroma ./opt/pleroma/bin/pleroma_ctl user new admin 邮箱 --admin
\n

运行后会出现一个链接,复制在浏览器即可重置密码.

\n

修改文件夹权限

/root/pleroma-docker-compose/volumes/pleroma下的uploads权限设置为777
当然如果你用S3协议的对象存储则不需要修改
直接在后台设置S3即可.

\n

演示地址

https://chaihu.top

\n"},{"abbrlink":"6d58ffa9","cover":"https://blog.dasbid.com/upload/image-bvkn.png","date":"2023-05-18T08:23:20.354Z","excerpt":"...","title":"使用cloudflare Tunnels实现内网穿透","updated":"2023-09-29T07:51:06.376Z","_content":"## 使用cloudflare Tunnels实现内网穿透\n\n### 准备工作\n\n* 一个顶级域名\n* 更改DNS解析服务器\n* 等待生效\n\n### 打开 [Tunnels](https://one.dash.cloudflare.com/165012cc0f623729405e26de2fb3f876/access/tunnels)\n\n![](https://blog.dasbid.com//upload/image.png)\n\n### 点击**create a Tunnels**\n\n![](https://blog.dasbid.com/upload/image-bvkn.png)![](https://blog.dasbid.com//upload/image.png)\n\n### 随意输入一个名称用以区分\n\n![](https://blog.dasbid.com//upload/image-qzcq.png)\n\n选一个服务端软件\\~用以启动\\~\n\n### 以群晖为例\n\n群晖就选择**docker**\n\n![](https://blog.dasbid.com//upload/image-jjnh.png)复制命令行启动\\~\n\n#### **群晖要在root权限下执行**\n\n#### 获取root只需要\n\n```bash\n\nsudo su\n```\n\n![](https://blog.dasbid.com//upload/image-jsyd.png)\n\n#### 按需填写\n\n**Subdomain** 随便一个A记录\n\n**Domain **选择一个域名\n\n**Path **可以为空\n\n**Type**可以填写HTTP或者HTTPS\n\n**URL **填写localhost加上端口号\n\n保存即可\\~\n\n#### 演示地址\n\n[https://h.imsun.pw](https://h.imsun.pw)\n","source":"_posts/使用cloudflare Tunnels实现内网穿透.md","raw":"---\nabbrlink: 6d58ffa9\ncategories:\n - - 分享\ncover: 'https://blog.dasbid.com/upload/image-bvkn.png'\ndate: '2023-05-18T16:23:20.354081+08:00'\nexcerpt: ...\ntags:\n - cloudflare\ntitle: 使用cloudflare Tunnels实现内网穿透\nupdated: '2023-5-18T16:27:3.464+8:0'\n---\n## 使用cloudflare Tunnels实现内网穿透\n\n### 准备工作\n\n* 一个顶级域名\n* 更改DNS解析服务器\n* 等待生效\n\n### 打开 [Tunnels](https://one.dash.cloudflare.com/165012cc0f623729405e26de2fb3f876/access/tunnels)\n\n![](https://blog.dasbid.com//upload/image.png)\n\n### 点击**create a Tunnels**\n\n![](https://blog.dasbid.com/upload/image-bvkn.png)![](https://blog.dasbid.com//upload/image.png)\n\n### 随意输入一个名称用以区分\n\n![](https://blog.dasbid.com//upload/image-qzcq.png)\n\n选一个服务端软件\\~用以启动\\~\n\n### 以群晖为例\n\n群晖就选择**docker**\n\n![](https://blog.dasbid.com//upload/image-jjnh.png)复制命令行启动\\~\n\n#### **群晖要在root权限下执行**\n\n#### 获取root只需要\n\n```bash\n\nsudo su\n```\n\n![](https://blog.dasbid.com//upload/image-jsyd.png)\n\n#### 按需填写\n\n**Subdomain** 随便一个A记录\n\n**Domain **选择一个域名\n\n**Path **可以为空\n\n**Type**可以填写HTTP或者HTTPS\n\n**URL **填写localhost加上端口号\n\n保存即可\\~\n\n#### 演示地址\n\n[https://h.imsun.pw](https://h.imsun.pw)\n","slug":"使用cloudflare Tunnels实现内网穿透","published":1,"comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygt00cdoko01rbg7j16","content":"

使用cloudflare Tunnels实现内网穿透

准备工作

\n

打开 Tunnels

\n

点击create a Tunnels

\n

随意输入一个名称用以区分

\n

选一个服务端软件~用以启动~

\n

以群晖为例

群晖就选择docker

\n

复制命令行启动~

\n

群晖要在root权限下执行

获取root只需要

1
2

sudo su
\n\n

\n

按需填写

Subdomain 随便一个A记录

\n

**Domain **选择一个域名

\n

**Path **可以为空

\n

Type可以填写HTTP或者HTTPS

\n

**URL **填写localhost加上端口号

\n

保存即可~

\n

演示地址

https://h.imsun.pw

\n","site":{"data":{}},"more":"

使用cloudflare Tunnels实现内网穿透

准备工作

\n

打开 Tunnels

\n

点击create a Tunnels

\n

随意输入一个名称用以区分

\n

选一个服务端软件~用以启动~

\n

以群晖为例

群晖就选择docker

\n

复制命令行启动~

\n

群晖要在root权限下执行

获取root只需要

1
2

sudo su
\n\n

\n

按需填写

Subdomain 随便一个A记录

\n

**Domain **选择一个域名

\n

**Path **可以为空

\n

Type可以填写HTTP或者HTTPS

\n

**URL **填写localhost加上端口号

\n

保存即可~

\n

演示地址

https://h.imsun.pw

\n"},{"title":"关于网恋","abbrlink":4937,"date":"2016-12-23T07:34:58.000Z","_content":"\n随着年龄越来越大,变得越来越不相信爱情。 \n\n网恋更是让人觉得是浪费时间与精力的事情。 \n\n其中充满了大量无意义的对话,甚至大量的虚假的问候,让人充满了怀疑,与自我怀疑。 \n\n这都是因为双方的不信任。这可能与年龄有关。 \n\n在我读书的时候,QQ是最流行的通讯工具,他的成本比发短信要来的实惠太多。\n\n那时候没有微信,但是每次上线都会有提醒,都会有许久不见的问候,那时的我们都是真实的自己。\n\n我们会把自己的真心话讲给他们听。他们包括熟识的同学朋友,以及素未谋面的网络另一端的那个熟悉的陌生人。 \n\n年级再大了些,走出校园,走进社会。开始渐渐的学会把真话藏起来,把假话说给众人听。_\n\n于是_开始怀疑他人甚至自己的话。\n\n这网恋就越发艰难,虽说现在网恋的成本没有以前那么高,但实在是感觉不到感情了。 \n\n是我们越长大越冷漠了吧。","source":"_posts/关于网恋.md","raw":"---\ntitle: 关于网恋\ntags:\n - 爱情\n - 生活\n - 网恋\ncategories: 随笔\nabbrlink: 4937\ndate: 2016-12-23 15:34:58\n---\n\n随着年龄越来越大,变得越来越不相信爱情。 \n\n网恋更是让人觉得是浪费时间与精力的事情。 \n\n其中充满了大量无意义的对话,甚至大量的虚假的问候,让人充满了怀疑,与自我怀疑。 \n\n这都是因为双方的不信任。这可能与年龄有关。 \n\n在我读书的时候,QQ是最流行的通讯工具,他的成本比发短信要来的实惠太多。\n\n那时候没有微信,但是每次上线都会有提醒,都会有许久不见的问候,那时的我们都是真实的自己。\n\n我们会把自己的真心话讲给他们听。他们包括熟识的同学朋友,以及素未谋面的网络另一端的那个熟悉的陌生人。 \n\n年级再大了些,走出校园,走进社会。开始渐渐的学会把真话藏起来,把假话说给众人听。_\n\n于是_开始怀疑他人甚至自己的话。\n\n这网恋就越发艰难,虽说现在网恋的成本没有以前那么高,但实在是感觉不到感情了。 \n\n是我们越长大越冷漠了吧。","slug":"关于网恋","published":1,"updated":"2023-09-29T07:51:06.376Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygt00cgoko0g20id478","content":"

随着年龄越来越大,变得越来越不相信爱情。

\n

网恋更是让人觉得是浪费时间与精力的事情。

\n

其中充满了大量无意义的对话,甚至大量的虚假的问候,让人充满了怀疑,与自我怀疑。

\n

这都是因为双方的不信任。这可能与年龄有关。

\n

在我读书的时候,QQ是最流行的通讯工具,他的成本比发短信要来的实惠太多。

\n

那时候没有微信,但是每次上线都会有提醒,都会有许久不见的问候,那时的我们都是真实的自己。

\n

我们会把自己的真心话讲给他们听。他们包括熟识的同学朋友,以及素未谋面的网络另一端的那个熟悉的陌生人。

\n

年级再大了些,走出校园,走进社会。开始渐渐的学会把真话藏起来,把假话说给众人听。_

\n

于是_开始怀疑他人甚至自己的话。

\n

这网恋就越发艰难,虽说现在网恋的成本没有以前那么高,但实在是感觉不到感情了。

\n

是我们越长大越冷漠了吧。

\n","site":{"data":{}},"excerpt":"","more":"

随着年龄越来越大,变得越来越不相信爱情。

\n

网恋更是让人觉得是浪费时间与精力的事情。

\n

其中充满了大量无意义的对话,甚至大量的虚假的问候,让人充满了怀疑,与自我怀疑。

\n

这都是因为双方的不信任。这可能与年龄有关。

\n

在我读书的时候,QQ是最流行的通讯工具,他的成本比发短信要来的实惠太多。

\n

那时候没有微信,但是每次上线都会有提醒,都会有许久不见的问候,那时的我们都是真实的自己。

\n

我们会把自己的真心话讲给他们听。他们包括熟识的同学朋友,以及素未谋面的网络另一端的那个熟悉的陌生人。

\n

年级再大了些,走出校园,走进社会。开始渐渐的学会把真话藏起来,把假话说给众人听。_

\n

于是_开始怀疑他人甚至自己的话。

\n

这网恋就越发艰难,虽说现在网恋的成本没有以前那么高,但实在是感觉不到感情了。

\n

是我们越长大越冷漠了吧。

\n"},{"title":"关于英雄联盟S8八强对抗的预测","excerpt":"","abbrlink":3459,"date":"2018-10-19T10:12:54.000Z","_content":"\n明天会有两场BO5的比赛 分别是12:00 KT VS IG 16:00 RNG VS G2. 对于RNG我还是有信心的。IG则不太好说了。胜率不高。大约KT3:1IG。RNG则大概率3:1 G2。 RNG的状态的确有点不太稳定。但是调节能力还是可以的。特别是这个赛季的气势如虹给了RNG足够的信心。 我希望明天IG可以爆冷击败KT。","source":"_posts/关于英雄联盟S8八强对抗的预测.md","raw":"---\ntitle: 关于英雄联盟S8八强对抗的预测\ntags:\n - lol\n - RNG\n - S8\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 3459\ndate: 2018-10-19 18:12:54\n---\n\n明天会有两场BO5的比赛 分别是12:00 KT VS IG 16:00 RNG VS G2. 对于RNG我还是有信心的。IG则不太好说了。胜率不高。大约KT3:1IG。RNG则大概率3:1 G2。 RNG的状态的确有点不太稳定。但是调节能力还是可以的。特别是这个赛季的气势如虹给了RNG足够的信心。 我希望明天IG可以爆冷击败KT。","slug":"关于英雄联盟S8八强对抗的预测","published":1,"updated":"2023-09-29T07:51:06.377Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygu00cjoko08k2w4av4","content":"

明天会有两场BO5的比赛 分别是12:00 KT VS IG 16:00 RNG VS G2. 对于RNG我还是有信心的。IG则不太好说了。胜率不高。大约KT3:1IG。RNG则大概率3:1 G2。 RNG的状态的确有点不太稳定。但是调节能力还是可以的。特别是这个赛季的气势如虹给了RNG足够的信心。 我希望明天IG可以爆冷击败KT。

\n","site":{"data":{}},"more":"

明天会有两场BO5的比赛 分别是12:00 KT VS IG 16:00 RNG VS G2. 对于RNG我还是有信心的。IG则不太好说了。胜率不高。大约KT3:1IG。RNG则大概率3:1 G2。 RNG的状态的确有点不太稳定。但是调节能力还是可以的。特别是这个赛季的气势如虹给了RNG足够的信心。 我希望明天IG可以爆冷击败KT。

\n"},{"title":"2023中秋前夕","abbrlink":"20772b2a","date":"2023-09-28T06:59:24.000Z","cover":null,"_content":"\n又是中秋节,只有4天假.\n想回湖北老家看看,但是买不到票.\n于是愿望搁浅.\n\n---\n闲鱼账号被处罚了,理由是有交易纠纷.\n那么既然是纠纷,单方面罚卖家合理吗?\n我不知道,我选择卸载.\n\n---\n服务器方面,由于腾讯云的活动,续费了一年花费336大洋.\n免费升到4核4G6M的配置.\n2027-04-20到期.\n觉得国内竟然比国外还贵一些.\n\n---\n家里介绍的相亲对象,聊过一次之后便没有再联系了.\n年纪大了,可能对爱情就不抱任何期待了吧.\n用心交流也变的越来越难.\n考虑更多的是物质方面的东西.\n\n---\n至于假期安排大概率是在家西瓜空调WIFI.\n外面那么拥挤.还是不要出去浪了.\n\n---\n如果有妹妹一起出去吃饭也是极好的.\n\n---\n没有妹妹,看看电视也是极好的.\n\n---\n今天的亚运会英雄联盟四分之一决赛中国队0比2输给了韩国队\n应该没有人在开始之前就看好这个阵容的吧\n\n---\n王者荣耀国家队昨天获得了金牌,而且是以碾压之势获得了冠军\n","source":"_posts/写在2023中秋前夕.md","raw":"---\ntitle: 2023中秋前夕\ntags: 中秋节\ncategories: 随笔\nabbrlink: 20772b2a\ndate: 2023-09-28 14:59:24\ncover:\n---\n\n又是中秋节,只有4天假.\n想回湖北老家看看,但是买不到票.\n于是愿望搁浅.\n\n---\n闲鱼账号被处罚了,理由是有交易纠纷.\n那么既然是纠纷,单方面罚卖家合理吗?\n我不知道,我选择卸载.\n\n---\n服务器方面,由于腾讯云的活动,续费了一年花费336大洋.\n免费升到4核4G6M的配置.\n2027-04-20到期.\n觉得国内竟然比国外还贵一些.\n\n---\n家里介绍的相亲对象,聊过一次之后便没有再联系了.\n年纪大了,可能对爱情就不抱任何期待了吧.\n用心交流也变的越来越难.\n考虑更多的是物质方面的东西.\n\n---\n至于假期安排大概率是在家西瓜空调WIFI.\n外面那么拥挤.还是不要出去浪了.\n\n---\n如果有妹妹一起出去吃饭也是极好的.\n\n---\n没有妹妹,看看电视也是极好的.\n\n---\n今天的亚运会英雄联盟四分之一决赛中国队0比2输给了韩国队\n应该没有人在开始之前就看好这个阵容的吧\n\n---\n王者荣耀国家队昨天获得了金牌,而且是以碾压之势获得了冠军\n","slug":"写在2023中秋前夕","published":1,"updated":"2023-09-29T07:51:06.380Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygu00cnoko0c80rcm8v","content":"

又是中秋节,只有4天假.
想回湖北老家看看,但是买不到票.
于是愿望搁浅.

\n
\n

闲鱼账号被处罚了,理由是有交易纠纷.
那么既然是纠纷,单方面罚卖家合理吗?
我不知道,我选择卸载.

\n
\n

服务器方面,由于腾讯云的活动,续费了一年花费336大洋.
免费升到4核4G6M的配置.
2027-04-20到期.
觉得国内竟然比国外还贵一些.

\n
\n

家里介绍的相亲对象,聊过一次之后便没有再联系了.
年纪大了,可能对爱情就不抱任何期待了吧.
用心交流也变的越来越难.
考虑更多的是物质方面的东西.

\n
\n

至于假期安排大概率是在家西瓜空调WIFI.
外面那么拥挤.还是不要出去浪了.

\n
\n

如果有妹妹一起出去吃饭也是极好的.

\n
\n

没有妹妹,看看电视也是极好的.

\n
\n

今天的亚运会英雄联盟四分之一决赛中国队0比2输给了韩国队
应该没有人在开始之前就看好这个阵容的吧

\n
\n

王者荣耀国家队昨天获得了金牌,而且是以碾压之势获得了冠军

\n","site":{"data":{}},"excerpt":"","more":"

又是中秋节,只有4天假.
想回湖北老家看看,但是买不到票.
于是愿望搁浅.

\n
\n

闲鱼账号被处罚了,理由是有交易纠纷.
那么既然是纠纷,单方面罚卖家合理吗?
我不知道,我选择卸载.

\n
\n

服务器方面,由于腾讯云的活动,续费了一年花费336大洋.
免费升到4核4G6M的配置.
2027-04-20到期.
觉得国内竟然比国外还贵一些.

\n
\n

家里介绍的相亲对象,聊过一次之后便没有再联系了.
年纪大了,可能对爱情就不抱任何期待了吧.
用心交流也变的越来越难.
考虑更多的是物质方面的东西.

\n
\n

至于假期安排大概率是在家西瓜空调WIFI.
外面那么拥挤.还是不要出去浪了.

\n
\n

如果有妹妹一起出去吃饭也是极好的.

\n
\n

没有妹妹,看看电视也是极好的.

\n
\n

今天的亚运会英雄联盟四分之一决赛中国队0比2输给了韩国队
应该没有人在开始之前就看好这个阵容的吧

\n
\n

王者荣耀国家队昨天获得了金牌,而且是以碾压之势获得了冠军

\n"},{"title":"写在30岁之后","excerpt":"","abbrlink":44022,"date":"2017-07-10T05:27:06.000Z","_content":"\n其实,前两天是我的生日。 \n\n然而好像除了我自己没人再记得自己的生日。 \n\n我好像就是这样一个存在感薄弱的人。\n平凡无奇。 \n而立之年,日子过的跟亿万在广打工的人们一样。 \n三点一线。 \n甚至比他们其实的大部分过的还要无趣很多。 \n \n只希望早些成家,别让爸妈操心吧。 \n\nhttp://music.163.com/#/song?id=487590187","source":"_posts/写在30岁之后.md","raw":"---\ntitle: 写在30岁之后\ntags:\n - 生活\n - 而立\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 44022\ndate: 2017-07-10 13:27:06\n---\n\n其实,前两天是我的生日。 \n\n然而好像除了我自己没人再记得自己的生日。 \n\n我好像就是这样一个存在感薄弱的人。\n平凡无奇。 \n而立之年,日子过的跟亿万在广打工的人们一样。 \n三点一线。 \n甚至比他们其实的大部分过的还要无趣很多。 \n \n只希望早些成家,别让爸妈操心吧。 \n\nhttp://music.163.com/#/song?id=487590187","slug":"写在30岁之后","published":1,"updated":"2023-09-29T07:51:06.380Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygv00cpoko00gjxbw2h","content":"

其实,前两天是我的生日。

\n

然而好像除了我自己没人再记得自己的生日。

\n

我好像就是这样一个存在感薄弱的人。
平凡无奇。
而立之年,日子过的跟亿万在广打工的人们一样。
三点一线。
甚至比他们其实的大部分过的还要无趣很多。

\n

只希望早些成家,别让爸妈操心吧。

\n

http://music.163.com/#/song?id=487590187

\n","site":{"data":{}},"more":"

其实,前两天是我的生日。

\n

然而好像除了我自己没人再记得自己的生日。

\n

我好像就是这样一个存在感薄弱的人。
平凡无奇。
而立之年,日子过的跟亿万在广打工的人们一样。
三点一线。
甚至比他们其实的大部分过的还要无趣很多。

\n

只希望早些成家,别让爸妈操心吧。

\n

http://music.163.com/#/song?id=487590187

\n"},{"title":"写在MSI季中冠军赛RNG夺冠之后","excerpt":"","abbrlink":64158,"date":"2018-05-27T16:37:32.000Z","_content":"\nMSI决赛 RNG VS KZ 中韩两个赛区的战斗 当天的比赛我是有看的,虽然KZ当时的表现状态并不是很好,但是我仍然觉得没有十足的信息 因为仿佛有一个魔咒 也许是因为关切所以有点患得患失 关注皇族关注小狗已经有五年了 五年过去了 小狗仍然是那个最强的ADC 他终于夺冠了 他的获奖感言也让我很感动 经历了太多的失败 胜利的喜悦难以言表 在夺冠的那一刻全场都在呼喊uzi uzi 这一刻全世界都是狗吹 永远记住这一天吧 2018年5月20日皇族RNG3:1KZ获得2018年英雄联盟季中冠军赛冠军 &![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/1.jpg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/2.jpeg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/3.jpeg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/K.jpg)","source":"_posts/写在MSI季中冠军赛RNG夺冠之后.md","raw":"---\ntitle: 写在MSI季中冠军赛RNG夺冠之后\ntags:\n - lol\n - LPL\n - RNG\n - UZI\n - 生活\n - 英雄联盟\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 64158\ndate: 2018-05-28 00:37:32\n---\n\nMSI决赛 RNG VS KZ 中韩两个赛区的战斗 当天的比赛我是有看的,虽然KZ当时的表现状态并不是很好,但是我仍然觉得没有十足的信息 因为仿佛有一个魔咒 也许是因为关切所以有点患得患失 关注皇族关注小狗已经有五年了 五年过去了 小狗仍然是那个最强的ADC 他终于夺冠了 他的获奖感言也让我很感动 经历了太多的失败 胜利的喜悦难以言表 在夺冠的那一刻全场都在呼喊uzi uzi 这一刻全世界都是狗吹 永远记住这一天吧 2018年5月20日皇族RNG3:1KZ获得2018年英雄联盟季中冠军赛冠军 &![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/1.jpg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/2.jpeg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/3.jpeg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/K.jpg)","slug":"写在MSI季中冠军赛RNG夺冠之后","published":1,"updated":"2023-09-29T07:51:06.381Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygv00csoko0btaq8ef7","content":"

MSI决赛 RNG VS KZ 中韩两个赛区的战斗 当天的比赛我是有看的,虽然KZ当时的表现状态并不是很好,但是我仍然觉得没有十足的信息 因为仿佛有一个魔咒 也许是因为关切所以有点患得患失 关注皇族关注小狗已经有五年了 五年过去了 小狗仍然是那个最强的ADC 他终于夺冠了 他的获奖感言也让我很感动 经历了太多的失败 胜利的喜悦难以言表 在夺冠的那一刻全场都在呼喊uzi uzi 这一刻全世界都是狗吹 永远记住这一天吧 2018年5月20日皇族RNG3:1KZ获得2018年英雄联盟季中冠军赛冠军 &

\n","site":{"data":{}},"more":"

MSI决赛 RNG VS KZ 中韩两个赛区的战斗 当天的比赛我是有看的,虽然KZ当时的表现状态并不是很好,但是我仍然觉得没有十足的信息 因为仿佛有一个魔咒 也许是因为关切所以有点患得患失 关注皇族关注小狗已经有五年了 五年过去了 小狗仍然是那个最强的ADC 他终于夺冠了 他的获奖感言也让我很感动 经历了太多的失败 胜利的喜悦难以言表 在夺冠的那一刻全场都在呼喊uzi uzi 这一刻全世界都是狗吹 永远记住这一天吧 2018年5月20日皇族RNG3:1KZ获得2018年英雄联盟季中冠军赛冠军 &

\n"},{"title":"写在加班结束前","excerpt":"","abbrlink":26053,"date":"2011-08-11T12:28:51.000Z","_content":"\n我讨厌这种操蛋的生活。 连坐个顺风车都不舍得的公司你还有什么好说的呢。 我只能无奈的问候他的母亲大人了。","source":"_posts/写在加班结束前.md","raw":"---\ntitle: 写在加班结束前\ntags:\n - 下班\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 26053\ndate: 2011-08-11 20:28:51\n---\n\n我讨厌这种操蛋的生活。 连坐个顺风车都不舍得的公司你还有什么好说的呢。 我只能无奈的问候他的母亲大人了。","slug":"写在加班结束前","published":1,"updated":"2023-09-29T07:51:06.381Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygw00cuoko09nzsflwl","content":"

我讨厌这种操蛋的生活。 连坐个顺风车都不舍得的公司你还有什么好说的呢。 我只能无奈的问候他的母亲大人了。

\n","site":{"data":{}},"more":"

我讨厌这种操蛋的生活。 连坐个顺风车都不舍得的公司你还有什么好说的呢。 我只能无奈的问候他的母亲大人了。

\n"},{"title":"写在感恩节的话","excerpt":"","abbrlink":6382,"date":"2016-11-24T11:34:14.000Z","_content":"\n首先我感谢我的父母赐予我生命来到这世上,我很愧对于他们,因为我至今也无法报答他们的养育之恩。 其次我感谢我的亲人,是他们无私的给予我帮助,在我无能为力的时候为我挡风遮雨。我很惭愧。 还有我的朋友们,我感谢你们。 虽然很多人都已经许久不联系了,我心里始终会记得你们的情谊。 谢谢313的兄弟。谢谢","source":"_posts/写在感恩节的话.md","raw":"---\ntitle: 写在感恩节的话\ntags:\n - 感恩\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 6382\ndate: 2016-11-24 19:34:14\n---\n\n首先我感谢我的父母赐予我生命来到这世上,我很愧对于他们,因为我至今也无法报答他们的养育之恩。 其次我感谢我的亲人,是他们无私的给予我帮助,在我无能为力的时候为我挡风遮雨。我很惭愧。 还有我的朋友们,我感谢你们。 虽然很多人都已经许久不联系了,我心里始终会记得你们的情谊。 谢谢313的兄弟。谢谢","slug":"写在感恩节的话","published":1,"updated":"2023-09-29T07:51:06.382Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygx00cwoko009q83i3o","content":"

首先我感谢我的父母赐予我生命来到这世上,我很愧对于他们,因为我至今也无法报答他们的养育之恩。 其次我感谢我的亲人,是他们无私的给予我帮助,在我无能为力的时候为我挡风遮雨。我很惭愧。 还有我的朋友们,我感谢你们。 虽然很多人都已经许久不联系了,我心里始终会记得你们的情谊。 谢谢313的兄弟。谢谢

\n","site":{"data":{}},"more":"

首先我感谢我的父母赐予我生命来到这世上,我很愧对于他们,因为我至今也无法报答他们的养育之恩。 其次我感谢我的亲人,是他们无私的给予我帮助,在我无能为力的时候为我挡风遮雨。我很惭愧。 还有我的朋友们,我感谢你们。 虽然很多人都已经许久不联系了,我心里始终会记得你们的情谊。 谢谢313的兄弟。谢谢

\n"},{"title":"写在愚人节之后","excerpt":"","abbrlink":31287,"date":"2015-04-01T17:45:18.000Z","_content":"\n往年我都会记得小韩的忌日。就在愚人节之前。 今年可能我刻意回避死这个字。 亲眼看到自己所爱的人在自己眼前死去,这是件很残忍的事情,我觉得 我到现在才终于明白小韩父母家人是如何的伤痛。我并没有去送小韩最后一程。可能是因为我那时还想象不出死亡的样子。觉得离我很遥远。   并不习惯写博客了,特别是工作了以后,每日都是重复昨日。 看到两年前的博客还是忍不住上来随便写点什么。 对了,我月底回去。希望可以有点变化","source":"_posts/写在愚人节之后.md","raw":"---\ntitle: 写在愚人节之后\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 31287\ndate: 2015-04-02 01:45:18\n---\n\n往年我都会记得小韩的忌日。就在愚人节之前。 今年可能我刻意回避死这个字。 亲眼看到自己所爱的人在自己眼前死去,这是件很残忍的事情,我觉得 我到现在才终于明白小韩父母家人是如何的伤痛。我并没有去送小韩最后一程。可能是因为我那时还想象不出死亡的样子。觉得离我很遥远。   并不习惯写博客了,特别是工作了以后,每日都是重复昨日。 看到两年前的博客还是忍不住上来随便写点什么。 对了,我月底回去。希望可以有点变化","slug":"写在愚人节之后","published":1,"updated":"2023-09-29T07:51:06.381Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygx00czoko04ykd651a","content":"

往年我都会记得小韩的忌日。就在愚人节之前。 今年可能我刻意回避死这个字。 亲眼看到自己所爱的人在自己眼前死去,这是件很残忍的事情,我觉得 我到现在才终于明白小韩父母家人是如何的伤痛。我并没有去送小韩最后一程。可能是因为我那时还想象不出死亡的样子。觉得离我很遥远。   并不习惯写博客了,特别是工作了以后,每日都是重复昨日。 看到两年前的博客还是忍不住上来随便写点什么。 对了,我月底回去。希望可以有点变化

\n","site":{"data":{}},"more":"

往年我都会记得小韩的忌日。就在愚人节之前。 今年可能我刻意回避死这个字。 亲眼看到自己所爱的人在自己眼前死去,这是件很残忍的事情,我觉得 我到现在才终于明白小韩父母家人是如何的伤痛。我并没有去送小韩最后一程。可能是因为我那时还想象不出死亡的样子。觉得离我很遥远。   并不习惯写博客了,特别是工作了以后,每日都是重复昨日。 看到两年前的博客还是忍不住上来随便写点什么。 对了,我月底回去。希望可以有点变化

\n"},{"title":"到深圳的第一天","excerpt":"","abbrlink":43468,"date":"2018-03-02T10:09:41.000Z","_content":"\n正月十五,多云,有风 穿短袖拖行李也拖出一身汗来 \n\n住进了宿舍 \n\n四个人两间房 \n\n晚上去吃饭 \n\n---------------------- \n\n话说今天是元宵节 \n\n上元节才是正儿八经的中国情人节 \n\n只有这天观花灯猜字谜的活动让男女有了相互认识的机会 \n\n而七夕又称乞巧节 \n\n是少女们求神祝愿的日子 \n\n------------- \n\n元宵节快乐!","source":"_posts/到深圳的第一天.md","raw":"---\ntitle: 到深圳的第一天\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 43468\ndate: 2018-03-02 18:09:41\n---\n\n正月十五,多云,有风 穿短袖拖行李也拖出一身汗来 \n\n住进了宿舍 \n\n四个人两间房 \n\n晚上去吃饭 \n\n---------------------- \n\n话说今天是元宵节 \n\n上元节才是正儿八经的中国情人节 \n\n只有这天观花灯猜字谜的活动让男女有了相互认识的机会 \n\n而七夕又称乞巧节 \n\n是少女们求神祝愿的日子 \n\n------------- \n\n元宵节快乐!","slug":"到深圳的第一天","published":1,"updated":"2023-09-29T07:51:06.382Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygx00d1oko01vzifqgg","content":"

正月十五,多云,有风 穿短袖拖行李也拖出一身汗来

\n

住进了宿舍

\n

四个人两间房

\n

晚上去吃饭

\n
\n

话说今天是元宵节

\n

上元节才是正儿八经的中国情人节

\n

只有这天观花灯猜字谜的活动让男女有了相互认识的机会

\n

而七夕又称乞巧节

\n

是少女们求神祝愿的日子

\n
\n

元宵节快乐!

\n","site":{"data":{}},"more":"

正月十五,多云,有风 穿短袖拖行李也拖出一身汗来

\n

住进了宿舍

\n

四个人两间房

\n

晚上去吃饭

\n
\n

话说今天是元宵节

\n

上元节才是正儿八经的中国情人节

\n

只有这天观花灯猜字谜的活动让男女有了相互认识的机会

\n

而七夕又称乞巧节

\n

是少女们求神祝愿的日子

\n
\n

元宵节快乐!

\n"},{"title":"冬日-武汉","excerpt":"","abbrlink":11729,"date":"2018-03-31T10:02:23.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141836.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141854.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141847.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180129_153655.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180129_153645.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n年前回家,在武汉时路过长春观拍摄 \n这几天整理手机相册的时候发现了 \n清明时节雨纷纷,天气预报后天有雨","source":"_posts/冬日-武汉.md","raw":"---\ntitle: 冬日-武汉\ntags:\n - 冬日\n - 影像\n - 武汉\nexcerpt: ''\ncategories: 随笔\nabbrlink: 11729\ndate: 2018-03-31 18:02:23\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141836.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141854.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141847.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180129_153655.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180129_153645.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n年前回家,在武汉时路过长春观拍摄 \n这几天整理手机相册的时候发现了 \n清明时节雨纷纷,天气预报后天有雨","slug":"冬日-武汉","published":1,"updated":"2023-09-29T07:51:06.382Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygy00d5oko08ebcgf9r","content":"






年前回家,在武汉时路过长春观拍摄
这几天整理手机相册的时候发现了
清明时节雨纷纷,天气预报后天有雨

\n","site":{"data":{}},"more":"






年前回家,在武汉时路过长春观拍摄
这几天整理手机相册的时候发现了
清明时节雨纷纷,天气预报后天有雨

\n"},{"title":"十年","excerpt":"","abbrlink":1648,"date":"2018-03-17T12:34:13.000Z","_content":"\n人生能有多少个十年呢 我不知道 我只知道我已过完了三个十年 半个月前我已经八十岁的外公给我打电话说家里给我提了一个对象 这女子是隔壁村的比我要小上两岁 聊了几天 后来不了了之 可能是我的性格不讨喜 真是对不起外公 这么大年纪了还在为我的婚姻操心 我与ring是高中的同学 做过同桌 跟所有俗烂的二流青春小说一样 我喜欢她 给她写过情书 虽没有亲口表白 但她应该也知道 她不喜欢我这样的 我也知道 后来就毕业上了大学 还有联系 再后来毕了业 就渐渐的没有了联系 今年过年她在朋友圈里发动态说她回来了 我看到之后 马上就去找她 因为第二天我就要去广东 见到了她 ring她跟十年前一样 她见我的第一句话就是培文你怎么胖成这个样子 我无奈笑笑 你的性格还跟以前一样 她笑着对我说 她给我看他女儿的照片 恍然间 十年仿佛转瞬间消失的一样 情谊还在 只不过我们都长大了 有了各自的生活 许久不见得朋友啊在彼此的心中可能就没那么重要了","source":"_posts/十年.md","raw":"---\ntitle: 十年\ntags:\n - 十年\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 1648\ndate: 2018-03-17 20:34:13\n---\n\n人生能有多少个十年呢 我不知道 我只知道我已过完了三个十年 半个月前我已经八十岁的外公给我打电话说家里给我提了一个对象 这女子是隔壁村的比我要小上两岁 聊了几天 后来不了了之 可能是我的性格不讨喜 真是对不起外公 这么大年纪了还在为我的婚姻操心 我与ring是高中的同学 做过同桌 跟所有俗烂的二流青春小说一样 我喜欢她 给她写过情书 虽没有亲口表白 但她应该也知道 她不喜欢我这样的 我也知道 后来就毕业上了大学 还有联系 再后来毕了业 就渐渐的没有了联系 今年过年她在朋友圈里发动态说她回来了 我看到之后 马上就去找她 因为第二天我就要去广东 见到了她 ring她跟十年前一样 她见我的第一句话就是培文你怎么胖成这个样子 我无奈笑笑 你的性格还跟以前一样 她笑着对我说 她给我看他女儿的照片 恍然间 十年仿佛转瞬间消失的一样 情谊还在 只不过我们都长大了 有了各自的生活 许久不见得朋友啊在彼此的心中可能就没那么重要了","slug":"十年","published":1,"updated":"2023-09-29T07:51:06.383Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygy00d8oko0grs88ez1","content":"

人生能有多少个十年呢 我不知道 我只知道我已过完了三个十年 半个月前我已经八十岁的外公给我打电话说家里给我提了一个对象 这女子是隔壁村的比我要小上两岁 聊了几天 后来不了了之 可能是我的性格不讨喜 真是对不起外公 这么大年纪了还在为我的婚姻操心 我与ring是高中的同学 做过同桌 跟所有俗烂的二流青春小说一样 我喜欢她 给她写过情书 虽没有亲口表白 但她应该也知道 她不喜欢我这样的 我也知道 后来就毕业上了大学 还有联系 再后来毕了业 就渐渐的没有了联系 今年过年她在朋友圈里发动态说她回来了 我看到之后 马上就去找她 因为第二天我就要去广东 见到了她 ring她跟十年前一样 她见我的第一句话就是培文你怎么胖成这个样子 我无奈笑笑 你的性格还跟以前一样 她笑着对我说 她给我看他女儿的照片 恍然间 十年仿佛转瞬间消失的一样 情谊还在 只不过我们都长大了 有了各自的生活 许久不见得朋友啊在彼此的心中可能就没那么重要了

\n","site":{"data":{}},"more":"

人生能有多少个十年呢 我不知道 我只知道我已过完了三个十年 半个月前我已经八十岁的外公给我打电话说家里给我提了一个对象 这女子是隔壁村的比我要小上两岁 聊了几天 后来不了了之 可能是我的性格不讨喜 真是对不起外公 这么大年纪了还在为我的婚姻操心 我与ring是高中的同学 做过同桌 跟所有俗烂的二流青春小说一样 我喜欢她 给她写过情书 虽没有亲口表白 但她应该也知道 她不喜欢我这样的 我也知道 后来就毕业上了大学 还有联系 再后来毕了业 就渐渐的没有了联系 今年过年她在朋友圈里发动态说她回来了 我看到之后 马上就去找她 因为第二天我就要去广东 见到了她 ring她跟十年前一样 她见我的第一句话就是培文你怎么胖成这个样子 我无奈笑笑 你的性格还跟以前一样 她笑着对我说 她给我看他女儿的照片 恍然间 十年仿佛转瞬间消失的一样 情谊还在 只不过我们都长大了 有了各自的生活 许久不见得朋友啊在彼此的心中可能就没那么重要了

\n"},{"title":"半年没有更新博客了","excerpt":"","abbrlink":55578,"date":"2013-01-30T14:11:18.000Z","_content":"\n不是遗忘了,而是大多数时间不知道写些什么。 \n\n人的想法总是很多,可真正做到的没有多少。\n\n其实有时候的灵机一动可能会让自己都叫绝的主意在自己的脑海里也只是转瞬即逝,总是为这种莫名的灵感感到可惜。\n因为不善于捕捉这些,所以日子总是过的稀里糊涂而没有条理。\n \n说的好听叫随性。 \n这种没有约束的日子没有目标没有目的,迷茫的心里总是空落落的。 \n \n \n写博客也是需要有点文采的,可惜,我没有。","source":"_posts/半年没有更新博客了.md","raw":"---\ntitle: 半年没有更新博客了\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 55578\ndate: 2013-01-30 22:11:18\n---\n\n不是遗忘了,而是大多数时间不知道写些什么。 \n\n人的想法总是很多,可真正做到的没有多少。\n\n其实有时候的灵机一动可能会让自己都叫绝的主意在自己的脑海里也只是转瞬即逝,总是为这种莫名的灵感感到可惜。\n因为不善于捕捉这些,所以日子总是过的稀里糊涂而没有条理。\n \n说的好听叫随性。 \n这种没有约束的日子没有目标没有目的,迷茫的心里总是空落落的。 \n \n \n写博客也是需要有点文采的,可惜,我没有。","slug":"半年没有更新博客了","published":1,"updated":"2023-09-29T07:51:06.383Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obygz00dcoko06zdsbodi","content":"

不是遗忘了,而是大多数时间不知道写些什么。

\n

人的想法总是很多,可真正做到的没有多少。

\n

其实有时候的灵机一动可能会让自己都叫绝的主意在自己的脑海里也只是转瞬即逝,总是为这种莫名的灵感感到可惜。
因为不善于捕捉这些,所以日子总是过的稀里糊涂而没有条理。

\n

说的好听叫随性。
这种没有约束的日子没有目标没有目的,迷茫的心里总是空落落的。

\n

写博客也是需要有点文采的,可惜,我没有。

\n","site":{"data":{}},"more":"

不是遗忘了,而是大多数时间不知道写些什么。

\n

人的想法总是很多,可真正做到的没有多少。

\n

其实有时候的灵机一动可能会让自己都叫绝的主意在自己的脑海里也只是转瞬即逝,总是为这种莫名的灵感感到可惜。
因为不善于捕捉这些,所以日子总是过的稀里糊涂而没有条理。

\n

说的好听叫随性。
这种没有约束的日子没有目标没有目的,迷茫的心里总是空落落的。

\n

写博客也是需要有点文采的,可惜,我没有。

\n"},{"title":"用Memos API实现hexo博客的动态说说页面","published":1,"abbrlink":"286ad0c6","date":"2023-06-13T07:57:00.000Z","cover":null,"_content":"新建一个页面\n```\nhexo new page Memos\n```\n修改`Memos/index.md`内容为\n```\n---\ntitle: Memos\ncomments: false\ndate: 2023-06-07 14:17:13\n---\n
\n

\n 共发布了 不知道多少 条说说\n

\n
\n
\n\n\n\n```\n即可~\n\n代码来源于网络~\n","source":"_posts/博客的说说页面之Memos.md","raw":"---\ntitle: 用Memos API实现hexo博客的动态说说页面\ntags:\n - memos\n - Hexo\npublished: true\ncategories: 分享\nabbrlink: 286ad0c6\ndate: 2023-06-13 15:57:00\ncover:\n---\n新建一个页面\n```\nhexo new page Memos\n```\n修改`Memos/index.md`内容为\n```\n---\ntitle: Memos\ncomments: false\ndate: 2023-06-07 14:17:13\n---\n
\n

\n 共发布了 不知道多少 条说说\n

\n
\n
\n\n\n\n```\n即可~\n\n代码来源于网络~\n","slug":"博客的说说页面之Memos","updated":"2023-09-29T07:51:06.385Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh000dfoko091xdhsru","content":"

新建一个页面

\n
1
hexo new page Memos
\n

修改Memos/index.md内容为

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
---
title: Memos
comments: false
date: 2023-06-07 14:17:13
---
<div class='memo-nums'>
<p class='note note-info memo-nums-text'>
共发布了 <span id="memosCount">不知道多少</span> 条说说
</p>
</div>
<div id="bber"></div>
<script type="text/javascript">
var bbMemos = {
memos : 'https://memos.ee/',
limit : '20',
creatorId:'1',
domId: '',
}
</script>
<script src="https://blogcdn.loliko.cn/memos2/js/marked.js"></script>
<script src="https://blogcdn.loliko.cn/memos2/js/talk.js"></script>
\n

即可~

\n

代码来源于网络~

\n","site":{"data":{}},"excerpt":"","more":"

新建一个页面

\n
1
hexo new page Memos
\n

修改Memos/index.md内容为

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
---
title: Memos
comments: false
date: 2023-06-07 14:17:13
---
<div class='memo-nums'>
<p class='note note-info memo-nums-text'>
共发布了 <span id="memosCount">不知道多少</span> 条说说
</p>
</div>
<div id="bber"></div>
<script type="text/javascript">
var bbMemos = {
memos : 'https://memos.ee/',
limit : '20',
creatorId:'1',
domId: '',
}
</script>
<script src="https://blogcdn.loliko.cn/memos2/js/marked.js"></script>
<script src="https://blogcdn.loliko.cn/memos2/js/talk.js"></script>
\n

即可~

\n

代码来源于网络~

\n"},{"title":"又是一年冬季","excerpt":"","abbrlink":42284,"date":"2017-12-10T13:05:38.000Z","_content":"\n珠海的冬天是不怎么寒冷的。\n\n最近的降温也是让人们都穿上了长袖。 \n\n每年这个时候我都会吐槽珠海的冬天来的太晚。 \n\n今年过年时要回家去的。\n\n外婆去世已经三周年了,按照我们当地的习俗,今年是要给外婆立碑的。 \n\n时间过的挺快的,感觉这么多年过去了,自己没有丝毫的长进。 \n\n挺悲哀的。\n\n有时候明知道自己做得不够,却不能改变什么,真的是一件挺无奈的事情,我不知道怎么才能够改变自己的生活。 \n\n \n\n另外我元旦会去上海。\n\n去见我的女朋友。","source":"_posts/又是一年冬季.md","raw":"---\ntitle: 又是一年冬季\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 42284\ndate: 2017-12-10 21:05:38\n---\n\n珠海的冬天是不怎么寒冷的。\n\n最近的降温也是让人们都穿上了长袖。 \n\n每年这个时候我都会吐槽珠海的冬天来的太晚。 \n\n今年过年时要回家去的。\n\n外婆去世已经三周年了,按照我们当地的习俗,今年是要给外婆立碑的。 \n\n时间过的挺快的,感觉这么多年过去了,自己没有丝毫的长进。 \n\n挺悲哀的。\n\n有时候明知道自己做得不够,却不能改变什么,真的是一件挺无奈的事情,我不知道怎么才能够改变自己的生活。 \n\n \n\n另外我元旦会去上海。\n\n去见我的女朋友。","slug":"又是一年冬季","published":1,"updated":"2023-09-29T07:51:06.386Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh100djoko0f515b8ii","content":"

珠海的冬天是不怎么寒冷的。

\n

最近的降温也是让人们都穿上了长袖。

\n

每年这个时候我都会吐槽珠海的冬天来的太晚。

\n

今年过年时要回家去的。

\n

外婆去世已经三周年了,按照我们当地的习俗,今年是要给外婆立碑的。

\n

时间过的挺快的,感觉这么多年过去了,自己没有丝毫的长进。

\n

挺悲哀的。

\n

有时候明知道自己做得不够,却不能改变什么,真的是一件挺无奈的事情,我不知道怎么才能够改变自己的生活。

\n

另外我元旦会去上海。

\n

去见我的女朋友。

\n","site":{"data":{}},"more":"

珠海的冬天是不怎么寒冷的。

\n

最近的降温也是让人们都穿上了长袖。

\n

每年这个时候我都会吐槽珠海的冬天来的太晚。

\n

今年过年时要回家去的。

\n

外婆去世已经三周年了,按照我们当地的习俗,今年是要给外婆立碑的。

\n

时间过的挺快的,感觉这么多年过去了,自己没有丝毫的长进。

\n

挺悲哀的。

\n

有时候明知道自己做得不够,却不能改变什么,真的是一件挺无奈的事情,我不知道怎么才能够改变自己的生活。

\n

另外我元旦会去上海。

\n

去见我的女朋友。

\n"},{"title":"压力山大","excerpt":"","abbrlink":2390,"date":"2016-11-04T10:20:56.000Z","_content":"\n说实在话年近三十的压力真的有点大,没有结婚,也没什么存款,买不起车也买不起房,虽然不啃老,但是日子过的也不大理想。 \n\n家中的老人始终都觉得如果你不结婚那以后肯定就是娶不到老婆了。 \n\n我曾经因为这个理由去相亲,去面试,让本来不是很擅长与人打交道的我很是尴尬。 \n\n当然结果是显而易见的,都没成功。 最近小草莓要结婚了。\n\n小草莓与我相识已经有十年了吧,当初就是在我维护的论坛上认识的妹子。\n\n不由得感叹时间真的快。 \n\n小草莓是个软妹子。\n\n二次元少女。\n\n呃,姑且还算是少女吧。\n\n我虽然宅,但是我不混二次元,所以我对动漫啊日语啊都不熟悉。\n\n有时候觉得这么一大把年纪了还在混二次元真的是件很羞耻的事情。 \n\n国庆节小草莓约我去广州陪她玩耍,我内心是拒绝的,所以我就婉约的拒绝了,国庆节人山人海也就罢了,去广州的路上还塞车,根本不值得去,何况我也不想去打搅他们的二人世界,去做一个闪光的人。 \n\n我对她的先生一点都不熟悉,准确来说只在图片上见到过,根本没有与其本人打过交道。\n\n这个也是我拒绝去的理由。\n\n这辈子也不太可能有交集。 \n\n在我们堂兄弟之中目前除了我没有结婚意外也就只有几个很小的没有结婚了。\n\n大部分比我小的堂弟都已经生了二胎。\n\n对此我觉得我应该是比不赢的了。","source":"_posts/压力山大.md","raw":"---\ntitle: 压力山大\ntags:\n - 生活\n - 结婚\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 2390\ndate: 2016-11-04 18:20:56\n---\n\n说实在话年近三十的压力真的有点大,没有结婚,也没什么存款,买不起车也买不起房,虽然不啃老,但是日子过的也不大理想。 \n\n家中的老人始终都觉得如果你不结婚那以后肯定就是娶不到老婆了。 \n\n我曾经因为这个理由去相亲,去面试,让本来不是很擅长与人打交道的我很是尴尬。 \n\n当然结果是显而易见的,都没成功。 最近小草莓要结婚了。\n\n小草莓与我相识已经有十年了吧,当初就是在我维护的论坛上认识的妹子。\n\n不由得感叹时间真的快。 \n\n小草莓是个软妹子。\n\n二次元少女。\n\n呃,姑且还算是少女吧。\n\n我虽然宅,但是我不混二次元,所以我对动漫啊日语啊都不熟悉。\n\n有时候觉得这么一大把年纪了还在混二次元真的是件很羞耻的事情。 \n\n国庆节小草莓约我去广州陪她玩耍,我内心是拒绝的,所以我就婉约的拒绝了,国庆节人山人海也就罢了,去广州的路上还塞车,根本不值得去,何况我也不想去打搅他们的二人世界,去做一个闪光的人。 \n\n我对她的先生一点都不熟悉,准确来说只在图片上见到过,根本没有与其本人打过交道。\n\n这个也是我拒绝去的理由。\n\n这辈子也不太可能有交集。 \n\n在我们堂兄弟之中目前除了我没有结婚意外也就只有几个很小的没有结婚了。\n\n大部分比我小的堂弟都已经生了二胎。\n\n对此我觉得我应该是比不赢的了。","slug":"压力山大","published":1,"updated":"2023-09-29T07:51:06.386Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh100dmoko02qj9fqke","content":"

说实在话年近三十的压力真的有点大,没有结婚,也没什么存款,买不起车也买不起房,虽然不啃老,但是日子过的也不大理想。

\n

家中的老人始终都觉得如果你不结婚那以后肯定就是娶不到老婆了。

\n

我曾经因为这个理由去相亲,去面试,让本来不是很擅长与人打交道的我很是尴尬。

\n

当然结果是显而易见的,都没成功。 最近小草莓要结婚了。

\n

小草莓与我相识已经有十年了吧,当初就是在我维护的论坛上认识的妹子。

\n

不由得感叹时间真的快。

\n

小草莓是个软妹子。

\n

二次元少女。

\n

呃,姑且还算是少女吧。

\n

我虽然宅,但是我不混二次元,所以我对动漫啊日语啊都不熟悉。

\n

有时候觉得这么一大把年纪了还在混二次元真的是件很羞耻的事情。

\n

国庆节小草莓约我去广州陪她玩耍,我内心是拒绝的,所以我就婉约的拒绝了,国庆节人山人海也就罢了,去广州的路上还塞车,根本不值得去,何况我也不想去打搅他们的二人世界,去做一个闪光的人。

\n

我对她的先生一点都不熟悉,准确来说只在图片上见到过,根本没有与其本人打过交道。

\n

这个也是我拒绝去的理由。

\n

这辈子也不太可能有交集。

\n

在我们堂兄弟之中目前除了我没有结婚意外也就只有几个很小的没有结婚了。

\n

大部分比我小的堂弟都已经生了二胎。

\n

对此我觉得我应该是比不赢的了。

\n","site":{"data":{}},"more":"

说实在话年近三十的压力真的有点大,没有结婚,也没什么存款,买不起车也买不起房,虽然不啃老,但是日子过的也不大理想。

\n

家中的老人始终都觉得如果你不结婚那以后肯定就是娶不到老婆了。

\n

我曾经因为这个理由去相亲,去面试,让本来不是很擅长与人打交道的我很是尴尬。

\n

当然结果是显而易见的,都没成功。 最近小草莓要结婚了。

\n

小草莓与我相识已经有十年了吧,当初就是在我维护的论坛上认识的妹子。

\n

不由得感叹时间真的快。

\n

小草莓是个软妹子。

\n

二次元少女。

\n

呃,姑且还算是少女吧。

\n

我虽然宅,但是我不混二次元,所以我对动漫啊日语啊都不熟悉。

\n

有时候觉得这么一大把年纪了还在混二次元真的是件很羞耻的事情。

\n

国庆节小草莓约我去广州陪她玩耍,我内心是拒绝的,所以我就婉约的拒绝了,国庆节人山人海也就罢了,去广州的路上还塞车,根本不值得去,何况我也不想去打搅他们的二人世界,去做一个闪光的人。

\n

我对她的先生一点都不熟悉,准确来说只在图片上见到过,根本没有与其本人打过交道。

\n

这个也是我拒绝去的理由。

\n

这辈子也不太可能有交集。

\n

在我们堂兄弟之中目前除了我没有结婚意外也就只有几个很小的没有结婚了。

\n

大部分比我小的堂弟都已经生了二胎。

\n

对此我觉得我应该是比不赢的了。

\n"},{"title":"周二","excerpt":"","abbrlink":31481,"date":"2011-10-18T01:53:51.000Z","_content":"\n2011年11月18日,星期二,天气晴。 \n\n我承认我变得更加懒惰。\n\n几乎没有时间更新博客。 \n\n主要是没什么写的欲望。 \n\n我在玩腾讯的游戏《[H2](http://h2.181p.com)》。\n\n仿梦幻西游的回合制游戏。 \n\n四大种族貌似大话,但是种族技能却貌似梦幻。 \n\n有独特的玩法,但是还是觉得这样的游戏会很累。 \n\n每个人都有自己强大起来的欲望。 \n\n要点技能要极品装备极品宝宝。 \n\n这些都要时间要力气。 \n\n所以。 \n\n我真的投入了一些精力。\n\n但是也累了。 \n\n这些都不是娱乐至上的游戏。 \n\n还不如玩玩三国杀玩玩龙之谷呢。 \n\nPS,下午两点南香里巴士站工商银行旁面试。\n\n---\n\n更新于2023年6月\n\n这个游戏最终还是上线运营了两年,然后停止运营匆匆了事了.\n\n上线时候的名字似乎叫 QQ仙灵 \n\n很拉胯的名字让人没有想玩的欲望.\n\n甚至还没有当年的回合制网友梦幻聊斋 或者 梦幻红楼 梦幻古龙此类的更有吸睛的能力\n\n再加上腾讯只想让人氪金,一点都不考虑游戏的趣味性.\n\n看看梦幻西游经久不衰,氪金的大有人在,可为什么还是有那么多人玩.\n\n最主要的就是经济体系的收支平衡.\n\n游戏中所有道具的产出和消耗是平衡的.\n\n如果产出太多的货币无法消耗,自然就是通货膨胀,物价飞涨,普通玩家没有体验而逐渐放弃.\n","source":"_posts/周二.md","raw":"---\ntitle: 周二\ntags:\n - H2\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 31481\ndate: 2011-10-18 09:53:51\n---\n\n2011年11月18日,星期二,天气晴。 \n\n我承认我变得更加懒惰。\n\n几乎没有时间更新博客。 \n\n主要是没什么写的欲望。 \n\n我在玩腾讯的游戏《[H2](http://h2.181p.com)》。\n\n仿梦幻西游的回合制游戏。 \n\n四大种族貌似大话,但是种族技能却貌似梦幻。 \n\n有独特的玩法,但是还是觉得这样的游戏会很累。 \n\n每个人都有自己强大起来的欲望。 \n\n要点技能要极品装备极品宝宝。 \n\n这些都要时间要力气。 \n\n所以。 \n\n我真的投入了一些精力。\n\n但是也累了。 \n\n这些都不是娱乐至上的游戏。 \n\n还不如玩玩三国杀玩玩龙之谷呢。 \n\nPS,下午两点南香里巴士站工商银行旁面试。\n\n---\n\n更新于2023年6月\n\n这个游戏最终还是上线运营了两年,然后停止运营匆匆了事了.\n\n上线时候的名字似乎叫 QQ仙灵 \n\n很拉胯的名字让人没有想玩的欲望.\n\n甚至还没有当年的回合制网友梦幻聊斋 或者 梦幻红楼 梦幻古龙此类的更有吸睛的能力\n\n再加上腾讯只想让人氪金,一点都不考虑游戏的趣味性.\n\n看看梦幻西游经久不衰,氪金的大有人在,可为什么还是有那么多人玩.\n\n最主要的就是经济体系的收支平衡.\n\n游戏中所有道具的产出和消耗是平衡的.\n\n如果产出太多的货币无法消耗,自然就是通货膨胀,物价飞涨,普通玩家没有体验而逐渐放弃.\n","slug":"周二","published":1,"updated":"2023-09-29T07:51:06.387Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh200dqoko0hanoeoxo","content":"

2011年11月18日,星期二,天气晴。

\n

我承认我变得更加懒惰。

\n

几乎没有时间更新博客。

\n

主要是没什么写的欲望。

\n

我在玩腾讯的游戏《H2》。

\n

仿梦幻西游的回合制游戏。

\n

四大种族貌似大话,但是种族技能却貌似梦幻。

\n

有独特的玩法,但是还是觉得这样的游戏会很累。

\n

每个人都有自己强大起来的欲望。

\n

要点技能要极品装备极品宝宝。

\n

这些都要时间要力气。

\n

所以。

\n

我真的投入了一些精力。

\n

但是也累了。

\n

这些都不是娱乐至上的游戏。

\n

还不如玩玩三国杀玩玩龙之谷呢。

\n

PS,下午两点南香里巴士站工商银行旁面试。

\n
\n

更新于2023年6月

\n

这个游戏最终还是上线运营了两年,然后停止运营匆匆了事了.

\n

上线时候的名字似乎叫 QQ仙灵

\n

很拉胯的名字让人没有想玩的欲望.

\n

甚至还没有当年的回合制网友梦幻聊斋 或者 梦幻红楼 梦幻古龙此类的更有吸睛的能力

\n

再加上腾讯只想让人氪金,一点都不考虑游戏的趣味性.

\n

看看梦幻西游经久不衰,氪金的大有人在,可为什么还是有那么多人玩.

\n

最主要的就是经济体系的收支平衡.

\n

游戏中所有道具的产出和消耗是平衡的.

\n

如果产出太多的货币无法消耗,自然就是通货膨胀,物价飞涨,普通玩家没有体验而逐渐放弃.

\n","site":{"data":{}},"more":"

2011年11月18日,星期二,天气晴。

\n

我承认我变得更加懒惰。

\n

几乎没有时间更新博客。

\n

主要是没什么写的欲望。

\n

我在玩腾讯的游戏《H2》。

\n

仿梦幻西游的回合制游戏。

\n

四大种族貌似大话,但是种族技能却貌似梦幻。

\n

有独特的玩法,但是还是觉得这样的游戏会很累。

\n

每个人都有自己强大起来的欲望。

\n

要点技能要极品装备极品宝宝。

\n

这些都要时间要力气。

\n

所以。

\n

我真的投入了一些精力。

\n

但是也累了。

\n

这些都不是娱乐至上的游戏。

\n

还不如玩玩三国杀玩玩龙之谷呢。

\n

PS,下午两点南香里巴士站工商银行旁面试。

\n
\n

更新于2023年6月

\n

这个游戏最终还是上线运营了两年,然后停止运营匆匆了事了.

\n

上线时候的名字似乎叫 QQ仙灵

\n

很拉胯的名字让人没有想玩的欲望.

\n

甚至还没有当年的回合制网友梦幻聊斋 或者 梦幻红楼 梦幻古龙此类的更有吸睛的能力

\n

再加上腾讯只想让人氪金,一点都不考虑游戏的趣味性.

\n

看看梦幻西游经久不衰,氪金的大有人在,可为什么还是有那么多人玩.

\n

最主要的就是经济体系的收支平衡.

\n

游戏中所有道具的产出和消耗是平衡的.

\n

如果产出太多的货币无法消耗,自然就是通货膨胀,物价飞涨,普通玩家没有体验而逐渐放弃.

\n"},{"title":"又是拳头","excerpt":"","abbrlink":24539,"date":"2016-11-18T04:56:15.000Z","_content":"\n中午吃饭的时候就在想,人类最早的时候是先有语言呢还是先有文字。 \n\n至于史学家这么考证暂且不管,说说我的思路。 \n\n最早的人类因为吃到了好吃的熟食或者渴望温暖与光明,所以学会了用火。 \n\n吃了熟食之后发现自己拳头特别有力量,可以号令其他人。(参考动物世界) \n\n这时候是没有语言的,大家都是瞎比划。(嗷嗷嗷,参考猩猩) \n\n人们学会了养殖。\n\n要计数,这才有了最早的算筹。\n\n历史书上写的应该是绳子,后来发现绳子太脆弱,就改成刻在石头上。 \n\n这应该是最早的文字。 \n\n中国大部分文字其实都是象形文字,大约就是像什么画下来表示。 \n\n至于这个读音嘛,大概就是一个部落一种理解,每个部落的发音都不太一样。\n\n后来才有了多音字。\n\n就是因为发音不统一造成的。 \n\n说道这里可能有人会以为我跑题了。 \n\n其实并没有,这一切都是跟拳头有关的。\n\n因为拳头,造就了阶级。\n\n因为拳头强迫人们学习。\n\n以及统一。(秦始皇真的很伟大) \n\n现在的人都说秦始皇暴虐,其实他就是为了千秋万代的统治才这样做。 \n\n说到这里,其实这一切都是为了便于统治。 \n\n推广儒家的思想,君子动口不动手,大家都做了君子,只动口,不动手。\n\n都不反抗,都不惹是生非,岂不是就天下太平了。\n\n统治者不就最喜欢看到这样的结果么。 \n\n还是那句话,拳头大的说了算。 \n\n而文明也是如此。\n\n侠以武犯禁,但是和平从来都是武力争取来的.","source":"_posts/又是拳头.md","raw":"---\ntitle: 又是拳头\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 24539\ndate: 2016-11-18 12:56:15\n---\n\n中午吃饭的时候就在想,人类最早的时候是先有语言呢还是先有文字。 \n\n至于史学家这么考证暂且不管,说说我的思路。 \n\n最早的人类因为吃到了好吃的熟食或者渴望温暖与光明,所以学会了用火。 \n\n吃了熟食之后发现自己拳头特别有力量,可以号令其他人。(参考动物世界) \n\n这时候是没有语言的,大家都是瞎比划。(嗷嗷嗷,参考猩猩) \n\n人们学会了养殖。\n\n要计数,这才有了最早的算筹。\n\n历史书上写的应该是绳子,后来发现绳子太脆弱,就改成刻在石头上。 \n\n这应该是最早的文字。 \n\n中国大部分文字其实都是象形文字,大约就是像什么画下来表示。 \n\n至于这个读音嘛,大概就是一个部落一种理解,每个部落的发音都不太一样。\n\n后来才有了多音字。\n\n就是因为发音不统一造成的。 \n\n说道这里可能有人会以为我跑题了。 \n\n其实并没有,这一切都是跟拳头有关的。\n\n因为拳头,造就了阶级。\n\n因为拳头强迫人们学习。\n\n以及统一。(秦始皇真的很伟大) \n\n现在的人都说秦始皇暴虐,其实他就是为了千秋万代的统治才这样做。 \n\n说到这里,其实这一切都是为了便于统治。 \n\n推广儒家的思想,君子动口不动手,大家都做了君子,只动口,不动手。\n\n都不反抗,都不惹是生非,岂不是就天下太平了。\n\n统治者不就最喜欢看到这样的结果么。 \n\n还是那句话,拳头大的说了算。 \n\n而文明也是如此。\n\n侠以武犯禁,但是和平从来都是武力争取来的.","slug":"又是拳头","published":1,"updated":"2023-09-29T07:51:06.387Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh300dtoko02up90jo7","content":"

中午吃饭的时候就在想,人类最早的时候是先有语言呢还是先有文字。

\n

至于史学家这么考证暂且不管,说说我的思路。

\n

最早的人类因为吃到了好吃的熟食或者渴望温暖与光明,所以学会了用火。

\n

吃了熟食之后发现自己拳头特别有力量,可以号令其他人。(参考动物世界)

\n

这时候是没有语言的,大家都是瞎比划。(嗷嗷嗷,参考猩猩)

\n

人们学会了养殖。

\n

要计数,这才有了最早的算筹。

\n

历史书上写的应该是绳子,后来发现绳子太脆弱,就改成刻在石头上。

\n

这应该是最早的文字。

\n

中国大部分文字其实都是象形文字,大约就是像什么画下来表示。

\n

至于这个读音嘛,大概就是一个部落一种理解,每个部落的发音都不太一样。

\n

后来才有了多音字。

\n

就是因为发音不统一造成的。

\n

说道这里可能有人会以为我跑题了。

\n

其实并没有,这一切都是跟拳头有关的。

\n

因为拳头,造就了阶级。

\n

因为拳头强迫人们学习。

\n

以及统一。(秦始皇真的很伟大)

\n

现在的人都说秦始皇暴虐,其实他就是为了千秋万代的统治才这样做。

\n

说到这里,其实这一切都是为了便于统治。

\n

推广儒家的思想,君子动口不动手,大家都做了君子,只动口,不动手。

\n

都不反抗,都不惹是生非,岂不是就天下太平了。

\n

统治者不就最喜欢看到这样的结果么。

\n

还是那句话,拳头大的说了算。

\n

而文明也是如此。

\n

侠以武犯禁,但是和平从来都是武力争取来的.

\n","site":{"data":{}},"more":"

中午吃饭的时候就在想,人类最早的时候是先有语言呢还是先有文字。

\n

至于史学家这么考证暂且不管,说说我的思路。

\n

最早的人类因为吃到了好吃的熟食或者渴望温暖与光明,所以学会了用火。

\n

吃了熟食之后发现自己拳头特别有力量,可以号令其他人。(参考动物世界)

\n

这时候是没有语言的,大家都是瞎比划。(嗷嗷嗷,参考猩猩)

\n

人们学会了养殖。

\n

要计数,这才有了最早的算筹。

\n

历史书上写的应该是绳子,后来发现绳子太脆弱,就改成刻在石头上。

\n

这应该是最早的文字。

\n

中国大部分文字其实都是象形文字,大约就是像什么画下来表示。

\n

至于这个读音嘛,大概就是一个部落一种理解,每个部落的发音都不太一样。

\n

后来才有了多音字。

\n

就是因为发音不统一造成的。

\n

说道这里可能有人会以为我跑题了。

\n

其实并没有,这一切都是跟拳头有关的。

\n

因为拳头,造就了阶级。

\n

因为拳头强迫人们学习。

\n

以及统一。(秦始皇真的很伟大)

\n

现在的人都说秦始皇暴虐,其实他就是为了千秋万代的统治才这样做。

\n

说到这里,其实这一切都是为了便于统治。

\n

推广儒家的思想,君子动口不动手,大家都做了君子,只动口,不动手。

\n

都不反抗,都不惹是生非,岂不是就天下太平了。

\n

统治者不就最喜欢看到这样的结果么。

\n

还是那句话,拳头大的说了算。

\n

而文明也是如此。

\n

侠以武犯禁,但是和平从来都是武力争取来的.

\n"},{"title":"周日","excerpt":"","abbrlink":13444,"date":"2016-05-29T14:37:32.000Z","_content":"\n许久没有记录什么了,突然想起还有博客这回事,就准备写点什么。 \n\n最近在听许巍的《生活不止眼前的苟且》。 \n\n感觉高晓松还是挺有才的,值得一赞。 \n\n毕竟听了那么多年的同桌的你。\n\n---\n\n2023年6月更新\n\n矮大紧被打成公知.\n\n黄磊人设崩塌...\n\n等等等\n\n明星终究还是会褪去光环.\n\n落入尘埃之中.\n\n本就是凡人 何必装成天上的仙儿呢","source":"_posts/周日.md","raw":"---\ntitle: 周日\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 13444\ndate: 2016-05-29 22:37:32\n---\n\n许久没有记录什么了,突然想起还有博客这回事,就准备写点什么。 \n\n最近在听许巍的《生活不止眼前的苟且》。 \n\n感觉高晓松还是挺有才的,值得一赞。 \n\n毕竟听了那么多年的同桌的你。\n\n---\n\n2023年6月更新\n\n矮大紧被打成公知.\n\n黄磊人设崩塌...\n\n等等等\n\n明星终究还是会褪去光环.\n\n落入尘埃之中.\n\n本就是凡人 何必装成天上的仙儿呢","slug":"周日","published":1,"updated":"2023-09-29T07:51:06.387Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh300dxoko0aq8n03yw","content":"

许久没有记录什么了,突然想起还有博客这回事,就准备写点什么。

\n

最近在听许巍的《生活不止眼前的苟且》。

\n

感觉高晓松还是挺有才的,值得一赞。

\n

毕竟听了那么多年的同桌的你。

\n
\n

2023年6月更新

\n

矮大紧被打成公知.

\n

黄磊人设崩塌…

\n

等等等

\n

明星终究还是会褪去光环.

\n

落入尘埃之中.

\n

本就是凡人 何必装成天上的仙儿呢

\n","site":{"data":{}},"more":"

许久没有记录什么了,突然想起还有博客这回事,就准备写点什么。

\n

最近在听许巍的《生活不止眼前的苟且》。

\n

感觉高晓松还是挺有才的,值得一赞。

\n

毕竟听了那么多年的同桌的你。

\n
\n

2023年6月更新

\n

矮大紧被打成公知.

\n

黄磊人设崩塌…

\n

等等等

\n

明星终究还是会褪去光环.

\n

落入尘埃之中.

\n

本就是凡人 何必装成天上的仙儿呢

\n"},{"title":"圣诞节","excerpt":"","abbrlink":19175,"date":"2017-12-25T01:52:06.000Z","_content":"\n又是一年的圣诞节,对于这种洋节日,我们这些80后接受度还是很高的。 \n特别是在高中时代。\n我怀念那段时光。 \n有些在读书的小朋友可能会问,为什么这些大人怀念的都是当初上学时候的事情?\n明明上学一点都不好玩。 \n我不会告诉他们,学生时代是最美好的时代。\n有单纯,热血,没有功利,分是非对错,有理想,有梦想。 \n因为现实真的会教做人。\n我学会了慢慢的丢了节操,忘记了梦想,分不清对错,只追逐利益。 \n我可能会借口说,都是为了生活。 \n我喜欢的歌手朴树,去参加综艺节目的时候,别人问他,你为什么要来参加这样的节目呢?\n他回答,我最近比较需要钱。 \n就是这么直接简单的一个人。\n当年也是红极一时的歌手,从来不参加综艺节目的他,也不得不妥协,向着现实低头。 \n很多评论家说,如今的社会越来越浮躁,丢失信仰,争名逐利。\n一切向钱看。\n这一切都是悲哀的。\n却是无法改变的。 \n人总要生活的吧。\n朴树这样说。 \n圣诞节里本不该说这样的话题。\n是我跑偏了。 \n圣诞节快乐!我许久不见的朋友们!","source":"_posts/圣诞节.md","raw":"---\ntitle: 圣诞节\ntags:\n - 圣诞节\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 19175\ndate: 2017-12-25 09:52:06\n---\n\n又是一年的圣诞节,对于这种洋节日,我们这些80后接受度还是很高的。 \n特别是在高中时代。\n我怀念那段时光。 \n有些在读书的小朋友可能会问,为什么这些大人怀念的都是当初上学时候的事情?\n明明上学一点都不好玩。 \n我不会告诉他们,学生时代是最美好的时代。\n有单纯,热血,没有功利,分是非对错,有理想,有梦想。 \n因为现实真的会教做人。\n我学会了慢慢的丢了节操,忘记了梦想,分不清对错,只追逐利益。 \n我可能会借口说,都是为了生活。 \n我喜欢的歌手朴树,去参加综艺节目的时候,别人问他,你为什么要来参加这样的节目呢?\n他回答,我最近比较需要钱。 \n就是这么直接简单的一个人。\n当年也是红极一时的歌手,从来不参加综艺节目的他,也不得不妥协,向着现实低头。 \n很多评论家说,如今的社会越来越浮躁,丢失信仰,争名逐利。\n一切向钱看。\n这一切都是悲哀的。\n却是无法改变的。 \n人总要生活的吧。\n朴树这样说。 \n圣诞节里本不该说这样的话题。\n是我跑偏了。 \n圣诞节快乐!我许久不见的朋友们!","slug":"圣诞节","published":1,"updated":"2023-09-29T07:51:06.388Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh400e0oko0e4rr7rn9","content":"

又是一年的圣诞节,对于这种洋节日,我们这些80后接受度还是很高的。
特别是在高中时代。
我怀念那段时光。
有些在读书的小朋友可能会问,为什么这些大人怀念的都是当初上学时候的事情?
明明上学一点都不好玩。
我不会告诉他们,学生时代是最美好的时代。
有单纯,热血,没有功利,分是非对错,有理想,有梦想。
因为现实真的会教做人。
我学会了慢慢的丢了节操,忘记了梦想,分不清对错,只追逐利益。
我可能会借口说,都是为了生活。
我喜欢的歌手朴树,去参加综艺节目的时候,别人问他,你为什么要来参加这样的节目呢?
他回答,我最近比较需要钱。
就是这么直接简单的一个人。
当年也是红极一时的歌手,从来不参加综艺节目的他,也不得不妥协,向着现实低头。
很多评论家说,如今的社会越来越浮躁,丢失信仰,争名逐利。
一切向钱看。
这一切都是悲哀的。
却是无法改变的。
人总要生活的吧。
朴树这样说。
圣诞节里本不该说这样的话题。
是我跑偏了。
圣诞节快乐!我许久不见的朋友们!

\n","site":{"data":{}},"more":"

又是一年的圣诞节,对于这种洋节日,我们这些80后接受度还是很高的。
特别是在高中时代。
我怀念那段时光。
有些在读书的小朋友可能会问,为什么这些大人怀念的都是当初上学时候的事情?
明明上学一点都不好玩。
我不会告诉他们,学生时代是最美好的时代。
有单纯,热血,没有功利,分是非对错,有理想,有梦想。
因为现实真的会教做人。
我学会了慢慢的丢了节操,忘记了梦想,分不清对错,只追逐利益。
我可能会借口说,都是为了生活。
我喜欢的歌手朴树,去参加综艺节目的时候,别人问他,你为什么要来参加这样的节目呢?
他回答,我最近比较需要钱。
就是这么直接简单的一个人。
当年也是红极一时的歌手,从来不参加综艺节目的他,也不得不妥协,向着现实低头。
很多评论家说,如今的社会越来越浮躁,丢失信仰,争名逐利。
一切向钱看。
这一切都是悲哀的。
却是无法改变的。
人总要生活的吧。
朴树这样说。
圣诞节里本不该说这样的话题。
是我跑偏了。
圣诞节快乐!我许久不见的朋友们!

\n"},{"title":"如何在Fly.io部署Memos","abbrlink":"88a97a51","date":"2023-08-14T16:00:00.000Z","cover":null,"_content":" \n## 项目\nhttps://github.com/hu3rror/memos-on-fly\n## 准备工作\n\n- 注册FLY.IO \n用以部署memos\n- 注册B2C \nhttps://www.backblaze.com/cloud-storage\n 用以同步备份memos数据库\n 新建BUCKET,并获取``和``\n\n\n## 安装flyctl\nInstall flyctl \n以WINDOWS为例\n```\npwsh -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n其他系统请参照官方\n## 新建APP\n初始化\n```\nflyctl launch\n```\n按照提示选择会生成一个FLY.TOML文件\n\n## 编辑FLY.TOML\n添加以下\n```\n[build]\n image = \"ghcr.io/hu3rror/memos-litestream:latest\"\n#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest\n#使用官方镜像可以删掉env的部分\n[env]\n # Details see: https://litestream.io/guides/backblaze/\n LITESTREAM_REPLICA_BUCKET = \"B2C桶名称\" # change to your litestream bucket name\n LITESTREAM_REPLICA_ENDPOINT = \"s3.us-east-005.backblazeb2.com\" # change to your litestream endpoint url\n LITESTREAM_REPLICA_PATH = \"memos_prod.db\" # keep the default or change to whatever path you want\n\n[[mounts]]\n source = \"memos_data\"\n destination = \"/var/opt/memos\"\n\n[http_service]\n internal_port = 5230\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 0\n```\n## 添加持久卷\n```\nflyctl volumes create memos_data --region hkg --size 1\n```\n## 密钥\n将B2存储的密钥添加到fly的密钥存储中,使用官方镜像可以忽略此步骤\n```\nflyctl secrets set LITESTREAM_ACCESS_KEY_ID=\"\" LITESTREAM_SECRET_ACCESS_KEY=\"\"\n```\n## 部署\n```\nflyctl deploy\n```\n## 演示地址\nhttps://memosim.fly.dev/\n绑定域名演示\nhttps://imad.top\n","source":"_posts/在Fly.io部署Memos.md","raw":"---\ntitle: 如何在Fly.io部署Memos\ntags: Memos\ncategories: 分享\nabbrlink: 88a97a51\ndate: 2023-08-15 00:00:00\ncover:\n---\n \n## 项目\nhttps://github.com/hu3rror/memos-on-fly\n## 准备工作\n\n- 注册FLY.IO \n用以部署memos\n- 注册B2C \nhttps://www.backblaze.com/cloud-storage\n 用以同步备份memos数据库\n 新建BUCKET,并获取``和``\n\n\n## 安装flyctl\nInstall flyctl \n以WINDOWS为例\n```\npwsh -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n其他系统请参照官方\n## 新建APP\n初始化\n```\nflyctl launch\n```\n按照提示选择会生成一个FLY.TOML文件\n\n## 编辑FLY.TOML\n添加以下\n```\n[build]\n image = \"ghcr.io/hu3rror/memos-litestream:latest\"\n#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest\n#使用官方镜像可以删掉env的部分\n[env]\n # Details see: https://litestream.io/guides/backblaze/\n LITESTREAM_REPLICA_BUCKET = \"B2C桶名称\" # change to your litestream bucket name\n LITESTREAM_REPLICA_ENDPOINT = \"s3.us-east-005.backblazeb2.com\" # change to your litestream endpoint url\n LITESTREAM_REPLICA_PATH = \"memos_prod.db\" # keep the default or change to whatever path you want\n\n[[mounts]]\n source = \"memos_data\"\n destination = \"/var/opt/memos\"\n\n[http_service]\n internal_port = 5230\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 0\n```\n## 添加持久卷\n```\nflyctl volumes create memos_data --region hkg --size 1\n```\n## 密钥\n将B2存储的密钥添加到fly的密钥存储中,使用官方镜像可以忽略此步骤\n```\nflyctl secrets set LITESTREAM_ACCESS_KEY_ID=\"\" LITESTREAM_SECRET_ACCESS_KEY=\"\"\n```\n## 部署\n```\nflyctl deploy\n```\n## 演示地址\nhttps://memosim.fly.dev/\n绑定域名演示\nhttps://imad.top\n","slug":"在Fly.io部署Memos","published":1,"updated":"2023-09-29T07:51:06.388Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh500e3oko061ca3uey","content":"

项目

https://github.com/hu3rror/memos-on-fly

\n

准备工作

\n

安装flyctl

Install flyctl
以WINDOWS为例

\n
1
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n

其他系统请参照官方

\n

新建APP

初始化

\n
1
flyctl launch
\n

按照提示选择会生成一个FLY.TOML文件

\n

编辑FLY.TOML

添加以下

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[build]
image = "ghcr.io/hu3rror/memos-litestream:latest"
#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest
#使用官方镜像可以删掉env的部分
[env]
# Details see: https://litestream.io/guides/backblaze/
LITESTREAM_REPLICA_BUCKET = "B2C桶名称" # change to your litestream bucket name
LITESTREAM_REPLICA_ENDPOINT = "s3.us-east-005.backblazeb2.com" # change to your litestream endpoint url
LITESTREAM_REPLICA_PATH = "memos_prod.db" # keep the default or change to whatever path you want

[[mounts]]
source = "memos_data"
destination = "/var/opt/memos"

[http_service]
internal_port = 5230
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 0
\n

添加持久卷

1
flyctl volumes create memos_data --region hkg --size 1
\n

密钥

将B2存储的密钥添加到fly的密钥存储中,使用官方镜像可以忽略此步骤

\n
1
flyctl secrets set LITESTREAM_ACCESS_KEY_ID="<keyId>" LITESTREAM_SECRET_ACCESS_KEY="<applicationKey>"
\n

部署

1
flyctl deploy
\n

演示地址

https://memosim.fly.dev/
绑定域名演示
https://imad.top

\n","site":{"data":{}},"excerpt":"","more":"

项目

https://github.com/hu3rror/memos-on-fly

\n

准备工作

\n

安装flyctl

Install flyctl
以WINDOWS为例

\n
1
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n

其他系统请参照官方

\n

新建APP

初始化

\n
1
flyctl launch
\n

按照提示选择会生成一个FLY.TOML文件

\n

编辑FLY.TOML

添加以下

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[build]
image = "ghcr.io/hu3rror/memos-litestream:latest"
#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest
#使用官方镜像可以删掉env的部分
[env]
# Details see: https://litestream.io/guides/backblaze/
LITESTREAM_REPLICA_BUCKET = "B2C桶名称" # change to your litestream bucket name
LITESTREAM_REPLICA_ENDPOINT = "s3.us-east-005.backblazeb2.com" # change to your litestream endpoint url
LITESTREAM_REPLICA_PATH = "memos_prod.db" # keep the default or change to whatever path you want

[[mounts]]
source = "memos_data"
destination = "/var/opt/memos"

[http_service]
internal_port = 5230
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 0
\n

添加持久卷

1
flyctl volumes create memos_data --region hkg --size 1
\n

密钥

将B2存储的密钥添加到fly的密钥存储中,使用官方镜像可以忽略此步骤

\n
1
flyctl secrets set LITESTREAM_ACCESS_KEY_ID="<keyId>" LITESTREAM_SECRET_ACCESS_KEY="<applicationKey>"
\n

部署

1
flyctl deploy
\n

演示地址

https://memosim.fly.dev/
绑定域名演示
https://imad.top

\n"},{"title":"在fly.io部署artalk评论系统","published":1,"abbrlink":"c80a64e9","date":"2023-08-15T01:37:00.000Z","cover":null,"_content":"众所周知`Fly.io`是一个免费的SAAS平台\n提供三个内存为256MB的服务器,总3G硬盘空间.\n为防止滥用,需要绑定信用卡.\n## 准备\n安装官方的命令行工具flyctl\n\n## 初始化\n```\nflyctl launch\n```\n根据提示创建一个app\n\n## 创建一个1G的硬盘\n1G的硬盘用来储存评论数据绰绰有余了\n```\nflyctl volumes create artalk_data --region hkg --size 1\n```\n## 编辑FLY.TOML\n\n```\n#根据自动生成的FLY.TOML文件修改\napp = \"atim\" \nprimary_region = \"hkg\"\n\n[build]\n image = \"artalk/artalk-go\"\n\n[http_service]\n internal_port = 23366\n force_https = true\n auto_stop_machines = true\n auto_start_machines = true\n min_machines_running = 0\n processes = [\"app\"]\n\n[[mounts]]\n source = \"artalk_data\"\n destination = \"/data\"\n\n[experimental]\n vm = true\n```\n## 在 fly.toml 文件目录执行\n```\nflyctl ssh console\n```\n创建一个管理员账号\n```\n./artalk admin\n```\n如需重启则执行\n```\nflyctl apps restart\n```\n","source":"_posts/在fly.io部署artalk评论系统.md","raw":"---\ntitle: 在fly.io部署artalk评论系统\ntags:\n - artalk\npublished: true\ncategories: 推荐\nabbrlink: c80a64e9\ndate: 2023-08-15 09:37:00\ncover:\n---\n众所周知`Fly.io`是一个免费的SAAS平台\n提供三个内存为256MB的服务器,总3G硬盘空间.\n为防止滥用,需要绑定信用卡.\n## 准备\n安装官方的命令行工具flyctl\n\n## 初始化\n```\nflyctl launch\n```\n根据提示创建一个app\n\n## 创建一个1G的硬盘\n1G的硬盘用来储存评论数据绰绰有余了\n```\nflyctl volumes create artalk_data --region hkg --size 1\n```\n## 编辑FLY.TOML\n\n```\n#根据自动生成的FLY.TOML文件修改\napp = \"atim\" \nprimary_region = \"hkg\"\n\n[build]\n image = \"artalk/artalk-go\"\n\n[http_service]\n internal_port = 23366\n force_https = true\n auto_stop_machines = true\n auto_start_machines = true\n min_machines_running = 0\n processes = [\"app\"]\n\n[[mounts]]\n source = \"artalk_data\"\n destination = \"/data\"\n\n[experimental]\n vm = true\n```\n## 在 fly.toml 文件目录执行\n```\nflyctl ssh console\n```\n创建一个管理员账号\n```\n./artalk admin\n```\n如需重启则执行\n```\nflyctl apps restart\n```\n","slug":"在fly.io部署artalk评论系统","updated":"2023-09-29T07:51:06.389Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh500e7oko08s7t4jc0","content":"

众所周知Fly.io是一个免费的SAAS平台
提供三个内存为256MB的服务器,总3G硬盘空间.
为防止滥用,需要绑定信用卡.

\n

准备

安装官方的命令行工具flyctl

\n

初始化

1
flyctl launch
\n

根据提示创建一个app

\n

创建一个1G的硬盘

1G的硬盘用来储存评论数据绰绰有余了

\n
1
flyctl volumes create artalk_data --region hkg --size 1
\n

编辑FLY.TOML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#根据自动生成的FLY.TOML文件修改
app = "atim"
primary_region = "hkg"

[build]
image = "artalk/artalk-go"

[http_service]
internal_port = 23366
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ["app"]

[[mounts]]
source = "artalk_data"
destination = "/data"

[experimental]
vm = true
\n

在 fly.toml 文件目录执行

1
flyctl ssh console
\n

创建一个管理员账号

\n
1
./artalk admin
\n

如需重启则执行

\n
1
flyctl apps restart
\n","site":{"data":{}},"excerpt":"","more":"

众所周知Fly.io是一个免费的SAAS平台
提供三个内存为256MB的服务器,总3G硬盘空间.
为防止滥用,需要绑定信用卡.

\n

准备

安装官方的命令行工具flyctl

\n

初始化

1
flyctl launch
\n

根据提示创建一个app

\n

创建一个1G的硬盘

1G的硬盘用来储存评论数据绰绰有余了

\n
1
flyctl volumes create artalk_data --region hkg --size 1
\n

编辑FLY.TOML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#根据自动生成的FLY.TOML文件修改
app = "atim"
primary_region = "hkg"

[build]
image = "artalk/artalk-go"

[http_service]
internal_port = 23366
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ["app"]

[[mounts]]
source = "artalk_data"
destination = "/data"

[experimental]
vm = true
\n

在 fly.toml 文件目录执行

1
flyctl ssh console
\n

创建一个管理员账号

\n
1
./artalk admin
\n

如需重启则执行

\n
1
flyctl apps restart
\n"},{"title":"在fly.io部署Gotosocial","abbrlink":"9597b72","date":"2023-08-17T10:55:46.000Z","_content":"\n## 关于Gotosocial\n\nGoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。\n\n## 准备\n\n- 注册 Fly.io 账号,并绑卡(避免滥用);\n- 注册 Cloudflare 并启用 R2,启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。\n\n## 安装 flyctl\n\n- Linux\n\n```\ncurl -L https://fly.io/install.sh | sh\n```\n\n- macOS\n\n```\ncurl -L https://fly.io/install.sh | sh\n```\n\n- Windows,需要开启 RemoteSigned: 管理员运行\n\n```\n Set-ExecutionPolicy -ExecutionPolicy RemoteSigned\n```\n\n```\npowershell -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n\n## 登录\n\n```\nflyctl auth login\n\n# 若登录失败使用\n# flyctl auth login -i \n# 输入账号密码进行登录\n```\n\n## 创建APP\n\n`YOURAPPNAME`更改为自己希望设置的名称\n\n```\nflyctl launch --name YOURAPPNAME --image=superseriousbusiness/gotosocial:latest --region hkg --no-deploy\n```\n\n## 创建储存卷\n\n```\nflyctl volumes create social_data --region hkg --size 1\n```\n\n## 编辑配置\n\n编辑根目录下的 `fly.toml` 配置文件,参考下方\n\n```\napp = \"gotos\" ## 自定义名称\nprimary_region = \"hkg\" ##服务器节点,当前为香港\n\n[experimental]\n vm = true\n\n[build]\n image = \"superseriousbusiness/gotosocial:latest\"\n\n[env]\n GTS_DB_ADDRESS = \"/gotosocial/storage/sqlite.db\"\n GTS_DB_TLS_MODE = \"enable\"\n GTS_DB_TYPE = \"sqlite\"\n GTS_HOST = \"GTS的域名\"\n GTS_LETSENCRYPT_ENABLED = \"false\"\n GTS_STORAGE_BACKEND = \"s3\"\n GTS_STORAGE_S3_BUCKET = \"BUCKET名称\"\n GTS_STORAGE_S3_ENDPOINT = \"#S3 API\"\n GTS_STORAGE_S3_ACCESS_KEY = \"#api-tokens\"\n GTS_STORAGE_S3_SECRET_KEY = \"#api-tokens\"\n GTS_STORAGE_S3_PROXY = \"true\"\n # 添加时区为UTC+8\n TZ = \"Asia/Chongqing\"\n\n[[mounts]]\n source = \"social_data\"\n destination = \"/gotosocial/storage\"\n\n[http_service]\n internal_port = 8080\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 1\n processes = [\"app\"]\n```\n\n以上配置中`GTS_STORAGE_S3_ENDPOINT`不需要带`https:`和最后的`/BUCKET名称`\n\n## 部署\n\n```\nflyctl deploy\n```\n\n启动成功后会显示一个URL,能成功访问则代表部署成功。\n\n## 创建用户和管理员\n\n在 `fly.toml `文件目录执行\n\n```\nflyctl ssh console\n```\n\n- 创建用户\n\n```\n/gotosocial/gotosocial admin account create --username YOUR_USERNAME --email YOUR@EMAIL.COM --password 'SOME_VERY_GOOD_PASSWD'\n```\n\n`YOUR_USERNAME`为用户名\n`YOUR@EMAIL.COM`为邮箱\n`SOME_VERY_GOOD_PASSWD`为密码,需设置足够复杂,太简单会提示密码不够安全,需重新设置\n\n- 设置管理员\n\n```\n/gotosocial/gotosocial admin account promote --username YOUR_USERNAME\n```\n\n## 演示\n\nhttps://m.ima.cm\n\nhttps://m.ima.cm/@jkjoy\n\n## 下载数据库\n在 `fly.toml `文件目录执行\n```\nflyctl sftp get /gotosocial/storage/sqlite.db\n```\n","source":"_posts/在fly.io部署Gotosocial.md","raw":"---\ntitle: 在fly.io部署Gotosocial\ncategories:\n - 分享\ntags: \n - Gotosocial\n - fly.io\n - 部署\nabbrlink: 9597b72\ndate: 2023-08-17 18:55:46\n\n---\n\n## 关于Gotosocial\n\nGoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。\n\n## 准备\n\n- 注册 Fly.io 账号,并绑卡(避免滥用);\n- 注册 Cloudflare 并启用 R2,启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。\n\n## 安装 flyctl\n\n- Linux\n\n```\ncurl -L https://fly.io/install.sh | sh\n```\n\n- macOS\n\n```\ncurl -L https://fly.io/install.sh | sh\n```\n\n- Windows,需要开启 RemoteSigned: 管理员运行\n\n```\n Set-ExecutionPolicy -ExecutionPolicy RemoteSigned\n```\n\n```\npowershell -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n\n## 登录\n\n```\nflyctl auth login\n\n# 若登录失败使用\n# flyctl auth login -i \n# 输入账号密码进行登录\n```\n\n## 创建APP\n\n`YOURAPPNAME`更改为自己希望设置的名称\n\n```\nflyctl launch --name YOURAPPNAME --image=superseriousbusiness/gotosocial:latest --region hkg --no-deploy\n```\n\n## 创建储存卷\n\n```\nflyctl volumes create social_data --region hkg --size 1\n```\n\n## 编辑配置\n\n编辑根目录下的 `fly.toml` 配置文件,参考下方\n\n```\napp = \"gotos\" ## 自定义名称\nprimary_region = \"hkg\" ##服务器节点,当前为香港\n\n[experimental]\n vm = true\n\n[build]\n image = \"superseriousbusiness/gotosocial:latest\"\n\n[env]\n GTS_DB_ADDRESS = \"/gotosocial/storage/sqlite.db\"\n GTS_DB_TLS_MODE = \"enable\"\n GTS_DB_TYPE = \"sqlite\"\n GTS_HOST = \"GTS的域名\"\n GTS_LETSENCRYPT_ENABLED = \"false\"\n GTS_STORAGE_BACKEND = \"s3\"\n GTS_STORAGE_S3_BUCKET = \"BUCKET名称\"\n GTS_STORAGE_S3_ENDPOINT = \"#S3 API\"\n GTS_STORAGE_S3_ACCESS_KEY = \"#api-tokens\"\n GTS_STORAGE_S3_SECRET_KEY = \"#api-tokens\"\n GTS_STORAGE_S3_PROXY = \"true\"\n # 添加时区为UTC+8\n TZ = \"Asia/Chongqing\"\n\n[[mounts]]\n source = \"social_data\"\n destination = \"/gotosocial/storage\"\n\n[http_service]\n internal_port = 8080\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 1\n processes = [\"app\"]\n```\n\n以上配置中`GTS_STORAGE_S3_ENDPOINT`不需要带`https:`和最后的`/BUCKET名称`\n\n## 部署\n\n```\nflyctl deploy\n```\n\n启动成功后会显示一个URL,能成功访问则代表部署成功。\n\n## 创建用户和管理员\n\n在 `fly.toml `文件目录执行\n\n```\nflyctl ssh console\n```\n\n- 创建用户\n\n```\n/gotosocial/gotosocial admin account create --username YOUR_USERNAME --email YOUR@EMAIL.COM --password 'SOME_VERY_GOOD_PASSWD'\n```\n\n`YOUR_USERNAME`为用户名\n`YOUR@EMAIL.COM`为邮箱\n`SOME_VERY_GOOD_PASSWD`为密码,需设置足够复杂,太简单会提示密码不够安全,需重新设置\n\n- 设置管理员\n\n```\n/gotosocial/gotosocial admin account promote --username YOUR_USERNAME\n```\n\n## 演示\n\nhttps://m.ima.cm\n\nhttps://m.ima.cm/@jkjoy\n\n## 下载数据库\n在 `fly.toml `文件目录执行\n```\nflyctl sftp get /gotosocial/storage/sqlite.db\n```\n","slug":"在fly.io部署Gotosocial","published":1,"updated":"2023-09-29T07:51:06.388Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh600eaoko02f4m5jpj","content":"

关于Gotosocial

GoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。

\n

准备

    \n
  • 注册 Fly.io 账号,并绑卡(避免滥用);
  • \n
  • 注册 Cloudflare 并启用 R2,启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。
  • \n
\n

安装 flyctl

    \n
  • Linux
  • \n
\n
1
curl -L https://fly.io/install.sh | sh
\n\n
    \n
  • macOS
  • \n
\n
1
curl -L https://fly.io/install.sh | sh
\n\n
    \n
  • Windows,需要开启 RemoteSigned: 管理员运行
  • \n
\n
1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
\n\n
1
powershell -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n\n

登录

1
2
3
4
5
flyctl auth login

# 若登录失败使用
# flyctl auth login -i
# 输入账号密码进行登录
\n\n

创建APP

YOURAPPNAME更改为自己希望设置的名称

\n
1
flyctl launch --name YOURAPPNAME --image=superseriousbusiness/gotosocial:latest --region hkg --no-deploy
\n\n

创建储存卷

1
flyctl volumes create social_data --region hkg --size 1
\n\n

编辑配置

编辑根目录下的 fly.toml 配置文件,参考下方

\n
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
app = "gotos" ## 自定义名称
primary_region = "hkg" ##服务器节点,当前为香港

[experimental]
vm = true

[build]
image = "superseriousbusiness/gotosocial:latest"

[env]
GTS_DB_ADDRESS = "/gotosocial/storage/sqlite.db"
GTS_DB_TLS_MODE = "enable"
GTS_DB_TYPE = "sqlite"
GTS_HOST = "GTS的域名"
GTS_LETSENCRYPT_ENABLED = "false"
GTS_STORAGE_BACKEND = "s3"
GTS_STORAGE_S3_BUCKET = "BUCKET名称"
GTS_STORAGE_S3_ENDPOINT = "#S3 API"
GTS_STORAGE_S3_ACCESS_KEY = "#api-tokens"
GTS_STORAGE_S3_SECRET_KEY = "#api-tokens"
GTS_STORAGE_S3_PROXY = "true"
# 添加时区为UTC+8
TZ = "Asia/Chongqing"

[[mounts]]
source = "social_data"
destination = "/gotosocial/storage"

[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 1
processes = ["app"]
\n\n

以上配置中GTS_STORAGE_S3_ENDPOINT不需要带https:和最后的/BUCKET名称

\n

部署

1
flyctl deploy
\n\n

启动成功后会显示一个URL,能成功访问则代表部署成功。

\n

创建用户和管理员

fly.toml 文件目录执行

\n
1
flyctl ssh console
\n\n
    \n
  • 创建用户
  • \n
\n
1
/gotosocial/gotosocial admin account create --username YOUR_USERNAME --email YOUR@EMAIL.COM --password 'SOME_VERY_GOOD_PASSWD'
\n\n

YOUR_USERNAME为用户名
YOUR@EMAIL.COM为邮箱
SOME_VERY_GOOD_PASSWD为密码,需设置足够复杂,太简单会提示密码不够安全,需重新设置

\n
    \n
  • 设置管理员
  • \n
\n
1
/gotosocial/gotosocial admin account promote --username YOUR_USERNAME
\n\n

演示

https://m.ima.cm

\n

https://m.ima.cm/@jkjoy

\n

下载数据库

fly.toml 文件目录执行

\n
1
flyctl sftp get /gotosocial/storage/sqlite.db
\n","site":{"data":{}},"excerpt":"","more":"

关于Gotosocial

GoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。

\n

准备

    \n
  • 注册 Fly.io 账号,并绑卡(避免滥用);
  • \n
  • 注册 Cloudflare 并启用 R2,启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。
  • \n
\n

安装 flyctl

    \n
  • Linux
  • \n
\n
1
curl -L https://fly.io/install.sh | sh
\n\n
    \n
  • macOS
  • \n
\n
1
curl -L https://fly.io/install.sh | sh
\n\n
    \n
  • Windows,需要开启 RemoteSigned: 管理员运行
  • \n
\n
1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
\n\n
1
powershell -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n\n

登录

1
2
3
4
5
flyctl auth login

# 若登录失败使用
# flyctl auth login -i
# 输入账号密码进行登录
\n\n

创建APP

YOURAPPNAME更改为自己希望设置的名称

\n
1
flyctl launch --name YOURAPPNAME --image=superseriousbusiness/gotosocial:latest --region hkg --no-deploy
\n\n

创建储存卷

1
flyctl volumes create social_data --region hkg --size 1
\n\n

编辑配置

编辑根目录下的 fly.toml 配置文件,参考下方

\n
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
app = "gotos" ## 自定义名称
primary_region = "hkg" ##服务器节点,当前为香港

[experimental]
vm = true

[build]
image = "superseriousbusiness/gotosocial:latest"

[env]
GTS_DB_ADDRESS = "/gotosocial/storage/sqlite.db"
GTS_DB_TLS_MODE = "enable"
GTS_DB_TYPE = "sqlite"
GTS_HOST = "GTS的域名"
GTS_LETSENCRYPT_ENABLED = "false"
GTS_STORAGE_BACKEND = "s3"
GTS_STORAGE_S3_BUCKET = "BUCKET名称"
GTS_STORAGE_S3_ENDPOINT = "#S3 API"
GTS_STORAGE_S3_ACCESS_KEY = "#api-tokens"
GTS_STORAGE_S3_SECRET_KEY = "#api-tokens"
GTS_STORAGE_S3_PROXY = "true"
# 添加时区为UTC+8
TZ = "Asia/Chongqing"

[[mounts]]
source = "social_data"
destination = "/gotosocial/storage"

[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 1
processes = ["app"]
\n\n

以上配置中GTS_STORAGE_S3_ENDPOINT不需要带https:和最后的/BUCKET名称

\n

部署

1
flyctl deploy
\n\n

启动成功后会显示一个URL,能成功访问则代表部署成功。

\n

创建用户和管理员

fly.toml 文件目录执行

\n
1
flyctl ssh console
\n\n
    \n
  • 创建用户
  • \n
\n
1
/gotosocial/gotosocial admin account create --username YOUR_USERNAME --email YOUR@EMAIL.COM --password 'SOME_VERY_GOOD_PASSWD'
\n\n

YOUR_USERNAME为用户名
YOUR@EMAIL.COM为邮箱
SOME_VERY_GOOD_PASSWD为密码,需设置足够复杂,太简单会提示密码不够安全,需重新设置

\n
    \n
  • 设置管理员
  • \n
\n
1
/gotosocial/gotosocial admin account promote --username YOUR_USERNAME
\n\n

演示

https://m.ima.cm

\n

https://m.ima.cm/@jkjoy

\n

下载数据库

fly.toml 文件目录执行

\n
1
flyctl sftp get /gotosocial/storage/sqlite.db
\n"},{"title":"女子","excerpt":"","abbrlink":41745,"date":"2018-10-18T04:45:59.000Z","_content":"(文,璟)\n她一直是清淡寡欲的女子。\n\n失去心潮起伏的力息。\n\n对周遭事物不免疏离傲慢。\n\n难得的释放天真,也无人知晓。她兀自盛放,凋零。\n\n即便得到,也觉乏味至极。\n\n怨念丛生,无以缺口喷薄,便是一再缄默。\n\n在阴暗低湿的房间,导演一出独幕剧,乐此不疲。\n\n她低吟浅唱,谁也不曾听到。\n\n她患得患失,历尽繁华开落。\n\n时常暗自流泪,无声无息,大滴大滴的没入手心。\n \n且不愿与任何人分享这稀薄波动。\n \n曾对死亡惊惧,莫明颤抖,如今也不能从容应对。 \n \n \n念他时,情绪一触即发,失去理智,抽离表情。\n\n喜于自言自语,编撰各种情节哄骗自己。\n\n也是甘心承受,默然相随,换来连绵起伏的生之牵连。\n\n她如此明了这归属,却无处安身。\n\n亦知这追逐,皆是捕风,亦是虚空。 \n\n连夜的梦魇,白昼的欢颜,原是千般累积的记忆。\n\n她深挚情愿,沿途歌声嘹亮。\n\n她看着身边一个个流离的路人,愈是奔弃,愈是离奇。\n\n各自走向了哪里,最后停留在哪里,她默许任何人的离去。\n\n因知道,末途太拥挤,只容得自己。 \n\n对待缺失的记忆,是徘徊于认领与遗失的边界。\n\n白白流失力气。\n\n本来一切就好似透明。\n\n她于是,走失。 \n\n她目睹这场光的损落与重生,渐次麻木迟钝。 \n\n某个瞬间,或许一侧身。便已落泪。","source":"_posts/女子.md","raw":"---\ntitle: 女子\ntags:\n - 女子\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 41745\ndate: 2018-10-18 12:45:59\n---\n(文,璟)\n她一直是清淡寡欲的女子。\n\n失去心潮起伏的力息。\n\n对周遭事物不免疏离傲慢。\n\n难得的释放天真,也无人知晓。她兀自盛放,凋零。\n\n即便得到,也觉乏味至极。\n\n怨念丛生,无以缺口喷薄,便是一再缄默。\n\n在阴暗低湿的房间,导演一出独幕剧,乐此不疲。\n\n她低吟浅唱,谁也不曾听到。\n\n她患得患失,历尽繁华开落。\n\n时常暗自流泪,无声无息,大滴大滴的没入手心。\n \n且不愿与任何人分享这稀薄波动。\n \n曾对死亡惊惧,莫明颤抖,如今也不能从容应对。 \n \n \n念他时,情绪一触即发,失去理智,抽离表情。\n\n喜于自言自语,编撰各种情节哄骗自己。\n\n也是甘心承受,默然相随,换来连绵起伏的生之牵连。\n\n她如此明了这归属,却无处安身。\n\n亦知这追逐,皆是捕风,亦是虚空。 \n\n连夜的梦魇,白昼的欢颜,原是千般累积的记忆。\n\n她深挚情愿,沿途歌声嘹亮。\n\n她看着身边一个个流离的路人,愈是奔弃,愈是离奇。\n\n各自走向了哪里,最后停留在哪里,她默许任何人的离去。\n\n因知道,末途太拥挤,只容得自己。 \n\n对待缺失的记忆,是徘徊于认领与遗失的边界。\n\n白白流失力气。\n\n本来一切就好似透明。\n\n她于是,走失。 \n\n她目睹这场光的损落与重生,渐次麻木迟钝。 \n\n某个瞬间,或许一侧身。便已落泪。","slug":"女子","published":1,"updated":"2023-09-29T07:51:06.389Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh700eeoko0c2cc6kbe","content":"

(文,璟)
她一直是清淡寡欲的女子。

\n

失去心潮起伏的力息。

\n

对周遭事物不免疏离傲慢。

\n

难得的释放天真,也无人知晓。她兀自盛放,凋零。

\n

即便得到,也觉乏味至极。

\n

怨念丛生,无以缺口喷薄,便是一再缄默。

\n

在阴暗低湿的房间,导演一出独幕剧,乐此不疲。

\n

她低吟浅唱,谁也不曾听到。

\n

她患得患失,历尽繁华开落。

\n

时常暗自流泪,无声无息,大滴大滴的没入手心。

\n

且不愿与任何人分享这稀薄波动。

\n

曾对死亡惊惧,莫明颤抖,如今也不能从容应对。

\n

念他时,情绪一触即发,失去理智,抽离表情。

\n

喜于自言自语,编撰各种情节哄骗自己。

\n

也是甘心承受,默然相随,换来连绵起伏的生之牵连。

\n

她如此明了这归属,却无处安身。

\n

亦知这追逐,皆是捕风,亦是虚空。

\n

连夜的梦魇,白昼的欢颜,原是千般累积的记忆。

\n

她深挚情愿,沿途歌声嘹亮。

\n

她看着身边一个个流离的路人,愈是奔弃,愈是离奇。

\n

各自走向了哪里,最后停留在哪里,她默许任何人的离去。

\n

因知道,末途太拥挤,只容得自己。

\n

对待缺失的记忆,是徘徊于认领与遗失的边界。

\n

白白流失力气。

\n

本来一切就好似透明。

\n

她于是,走失。

\n

她目睹这场光的损落与重生,渐次麻木迟钝。

\n

某个瞬间,或许一侧身。便已落泪。

\n","site":{"data":{}},"more":"

(文,璟)
她一直是清淡寡欲的女子。

\n

失去心潮起伏的力息。

\n

对周遭事物不免疏离傲慢。

\n

难得的释放天真,也无人知晓。她兀自盛放,凋零。

\n

即便得到,也觉乏味至极。

\n

怨念丛生,无以缺口喷薄,便是一再缄默。

\n

在阴暗低湿的房间,导演一出独幕剧,乐此不疲。

\n

她低吟浅唱,谁也不曾听到。

\n

她患得患失,历尽繁华开落。

\n

时常暗自流泪,无声无息,大滴大滴的没入手心。

\n

且不愿与任何人分享这稀薄波动。

\n

曾对死亡惊惧,莫明颤抖,如今也不能从容应对。

\n

念他时,情绪一触即发,失去理智,抽离表情。

\n

喜于自言自语,编撰各种情节哄骗自己。

\n

也是甘心承受,默然相随,换来连绵起伏的生之牵连。

\n

她如此明了这归属,却无处安身。

\n

亦知这追逐,皆是捕风,亦是虚空。

\n

连夜的梦魇,白昼的欢颜,原是千般累积的记忆。

\n

她深挚情愿,沿途歌声嘹亮。

\n

她看着身边一个个流离的路人,愈是奔弃,愈是离奇。

\n

各自走向了哪里,最后停留在哪里,她默许任何人的离去。

\n

因知道,末途太拥挤,只容得自己。

\n

对待缺失的记忆,是徘徊于认领与遗失的边界。

\n

白白流失力气。

\n

本来一切就好似透明。

\n

她于是,走失。

\n

她目睹这场光的损落与重生,渐次麻木迟钝。

\n

某个瞬间,或许一侧身。便已落泪。

\n"},{"title":"如何在Fly.io部署typecho","abbrlink":"8084c141","date":"2023-09-05T16:00:00.000Z","cover":null,"_content":" \n## 使用项目\nhttps://github.com/ttys3/typecho-docker\n## 准备工作\n\n- 注册FLY.IO \n用以部署typecho\n\n## 安装flyctl\nInstall flyctl \n以WINDOWS为例\n```\npwsh -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n其他系统请参照官方\n## 新建APP\n初始化\n```\nflyctl launch\n```\n按照提示选择会生成一个FLY.TOML文件\n\n## 编辑FLY.TOML\n添加以下\n```\n# fly.toml app configuration file generated for gotos on 2023-08-12T19:36:14+08:00\n#\n# See https://fly.io/docs/reference/configuration/ for information about how to use this file.\n#\n\napp = \"typecho\"\nprimary_region = \"hkg\"\n\n[experimental]\n vm = true\n\n[build]\n image = \"80x86/typecho:latest\"\n\n[env]\n PHP_MAX_EXECUTION_TIME = 600\n PHP_TZ = \"Asia/Shanghai\"\n \n[[mounts]]\n source = \"typecho_data\"\n destination = \"/data\"\n\n[http_service]\n internal_port = 80\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 1\n processes = [\"app\"]\n```\n## 添加持久卷\n```\nflyctl volumes create typecho_data --region hkg --size 1\n```\n## 部署\n```\nflyctl deploy\n```\n## 演示地址\n\nhttps://avnvu.fly.dev/\n\n","source":"_posts/如何快速在fly.io上部署typecho.md","raw":"---\ntitle: 如何在Fly.io部署typecho\ntags: typecho\ncategories: 分享\nabbrlink: 8084c141\ndate: 2023-09-06 00:00:00\ncover:\n---\n \n## 使用项目\nhttps://github.com/ttys3/typecho-docker\n## 准备工作\n\n- 注册FLY.IO \n用以部署typecho\n\n## 安装flyctl\nInstall flyctl \n以WINDOWS为例\n```\npwsh -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n其他系统请参照官方\n## 新建APP\n初始化\n```\nflyctl launch\n```\n按照提示选择会生成一个FLY.TOML文件\n\n## 编辑FLY.TOML\n添加以下\n```\n# fly.toml app configuration file generated for gotos on 2023-08-12T19:36:14+08:00\n#\n# See https://fly.io/docs/reference/configuration/ for information about how to use this file.\n#\n\napp = \"typecho\"\nprimary_region = \"hkg\"\n\n[experimental]\n vm = true\n\n[build]\n image = \"80x86/typecho:latest\"\n\n[env]\n PHP_MAX_EXECUTION_TIME = 600\n PHP_TZ = \"Asia/Shanghai\"\n \n[[mounts]]\n source = \"typecho_data\"\n destination = \"/data\"\n\n[http_service]\n internal_port = 80\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 1\n processes = [\"app\"]\n```\n## 添加持久卷\n```\nflyctl volumes create typecho_data --region hkg --size 1\n```\n## 部署\n```\nflyctl deploy\n```\n## 演示地址\n\nhttps://avnvu.fly.dev/\n\n","slug":"如何快速在fly.io上部署typecho","published":1,"updated":"2023-09-29T07:51:06.389Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh800ehoko043fs54g2","content":"

使用项目

https://github.com/ttys3/typecho-docker

\n

准备工作

    \n
  • 注册FLY.IO
    用以部署typecho
  • \n
\n

安装flyctl

Install flyctl
以WINDOWS为例

\n
1
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n

其他系统请参照官方

\n

新建APP

初始化

\n
1
flyctl launch
\n

按照提示选择会生成一个FLY.TOML文件

\n

编辑FLY.TOML

添加以下

\n
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
# fly.toml app configuration file generated for gotos on 2023-08-12T19:36:14+08:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#

app = "typecho"
primary_region = "hkg"

[experimental]
vm = true

[build]
image = "80x86/typecho:latest"

[env]
PHP_MAX_EXECUTION_TIME = 600
PHP_TZ = "Asia/Shanghai"

[[mounts]]
source = "typecho_data"
destination = "/data"

[http_service]
internal_port = 80
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 1
processes = ["app"]
\n

添加持久卷

1
flyctl volumes create typecho_data --region hkg --size 1
\n

部署

1
flyctl deploy
\n

演示地址

https://avnvu.fly.dev/

\n","site":{"data":{}},"excerpt":"","more":"

使用项目

https://github.com/ttys3/typecho-docker

\n

准备工作

    \n
  • 注册FLY.IO
    用以部署typecho
  • \n
\n

安装flyctl

Install flyctl
以WINDOWS为例

\n
1
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n

其他系统请参照官方

\n

新建APP

初始化

\n
1
flyctl launch
\n

按照提示选择会生成一个FLY.TOML文件

\n

编辑FLY.TOML

添加以下

\n
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
# fly.toml app configuration file generated for gotos on 2023-08-12T19:36:14+08:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#

app = "typecho"
primary_region = "hkg"

[experimental]
vm = true

[build]
image = "80x86/typecho:latest"

[env]
PHP_MAX_EXECUTION_TIME = 600
PHP_TZ = "Asia/Shanghai"

[[mounts]]
source = "typecho_data"
destination = "/data"

[http_service]
internal_port = 80
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 1
processes = ["app"]
\n

添加持久卷

1
flyctl volumes create typecho_data --region hkg --size 1
\n

部署

1
flyctl deploy
\n

演示地址

https://avnvu.fly.dev/

\n"},{"title":"平安夜","excerpt":"","abbrlink":44545,"date":"2011-12-24T13:33:51.000Z","_content":"\n平安夜、 接近2011的尾声,明日加班。","source":"_posts/平安夜.md","raw":"---\ntitle: 平安夜\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 44545\ndate: 2011-12-24 21:33:51\n---\n\n平安夜、 接近2011的尾声,明日加班。","slug":"平安夜","published":1,"updated":"2023-09-29T07:51:06.390Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyh900ekoko03fm38moi","content":"

平安夜、 接近2011的尾声,明日加班。

\n","site":{"data":{}},"more":"

平安夜、 接近2011的尾声,明日加班。

\n"},{"title":"得之我幸失之我命","excerpt":"","abbrlink":31751,"date":"2017-12-27T02:51:24.000Z","_content":"\n前些时候在相亲微博上认识了一个湖北的妹子。 \n\n人很漂亮,是我喜欢的类型。 \n\n可我总是感觉自己没有太大的动力去追求这个女孩子。 \n\n我自己把原因归咎于自我认知良好。 \n\n换而言之,不够自信。 \n\n实在是觉得自己不够优秀。 \n\n可又很喜欢这个女孩子。 \n\n每天在微信上聊两句。 \n\n总是感觉自己不应该这样。 \n\n有点无所适从。 \n\n我看过很多心灵鸡汤。 \n\n有说如果爱她就给她自由。 \n\n或者祝她幸福此类的。 \n\n我觉得这都是屁话。 \n\n爱是矛盾的。 \n\n有占有,也有奉献。 \n\n两情相悦这种事情是随缘的。 \n\n一见钟情是看脸的。 \n\n说到底我还是为自己不够主动追求女孩子找了个理由。","source":"_posts/得之我幸失之我命.md","raw":"---\ntitle: 得之我幸失之我命\ntags:\n - 爱情\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 31751\ndate: 2017-12-27 10:51:24\n---\n\n前些时候在相亲微博上认识了一个湖北的妹子。 \n\n人很漂亮,是我喜欢的类型。 \n\n可我总是感觉自己没有太大的动力去追求这个女孩子。 \n\n我自己把原因归咎于自我认知良好。 \n\n换而言之,不够自信。 \n\n实在是觉得自己不够优秀。 \n\n可又很喜欢这个女孩子。 \n\n每天在微信上聊两句。 \n\n总是感觉自己不应该这样。 \n\n有点无所适从。 \n\n我看过很多心灵鸡汤。 \n\n有说如果爱她就给她自由。 \n\n或者祝她幸福此类的。 \n\n我觉得这都是屁话。 \n\n爱是矛盾的。 \n\n有占有,也有奉献。 \n\n两情相悦这种事情是随缘的。 \n\n一见钟情是看脸的。 \n\n说到底我还是为自己不够主动追求女孩子找了个理由。","slug":"得之我幸失之我命","published":1,"updated":"2023-09-29T07:51:06.390Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyha00enoko04qe92oak","content":"

前些时候在相亲微博上认识了一个湖北的妹子。

\n

人很漂亮,是我喜欢的类型。

\n

可我总是感觉自己没有太大的动力去追求这个女孩子。

\n

我自己把原因归咎于自我认知良好。

\n

换而言之,不够自信。

\n

实在是觉得自己不够优秀。

\n

可又很喜欢这个女孩子。

\n

每天在微信上聊两句。

\n

总是感觉自己不应该这样。

\n

有点无所适从。

\n

我看过很多心灵鸡汤。

\n

有说如果爱她就给她自由。

\n

或者祝她幸福此类的。

\n

我觉得这都是屁话。

\n

爱是矛盾的。

\n

有占有,也有奉献。

\n

两情相悦这种事情是随缘的。

\n

一见钟情是看脸的。

\n

说到底我还是为自己不够主动追求女孩子找了个理由。

\n","site":{"data":{}},"more":"

前些时候在相亲微博上认识了一个湖北的妹子。

\n

人很漂亮,是我喜欢的类型。

\n

可我总是感觉自己没有太大的动力去追求这个女孩子。

\n

我自己把原因归咎于自我认知良好。

\n

换而言之,不够自信。

\n

实在是觉得自己不够优秀。

\n

可又很喜欢这个女孩子。

\n

每天在微信上聊两句。

\n

总是感觉自己不应该这样。

\n

有点无所适从。

\n

我看过很多心灵鸡汤。

\n

有说如果爱她就给她自由。

\n

或者祝她幸福此类的。

\n

我觉得这都是屁话。

\n

爱是矛盾的。

\n

有占有,也有奉献。

\n

两情相悦这种事情是随缘的。

\n

一见钟情是看脸的。

\n

说到底我还是为自己不够主动追求女孩子找了个理由。

\n"},{"title":"拳头","excerpt":"","abbrlink":56831,"date":"2016-11-12T03:58:08.000Z","_content":"\n拳头才是真理 \n所有的知识都是拳头教会我们的 \n譬如知法守礼 \n譬如如何做一个谦谦君子 \n当你说君子动口不动手时 \n内心是拒绝的 \n只是因为自己没有更强大的拳头 \n所有的规则都是拳头制定的 \n要么使用自己的拳头反抗 \n要么屈服于别人的拳头 \n所以我认为拳头说的是对的 \n拳头是真理","source":"_posts/拳头.md","raw":"---\ntitle: 拳头\ntags:\n - 拳头\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 56831\ndate: 2016-11-12 11:58:08\n---\n\n拳头才是真理 \n所有的知识都是拳头教会我们的 \n譬如知法守礼 \n譬如如何做一个谦谦君子 \n当你说君子动口不动手时 \n内心是拒绝的 \n只是因为自己没有更强大的拳头 \n所有的规则都是拳头制定的 \n要么使用自己的拳头反抗 \n要么屈服于别人的拳头 \n所以我认为拳头说的是对的 \n拳头是真理","slug":"拳头","published":1,"updated":"2023-09-29T07:51:06.391Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhb00eroko0f4qacnho","content":"

拳头才是真理
所有的知识都是拳头教会我们的
譬如知法守礼
譬如如何做一个谦谦君子
当你说君子动口不动手时
内心是拒绝的
只是因为自己没有更强大的拳头
所有的规则都是拳头制定的
要么使用自己的拳头反抗
要么屈服于别人的拳头
所以我认为拳头说的是对的
拳头是真理

\n","site":{"data":{}},"more":"

拳头才是真理
所有的知识都是拳头教会我们的
譬如知法守礼
譬如如何做一个谦谦君子
当你说君子动口不动手时
内心是拒绝的
只是因为自己没有更强大的拳头
所有的规则都是拳头制定的
要么使用自己的拳头反抗
要么屈服于别人的拳头
所以我认为拳头说的是对的
拳头是真理

\n"},{"title":"我们是如何变得平庸","excerpt":"","abbrlink":"953b5667","date":"2016-11-30T04:52:05.000Z","_content":"\n**我们为何渐渐平庸** \n\n我并不清楚别人是如何走向平庸,我只能说说自己。 \n\n我觉得自己就是个平庸的人。\n\n高不成也低不就。\n\n始终厮混在社会的底层。 \n\n我用“混”来形容现在的生活,就是因为自己得过且过的心态。\n\n我曾读过很多心灵鸡汤,也从书中看过很多历史事迹,从媒体上了解过很多成功人士的成功历程。 \n\n而我发现自己不能功成名就只能默默无闻,只是因为自己缺乏毅力,遇事怯懦,而且对现实无能为力,缺少创想。 \n\n我一直都是在走一条大道,大多数人选择亦或者被迫走的路。 \n\n那一少部分人走的小路以及捷径我是没办法见识到。\n\n这跟生长的环境有关。无法改变。\n\n虽然我不相信王侯将相宁有种,可现实如此。 \n\n我觉得向现实低头这是一种很悲观的心态。\n\n也可以理解为这是我为自己寻找的借口。 \n\n我正是这样每天为自己的犯错甚至懒惰找各种借口所以自己才变得越来越平庸。 \n\n谁人不想活得精彩。\n\n成功的人只不过是少数。 \n\n大多数人只是想活着而已。 \n\n嗯,这不过是我的借口罢了。","source":"_posts/我们是如何变得平庸.md","raw":"---\ntitle: 我们是如何变得平庸\ntags:\n - 平庸\n - 我\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 953b5667\ndate: 2016-11-30 12:52:05\n---\n\n**我们为何渐渐平庸** \n\n我并不清楚别人是如何走向平庸,我只能说说自己。 \n\n我觉得自己就是个平庸的人。\n\n高不成也低不就。\n\n始终厮混在社会的底层。 \n\n我用“混”来形容现在的生活,就是因为自己得过且过的心态。\n\n我曾读过很多心灵鸡汤,也从书中看过很多历史事迹,从媒体上了解过很多成功人士的成功历程。 \n\n而我发现自己不能功成名就只能默默无闻,只是因为自己缺乏毅力,遇事怯懦,而且对现实无能为力,缺少创想。 \n\n我一直都是在走一条大道,大多数人选择亦或者被迫走的路。 \n\n那一少部分人走的小路以及捷径我是没办法见识到。\n\n这跟生长的环境有关。无法改变。\n\n虽然我不相信王侯将相宁有种,可现实如此。 \n\n我觉得向现实低头这是一种很悲观的心态。\n\n也可以理解为这是我为自己寻找的借口。 \n\n我正是这样每天为自己的犯错甚至懒惰找各种借口所以自己才变得越来越平庸。 \n\n谁人不想活得精彩。\n\n成功的人只不过是少数。 \n\n大多数人只是想活着而已。 \n\n嗯,这不过是我的借口罢了。","slug":"我们是如何变得平庸","published":1,"updated":"2023-09-29T07:51:06.390Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhb00euoko0fwkeeu7o","content":"

我们为何渐渐平庸

\n

我并不清楚别人是如何走向平庸,我只能说说自己。

\n

我觉得自己就是个平庸的人。

\n

高不成也低不就。

\n

始终厮混在社会的底层。

\n

我用“混”来形容现在的生活,就是因为自己得过且过的心态。

\n

我曾读过很多心灵鸡汤,也从书中看过很多历史事迹,从媒体上了解过很多成功人士的成功历程。

\n

而我发现自己不能功成名就只能默默无闻,只是因为自己缺乏毅力,遇事怯懦,而且对现实无能为力,缺少创想。

\n

我一直都是在走一条大道,大多数人选择亦或者被迫走的路。

\n

那一少部分人走的小路以及捷径我是没办法见识到。

\n

这跟生长的环境有关。无法改变。

\n

虽然我不相信王侯将相宁有种,可现实如此。

\n

我觉得向现实低头这是一种很悲观的心态。

\n

也可以理解为这是我为自己寻找的借口。

\n

我正是这样每天为自己的犯错甚至懒惰找各种借口所以自己才变得越来越平庸。

\n

谁人不想活得精彩。

\n

成功的人只不过是少数。

\n

大多数人只是想活着而已。

\n

嗯,这不过是我的借口罢了。

\n","site":{"data":{}},"more":"

我们为何渐渐平庸

\n

我并不清楚别人是如何走向平庸,我只能说说自己。

\n

我觉得自己就是个平庸的人。

\n

高不成也低不就。

\n

始终厮混在社会的底层。

\n

我用“混”来形容现在的生活,就是因为自己得过且过的心态。

\n

我曾读过很多心灵鸡汤,也从书中看过很多历史事迹,从媒体上了解过很多成功人士的成功历程。

\n

而我发现自己不能功成名就只能默默无闻,只是因为自己缺乏毅力,遇事怯懦,而且对现实无能为力,缺少创想。

\n

我一直都是在走一条大道,大多数人选择亦或者被迫走的路。

\n

那一少部分人走的小路以及捷径我是没办法见识到。

\n

这跟生长的环境有关。无法改变。

\n

虽然我不相信王侯将相宁有种,可现实如此。

\n

我觉得向现实低头这是一种很悲观的心态。

\n

也可以理解为这是我为自己寻找的借口。

\n

我正是这样每天为自己的犯错甚至懒惰找各种借口所以自己才变得越来越平庸。

\n

谁人不想活得精彩。

\n

成功的人只不过是少数。

\n

大多数人只是想活着而已。

\n

嗯,这不过是我的借口罢了。

\n"},{"title":"我的梦想","excerpt":"","abbrlink":"ee2b2a8c","date":"2011-09-05T11:38:13.000Z","_content":"\n我有一个很大的梦想,就是每天都可以睡觉睡到自然醒。 \n\n我有一个小小的幸福,就是每天都可以和我心爱的人一起生活。 \n\n没有烦恼没有争吵。 \n\n我有一个很大的愿望,就是每天都可以听到你们的笑声。 \n\n我有一个小小的心愿,就是每天都可以和我亲爱的人一起生活。 \n\n没有隔阂没有纷扰。 \n\n孟子说,鱼与熊掌不可兼得。 \n\n于是我的梦想无法实现,幸福无法掌握,愿望彻底落空,心愿没有念想。 \n\n我多希望自己可以做到完美。 \n\n有钱有势有车有房。 \n\n我想没有人不希望这样。\n\n这得付出多大的努力才可以? \n\n这得付出多少努力才可以从我这样的情况进化成那样完美的形态? \n\n估计就跟猴子变成人一样得需要漫长的几万年吧。 \n\n我不可能夸夸其谈说努力努力。 \n\n我没有那样锐利的锋芒,没有那冲破一切的精神。 \n\n我只能成为《老男孩》中那平凡到渣的无数人中的其中之一。 \n\n如此。而已。","source":"_posts/我的梦想.md","raw":"---\ntitle: 我的梦想\ntags:\n - 平凡\n - 梦想\n - 生活\n - 生活\n - 老男孩\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: ee2b2a8c\ndate: 2011-09-05 19:38:13\n---\n\n我有一个很大的梦想,就是每天都可以睡觉睡到自然醒。 \n\n我有一个小小的幸福,就是每天都可以和我心爱的人一起生活。 \n\n没有烦恼没有争吵。 \n\n我有一个很大的愿望,就是每天都可以听到你们的笑声。 \n\n我有一个小小的心愿,就是每天都可以和我亲爱的人一起生活。 \n\n没有隔阂没有纷扰。 \n\n孟子说,鱼与熊掌不可兼得。 \n\n于是我的梦想无法实现,幸福无法掌握,愿望彻底落空,心愿没有念想。 \n\n我多希望自己可以做到完美。 \n\n有钱有势有车有房。 \n\n我想没有人不希望这样。\n\n这得付出多大的努力才可以? \n\n这得付出多少努力才可以从我这样的情况进化成那样完美的形态? \n\n估计就跟猴子变成人一样得需要漫长的几万年吧。 \n\n我不可能夸夸其谈说努力努力。 \n\n我没有那样锐利的锋芒,没有那冲破一切的精神。 \n\n我只能成为《老男孩》中那平凡到渣的无数人中的其中之一。 \n\n如此。而已。","slug":"我的梦想","published":1,"updated":"2023-09-29T07:51:06.391Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhc00eyoko0h93khtt7","content":"

我有一个很大的梦想,就是每天都可以睡觉睡到自然醒。

\n

我有一个小小的幸福,就是每天都可以和我心爱的人一起生活。

\n

没有烦恼没有争吵。

\n

我有一个很大的愿望,就是每天都可以听到你们的笑声。

\n

我有一个小小的心愿,就是每天都可以和我亲爱的人一起生活。

\n

没有隔阂没有纷扰。

\n

孟子说,鱼与熊掌不可兼得。

\n

于是我的梦想无法实现,幸福无法掌握,愿望彻底落空,心愿没有念想。

\n

我多希望自己可以做到完美。

\n

有钱有势有车有房。

\n

我想没有人不希望这样。

\n

这得付出多大的努力才可以?

\n

这得付出多少努力才可以从我这样的情况进化成那样完美的形态?

\n

估计就跟猴子变成人一样得需要漫长的几万年吧。

\n

我不可能夸夸其谈说努力努力。

\n

我没有那样锐利的锋芒,没有那冲破一切的精神。

\n

我只能成为《老男孩》中那平凡到渣的无数人中的其中之一。

\n

如此。而已。

\n","site":{"data":{}},"more":"

我有一个很大的梦想,就是每天都可以睡觉睡到自然醒。

\n

我有一个小小的幸福,就是每天都可以和我心爱的人一起生活。

\n

没有烦恼没有争吵。

\n

我有一个很大的愿望,就是每天都可以听到你们的笑声。

\n

我有一个小小的心愿,就是每天都可以和我亲爱的人一起生活。

\n

没有隔阂没有纷扰。

\n

孟子说,鱼与熊掌不可兼得。

\n

于是我的梦想无法实现,幸福无法掌握,愿望彻底落空,心愿没有念想。

\n

我多希望自己可以做到完美。

\n

有钱有势有车有房。

\n

我想没有人不希望这样。

\n

这得付出多大的努力才可以?

\n

这得付出多少努力才可以从我这样的情况进化成那样完美的形态?

\n

估计就跟猴子变成人一样得需要漫长的几万年吧。

\n

我不可能夸夸其谈说努力努力。

\n

我没有那样锐利的锋芒,没有那冲破一切的精神。

\n

我只能成为《老男孩》中那平凡到渣的无数人中的其中之一。

\n

如此。而已。

\n"},{"title":"搬瓦工VPS桌面监控工具BandwagongVPS_controller","excerpt":"","abbrlink":42100,"date":"2018-07-15T04:25:57.000Z","_content":"\n## 预览\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/org/2018/07/2018070802142057.png)\n\n## 使用\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/org/2018/07/2018070802141179.png) 在搬瓦工VPS 管理后台获得 API 填写即可\n\n## 下载地址\n\n[本地下载](https://down.asbid.cn/Windows/BandwagongVPS_controller.exe \"本地下载\")","source":"_posts/搬瓦工VPS桌面监控工具BandwagongVPS-controller.md","raw":"---\ntitle: 搬瓦工VPS桌面监控工具BandwagongVPS_controller\ntags:\n - VPS\n - VPS\n - 搬瓦工\nexcerpt: ''\ncategories:\n - 分享\nabbrlink: 42100\ndate: 2018-07-15 12:25:57\n---\n\n## 预览\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/org/2018/07/2018070802142057.png)\n\n## 使用\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/org/2018/07/2018070802141179.png) 在搬瓦工VPS 管理后台获得 API 填写即可\n\n## 下载地址\n\n[本地下载](https://down.asbid.cn/Windows/BandwagongVPS_controller.exe \"本地下载\")","slug":"搬瓦工VPS桌面监控工具BandwagongVPS-controller","published":1,"updated":"2023-09-29T07:51:06.391Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhf00f1oko0051d659o","content":"

预览

\n

使用

在搬瓦工VPS 管理后台获得 API 填写即可

\n

下载地址

本地下载

\n","site":{"data":{}},"more":"

预览

\n

使用

在搬瓦工VPS 管理后台获得 API 填写即可

\n

下载地址

本地下载

\n"},{"title":"搬瓦工bandwagonhost vps新手使用教程","excerpt":"","abbrlink":7743,"date":"2016-10-28T10:42:44.000Z","_content":"\n## 搬瓦工官网地址无法登陆\n\n目前搬瓦工官网地址无法直接访问,官方给出了镜像地址,请通过镜像地址管理vps。 \n\n官方镜像地址:[http://bwh88.net](http://bwh88.net/aff.php?aff=65816)\n\n## 登入kiwiVM控制面板\n\n买好搬瓦工banwagonhost vps之后,一般会在开通邮件里给出登陆的地址及账号密码,登陆之后会看到如下界面 \n\n点击Services–My Services选项卡,来到如下页面 \n\n点击kiwiVM control panel,进入后台管理界面 \n\n\n## 重装系统\n\n首先在Main Controls 找到 Actions:,并点击stop \n\n然后点击 Install new OS,重装系统,\n这里以debian-6.0-x86为例,选中,点击reload,\n开始重装,很快就会重装好。 \n\n\n## 获取vps远程登录信息\n\n\n这里需要记录vps的ip地址,SSH端口,及系统密码方便我们使用putty远程管理vps。\n 如果不会使用putty,可以参看这篇文章\n [使用putty远程管理vps](https://blog.sunpeiwen.com/linux/shi-yong-putty-yuan-cheng-guan-li-vps-chu-ji/) \n ip地址及SSH端口:在Main Control里可以找到。 \n\n 系统密码: 点击Root Password Modification,系统会生成一串密码,记录下该密码\n\n\n## 更换ip\n\n有时会遇到ip被屏蔽的状况,这是可以考虑换一个ip,换ip的话有两种方法:\n1)向客服提交ticket,让他给你换;\n2)在后台切换。我给大家介绍下怎么自行切换ip。 \n进入到Migrate To another DC,出现如下界面\n\n 值得注意的是它一般有多个机房位置可供切换:亚利桑那(位于西海岸)、洛杉矶(位于西海岸)、弗罗里达、荷兰等。\n 为了达到切换ip的目的,我们可以先切换机房至其他机房,然后再切换回来,这时一般ip就会更换了。\n 切换机房时间很快,而且不会影响到vps里的数据,大可以放心。\n\n 本人使用的就是搬瓦工的VPS\n bbs.xiaoxiao.su","source":"_posts/搬瓦工bandwagonhost-vps新手使用教程.md","raw":"---\ntitle: 搬瓦工bandwagonhost vps新手使用教程\ntags:\n - VPS\n - 搬瓦工\n - 教程\nexcerpt: ''\ncategories:\n - 分享 \nabbrlink: 7743\ndate: 2016-10-28 18:42:44\n---\n\n## 搬瓦工官网地址无法登陆\n\n目前搬瓦工官网地址无法直接访问,官方给出了镜像地址,请通过镜像地址管理vps。 \n\n官方镜像地址:[http://bwh88.net](http://bwh88.net/aff.php?aff=65816)\n\n## 登入kiwiVM控制面板\n\n买好搬瓦工banwagonhost vps之后,一般会在开通邮件里给出登陆的地址及账号密码,登陆之后会看到如下界面 \n\n点击Services–My Services选项卡,来到如下页面 \n\n点击kiwiVM control panel,进入后台管理界面 \n\n\n## 重装系统\n\n首先在Main Controls 找到 Actions:,并点击stop \n\n然后点击 Install new OS,重装系统,\n这里以debian-6.0-x86为例,选中,点击reload,\n开始重装,很快就会重装好。 \n\n\n## 获取vps远程登录信息\n\n\n这里需要记录vps的ip地址,SSH端口,及系统密码方便我们使用putty远程管理vps。\n 如果不会使用putty,可以参看这篇文章\n [使用putty远程管理vps](https://blog.sunpeiwen.com/linux/shi-yong-putty-yuan-cheng-guan-li-vps-chu-ji/) \n ip地址及SSH端口:在Main Control里可以找到。 \n\n 系统密码: 点击Root Password Modification,系统会生成一串密码,记录下该密码\n\n\n## 更换ip\n\n有时会遇到ip被屏蔽的状况,这是可以考虑换一个ip,换ip的话有两种方法:\n1)向客服提交ticket,让他给你换;\n2)在后台切换。我给大家介绍下怎么自行切换ip。 \n进入到Migrate To another DC,出现如下界面\n\n 值得注意的是它一般有多个机房位置可供切换:亚利桑那(位于西海岸)、洛杉矶(位于西海岸)、弗罗里达、荷兰等。\n 为了达到切换ip的目的,我们可以先切换机房至其他机房,然后再切换回来,这时一般ip就会更换了。\n 切换机房时间很快,而且不会影响到vps里的数据,大可以放心。\n\n 本人使用的就是搬瓦工的VPS\n bbs.xiaoxiao.su","slug":"搬瓦工bandwagonhost-vps新手使用教程","published":1,"updated":"2023-09-29T07:51:06.392Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhg00f4oko0c91sbrhj","content":"

搬瓦工官网地址无法登陆

目前搬瓦工官网地址无法直接访问,官方给出了镜像地址,请通过镜像地址管理vps。

\n

官方镜像地址:http://bwh88.net

\n

登入kiwiVM控制面板

买好搬瓦工banwagonhost vps之后,一般会在开通邮件里给出登陆的地址及账号密码,登陆之后会看到如下界面

\n

点击Services–My Services选项卡,来到如下页面

\n

点击kiwiVM control panel,进入后台管理界面

\n

重装系统

首先在Main Controls 找到 Actions:,并点击stop

\n

然后点击 Install new OS,重装系统,
这里以debian-6.0-x86为例,选中,点击reload,
开始重装,很快就会重装好。

\n

获取vps远程登录信息

这里需要记录vps的ip地址,SSH端口,及系统密码方便我们使用putty远程管理vps。
如果不会使用putty,可以参看这篇文章
使用putty远程管理vps
ip地址及SSH端口:在Main Control里可以找到。

\n

系统密码: 点击Root Password Modification,系统会生成一串密码,记录下该密码

\n

更换ip

有时会遇到ip被屏蔽的状况,这是可以考虑换一个ip,换ip的话有两种方法:
1)向客服提交ticket,让他给你换;
2)在后台切换。我给大家介绍下怎么自行切换ip。
进入到Migrate To another DC,出现如下界面

\n

值得注意的是它一般有多个机房位置可供切换:亚利桑那(位于西海岸)、洛杉矶(位于西海岸)、弗罗里达、荷兰等。
为了达到切换ip的目的,我们可以先切换机房至其他机房,然后再切换回来,这时一般ip就会更换了。
切换机房时间很快,而且不会影响到vps里的数据,大可以放心。

\n

本人使用的就是搬瓦工的VPS
bbs.xiaoxiao.su

\n","site":{"data":{}},"more":"

搬瓦工官网地址无法登陆

目前搬瓦工官网地址无法直接访问,官方给出了镜像地址,请通过镜像地址管理vps。

\n

官方镜像地址:http://bwh88.net

\n

登入kiwiVM控制面板

买好搬瓦工banwagonhost vps之后,一般会在开通邮件里给出登陆的地址及账号密码,登陆之后会看到如下界面

\n

点击Services–My Services选项卡,来到如下页面

\n

点击kiwiVM control panel,进入后台管理界面

\n

重装系统

首先在Main Controls 找到 Actions:,并点击stop

\n

然后点击 Install new OS,重装系统,
这里以debian-6.0-x86为例,选中,点击reload,
开始重装,很快就会重装好。

\n

获取vps远程登录信息

这里需要记录vps的ip地址,SSH端口,及系统密码方便我们使用putty远程管理vps。
如果不会使用putty,可以参看这篇文章
使用putty远程管理vps
ip地址及SSH端口:在Main Control里可以找到。

\n

系统密码: 点击Root Password Modification,系统会生成一串密码,记录下该密码

\n

更换ip

有时会遇到ip被屏蔽的状况,这是可以考虑换一个ip,换ip的话有两种方法:
1)向客服提交ticket,让他给你换;
2)在后台切换。我给大家介绍下怎么自行切换ip。
进入到Migrate To another DC,出现如下界面

\n

值得注意的是它一般有多个机房位置可供切换:亚利桑那(位于西海岸)、洛杉矶(位于西海岸)、弗罗里达、荷兰等。
为了达到切换ip的目的,我们可以先切换机房至其他机房,然后再切换回来,这时一般ip就会更换了。
切换机房时间很快,而且不会影响到vps里的数据,大可以放心。

\n

本人使用的就是搬瓦工的VPS
bbs.xiaoxiao.su

\n"},{"title":"新的一年2017","excerpt":"","abbrlink":4388,"date":"2016-12-31T19:33:41.000Z","_content":"\n今天是2017的第一天。 祝大家元旦快乐。 ps感谢小草莓为我申请的阿里云 最近博客所在服务器老是宕机。服务器内存看起来不太够,需要升级了应该。 过完年再换","source":"_posts/新的一年2017.md","raw":"---\ntitle: 新的一年2017\ntags:\n - 元旦\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 4388\ndate: 2017-01-01 03:33:41\n---\n\n今天是2017的第一天。 祝大家元旦快乐。 ps感谢小草莓为我申请的阿里云 最近博客所在服务器老是宕机。服务器内存看起来不太够,需要升级了应该。 过完年再换","slug":"新的一年2017","published":1,"updated":"2023-09-29T07:51:06.392Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhg00f8oko0dpxihe04","content":"

今天是2017的第一天。 祝大家元旦快乐。 ps感谢小草莓为我申请的阿里云 最近博客所在服务器老是宕机。服务器内存看起来不太够,需要升级了应该。 过完年再换

\n","site":{"data":{}},"more":"

今天是2017的第一天。 祝大家元旦快乐。 ps感谢小草莓为我申请的阿里云 最近博客所在服务器老是宕机。服务器内存看起来不太够,需要升级了应该。 过完年再换

\n"},{"title":"杀手,无与伦比的自由","excerpt":"","abbrlink":19765,"date":"2011-08-30T09:17:34.000Z","_content":"\nMR.NEVER DIE的传奇。 当苍叶还是苍叶时,他活得不自由,到哪都有人向他讨债,后来还被关在小厕所里一个星期,所以他渴望自由,所以当苍叶变成“Mr Never Die”时,他在身上刺满各种文字的自由,他讨厌任何会束缚到自己的地方,他住别人的吃别人的随时拍拍屁股走人,不必担心会有何牵挂,他在高楼之间暴走,天地间仿佛没有什么可以阻挡他的自由。非常非常的形式化的自由,越是如此,内心越颠狂,苍叶真的在坠机时彻底“死”了,所以他会活活打死自己前女友,退化成一只拥有异能的狂暴的兽。 他认为自己是不死的人。是一个高级的已经死过的人。\n\n从最初的“阳台上的波斯湾”,“登峰造极的杰作”,“夙兴夜寐的犯罪”,“追逐媒体的犯罪”,“流离寻岸的花”,到如今的“无与伦比的自由”。杀手系列的故事不尽然本本精彩,却总让人期待。记得在杀手铁块那一本的最后,有预告,其一就是MR NEVERDIE,还有杀手,太极,还有一个F。西门曾说过有一个能与G匹敌,是不是F呢,很期待后作。 在《流离寻岸的花》的最后,〈杀手,无与伦比的自由〉号称是要用最剽悍的热血止住眼泪。看罢全文,并没有很热血,更没有想哭泣的欲望,那个预告,于我而言,是打了折扣的。但不可否认,杀手,Mr Never Die仍将成为杀手系列的一个经典。与以往不同的是,小说以直叙为主,把一个原本有点懦弱胆怯的被害人“死”过一次,重生后成为不死传说的疯狂杀手的过程详实的记录了下来。不热血,与《功夫》与《猎命师》比起来真的太不热血了,有的只是疯狂与变态。 杀手界默认的三大法则与职业道德成为此书探讨的重点。不管是杀手,读者还是作者本人,都不满足于只看一个个风格各异的杀手执行任务的点滴过程,事物的本质更为穿透人心。 看着邹哥与九十九在死神餐厅(OR洒吧)里聊着各自手下的几名杀手,聊着业界公认的三大法则与职业道德,心中平端生出几许唏嘘。 死神泰利的大雨夜,十七级超强台风登陆的那一天,很多的事撞在了一起,很缜密的布局,牵涉甚广,刀大运筹帷幄,同时构思N个故事,并且都让每个故事互相影响、发生角色流动,这种跨越许多故事的平行架构能力,除非是万中选一的奇才否则绝对办不到啊! 在那一个白天,杀手月将叶素芬干掉,豺狼与月对决取胜,欧阳盆栽与九十九连手将叛徒小刘干掉。王董被跳楼的猫胎人砸死。晚上,欧阳盆栽登上了豪华邮轮,与赌神一决胜负。是夜,冷面佛与琅铛大仔双双殒命。铁块和小恩的仇得报了,欧阳盆栽和他女友的仇也得报了,不管是邹哥派出去的杀手还是赌神下的单,总之,故事告一段落了。看了后来的再去翻看前面的,会更为佩服九把刀写故事的能力,真是万中选一的奇才啊!环环相扣,几乎没什么破绽。","source":"_posts/杀手,无与伦比的自由.md","raw":"---\ntitle: 杀手,无与伦比的自由\ntags:\n - MR.NEVERDIE\n - 九把刀\n - 无与伦比的自由\n - 杀手\n - 笔记\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 19765\ndate: 2011-08-30 17:17:34\n---\n\nMR.NEVER DIE的传奇。 当苍叶还是苍叶时,他活得不自由,到哪都有人向他讨债,后来还被关在小厕所里一个星期,所以他渴望自由,所以当苍叶变成“Mr Never Die”时,他在身上刺满各种文字的自由,他讨厌任何会束缚到自己的地方,他住别人的吃别人的随时拍拍屁股走人,不必担心会有何牵挂,他在高楼之间暴走,天地间仿佛没有什么可以阻挡他的自由。非常非常的形式化的自由,越是如此,内心越颠狂,苍叶真的在坠机时彻底“死”了,所以他会活活打死自己前女友,退化成一只拥有异能的狂暴的兽。 他认为自己是不死的人。是一个高级的已经死过的人。\n\n从最初的“阳台上的波斯湾”,“登峰造极的杰作”,“夙兴夜寐的犯罪”,“追逐媒体的犯罪”,“流离寻岸的花”,到如今的“无与伦比的自由”。杀手系列的故事不尽然本本精彩,却总让人期待。记得在杀手铁块那一本的最后,有预告,其一就是MR NEVERDIE,还有杀手,太极,还有一个F。西门曾说过有一个能与G匹敌,是不是F呢,很期待后作。 在《流离寻岸的花》的最后,〈杀手,无与伦比的自由〉号称是要用最剽悍的热血止住眼泪。看罢全文,并没有很热血,更没有想哭泣的欲望,那个预告,于我而言,是打了折扣的。但不可否认,杀手,Mr Never Die仍将成为杀手系列的一个经典。与以往不同的是,小说以直叙为主,把一个原本有点懦弱胆怯的被害人“死”过一次,重生后成为不死传说的疯狂杀手的过程详实的记录了下来。不热血,与《功夫》与《猎命师》比起来真的太不热血了,有的只是疯狂与变态。 杀手界默认的三大法则与职业道德成为此书探讨的重点。不管是杀手,读者还是作者本人,都不满足于只看一个个风格各异的杀手执行任务的点滴过程,事物的本质更为穿透人心。 看着邹哥与九十九在死神餐厅(OR洒吧)里聊着各自手下的几名杀手,聊着业界公认的三大法则与职业道德,心中平端生出几许唏嘘。 死神泰利的大雨夜,十七级超强台风登陆的那一天,很多的事撞在了一起,很缜密的布局,牵涉甚广,刀大运筹帷幄,同时构思N个故事,并且都让每个故事互相影响、发生角色流动,这种跨越许多故事的平行架构能力,除非是万中选一的奇才否则绝对办不到啊! 在那一个白天,杀手月将叶素芬干掉,豺狼与月对决取胜,欧阳盆栽与九十九连手将叛徒小刘干掉。王董被跳楼的猫胎人砸死。晚上,欧阳盆栽登上了豪华邮轮,与赌神一决胜负。是夜,冷面佛与琅铛大仔双双殒命。铁块和小恩的仇得报了,欧阳盆栽和他女友的仇也得报了,不管是邹哥派出去的杀手还是赌神下的单,总之,故事告一段落了。看了后来的再去翻看前面的,会更为佩服九把刀写故事的能力,真是万中选一的奇才啊!环环相扣,几乎没什么破绽。","slug":"杀手,无与伦比的自由","published":1,"updated":"2023-09-29T07:51:06.392Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhh00fboko02q2x30mc","content":"

MR.NEVER DIE的传奇。 当苍叶还是苍叶时,他活得不自由,到哪都有人向他讨债,后来还被关在小厕所里一个星期,所以他渴望自由,所以当苍叶变成“Mr Never Die”时,他在身上刺满各种文字的自由,他讨厌任何会束缚到自己的地方,他住别人的吃别人的随时拍拍屁股走人,不必担心会有何牵挂,他在高楼之间暴走,天地间仿佛没有什么可以阻挡他的自由。非常非常的形式化的自由,越是如此,内心越颠狂,苍叶真的在坠机时彻底“死”了,所以他会活活打死自己前女友,退化成一只拥有异能的狂暴的兽。 他认为自己是不死的人。是一个高级的已经死过的人。

\n\n

从最初的“阳台上的波斯湾”,“登峰造极的杰作”,“夙兴夜寐的犯罪”,“追逐媒体的犯罪”,“流离寻岸的花”,到如今的“无与伦比的自由”。杀手系列的故事不尽然本本精彩,却总让人期待。记得在杀手铁块那一本的最后,有预告,其一就是MR NEVERDIE,还有杀手,太极,还有一个F。西门曾说过有一个能与G匹敌,是不是F呢,很期待后作。 在《流离寻岸的花》的最后,〈杀手,无与伦比的自由〉号称是要用最剽悍的热血止住眼泪。看罢全文,并没有很热血,更没有想哭泣的欲望,那个预告,于我而言,是打了折扣的。但不可否认,杀手,Mr Never Die仍将成为杀手系列的一个经典。与以往不同的是,小说以直叙为主,把一个原本有点懦弱胆怯的被害人“死”过一次,重生后成为不死传说的疯狂杀手的过程详实的记录了下来。不热血,与《功夫》与《猎命师》比起来真的太不热血了,有的只是疯狂与变态。 杀手界默认的三大法则与职业道德成为此书探讨的重点。不管是杀手,读者还是作者本人,都不满足于只看一个个风格各异的杀手执行任务的点滴过程,事物的本质更为穿透人心。 看着邹哥与九十九在死神餐厅(OR洒吧)里聊着各自手下的几名杀手,聊着业界公认的三大法则与职业道德,心中平端生出几许唏嘘。 死神泰利的大雨夜,十七级超强台风登陆的那一天,很多的事撞在了一起,很缜密的布局,牵涉甚广,刀大运筹帷幄,同时构思N个故事,并且都让每个故事互相影响、发生角色流动,这种跨越许多故事的平行架构能力,除非是万中选一的奇才否则绝对办不到啊! 在那一个白天,杀手月将叶素芬干掉,豺狼与月对决取胜,欧阳盆栽与九十九连手将叛徒小刘干掉。王董被跳楼的猫胎人砸死。晚上,欧阳盆栽登上了豪华邮轮,与赌神一决胜负。是夜,冷面佛与琅铛大仔双双殒命。铁块和小恩的仇得报了,欧阳盆栽和他女友的仇也得报了,不管是邹哥派出去的杀手还是赌神下的单,总之,故事告一段落了。看了后来的再去翻看前面的,会更为佩服九把刀写故事的能力,真是万中选一的奇才啊!环环相扣,几乎没什么破绽。

\n","site":{"data":{}},"more":"

MR.NEVER DIE的传奇。 当苍叶还是苍叶时,他活得不自由,到哪都有人向他讨债,后来还被关在小厕所里一个星期,所以他渴望自由,所以当苍叶变成“Mr Never Die”时,他在身上刺满各种文字的自由,他讨厌任何会束缚到自己的地方,他住别人的吃别人的随时拍拍屁股走人,不必担心会有何牵挂,他在高楼之间暴走,天地间仿佛没有什么可以阻挡他的自由。非常非常的形式化的自由,越是如此,内心越颠狂,苍叶真的在坠机时彻底“死”了,所以他会活活打死自己前女友,退化成一只拥有异能的狂暴的兽。 他认为自己是不死的人。是一个高级的已经死过的人。

\n\n

从最初的“阳台上的波斯湾”,“登峰造极的杰作”,“夙兴夜寐的犯罪”,“追逐媒体的犯罪”,“流离寻岸的花”,到如今的“无与伦比的自由”。杀手系列的故事不尽然本本精彩,却总让人期待。记得在杀手铁块那一本的最后,有预告,其一就是MR NEVERDIE,还有杀手,太极,还有一个F。西门曾说过有一个能与G匹敌,是不是F呢,很期待后作。 在《流离寻岸的花》的最后,〈杀手,无与伦比的自由〉号称是要用最剽悍的热血止住眼泪。看罢全文,并没有很热血,更没有想哭泣的欲望,那个预告,于我而言,是打了折扣的。但不可否认,杀手,Mr Never Die仍将成为杀手系列的一个经典。与以往不同的是,小说以直叙为主,把一个原本有点懦弱胆怯的被害人“死”过一次,重生后成为不死传说的疯狂杀手的过程详实的记录了下来。不热血,与《功夫》与《猎命师》比起来真的太不热血了,有的只是疯狂与变态。 杀手界默认的三大法则与职业道德成为此书探讨的重点。不管是杀手,读者还是作者本人,都不满足于只看一个个风格各异的杀手执行任务的点滴过程,事物的本质更为穿透人心。 看着邹哥与九十九在死神餐厅(OR洒吧)里聊着各自手下的几名杀手,聊着业界公认的三大法则与职业道德,心中平端生出几许唏嘘。 死神泰利的大雨夜,十七级超强台风登陆的那一天,很多的事撞在了一起,很缜密的布局,牵涉甚广,刀大运筹帷幄,同时构思N个故事,并且都让每个故事互相影响、发生角色流动,这种跨越许多故事的平行架构能力,除非是万中选一的奇才否则绝对办不到啊! 在那一个白天,杀手月将叶素芬干掉,豺狼与月对决取胜,欧阳盆栽与九十九连手将叛徒小刘干掉。王董被跳楼的猫胎人砸死。晚上,欧阳盆栽登上了豪华邮轮,与赌神一决胜负。是夜,冷面佛与琅铛大仔双双殒命。铁块和小恩的仇得报了,欧阳盆栽和他女友的仇也得报了,不管是邹哥派出去的杀手还是赌神下的单,总之,故事告一段落了。看了后来的再去翻看前面的,会更为佩服九把刀写故事的能力,真是万中选一的奇才啊!环环相扣,几乎没什么破绽。

\n"},{"abbrlink":"8828c81e","date":"2023-06-13T06:25:30.714Z","excerpt":"...","title":"给Memos添加Artalk评论","updated":"2023-09-29T07:51:06.393Z","cover":null,"_content":"上文提到\n[给Memos添加Twikoo评论](/2023/507a5d86.html)\n\n\n2023.9.26更新提醒: memos升级到0.15.1后版本,本方法失效\n## 自定义脚本\n\n```\n// Artalk comments 2023.8.15更新\n// 用 JS 向页面中插入 JS\nfunction addArtalkJS() { \n var memosArtalk = document.createElement(\"script\");\n memosArtalk.src = `https://unpkg.com/artalk/dist/Artalk.js`;\n var artakPos = document.getElementsByTagName(\"script\")[0];\n artakPos.parentNode.insertBefore(memosArtalk, artakPos);\n};\n// div\nfunction startArtalk() {\n start = setInterval(function(){\n var artalkDom = document.getElementById('Comments') || '';\n var memoAt = document.querySelector('.memo-wrapper') || '';\n var memoLoading = document.querySelector('.action-button-container') || '';\n var memoLoadingA = document.querySelector('.action-button-container a') || '';\n if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && memoLoadingA){\n memoLoading.innerHTML = \"评论加载中……\"\n }\n if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && !artalkDom){\n addArtalkJS()\n if(memoAt){\n clearInterval(start)\n var cssLink = document.createElement(\"link\");\n cssLink.rel = \"stylesheet\";\n cssLink.href = \"https://unpkg.com/artalk/dist/Artalk.css\";\n document.head.appendChild(cssLink);\n memoAt.insertAdjacentHTML('afterend', '
');\n setTimeout(function() {\n Artalk.init({\n el: '#Comments',\n pageKey: location.pathname,\n pageTitle: document.title,\n server: 'https://atim.fly.dev',\n site: 'memos',\n darkMode: 'auto'\n });\n Artalk.on('list-loaded', function() {\n // console.log('评论加载完成');\n memoLoading.innerHTML = ''\n startArtalk();\n });\n }, 1000);\n }\n }\n //console.log(window.location.href);\n }, 1000)\n}\nstartArtalk();\n```\n\n## 自定义样式\n\n```\na.time-text:after { content: ' 评论 💬 '; }\n.atk-main-editor { margin-top: 20px; }\n\n```\n","source":"_posts/给Memos添加Artalk评论.md","raw":"---\nabbrlink: 8828c81e\ncategories:\n - - 分享\ndate: '2023-06-13T14:25:30.714383+08:00'\nexcerpt: ...\ntags:\n - Memos\ntitle: 给Memos添加Artalk评论\nupdated: '2023-8-13T14:28:41.53+8:0'\ncover:\n---\n上文提到\n[给Memos添加Twikoo评论](/2023/507a5d86.html)\n\n\n2023.9.26更新提醒: memos升级到0.15.1后版本,本方法失效\n## 自定义脚本\n\n```\n// Artalk comments 2023.8.15更新\n// 用 JS 向页面中插入 JS\nfunction addArtalkJS() { \n var memosArtalk = document.createElement(\"script\");\n memosArtalk.src = `https://unpkg.com/artalk/dist/Artalk.js`;\n var artakPos = document.getElementsByTagName(\"script\")[0];\n artakPos.parentNode.insertBefore(memosArtalk, artakPos);\n};\n// div\nfunction startArtalk() {\n start = setInterval(function(){\n var artalkDom = document.getElementById('Comments') || '';\n var memoAt = document.querySelector('.memo-wrapper') || '';\n var memoLoading = document.querySelector('.action-button-container') || '';\n var memoLoadingA = document.querySelector('.action-button-container a') || '';\n if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && memoLoadingA){\n memoLoading.innerHTML = \"评论加载中……\"\n }\n if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && !artalkDom){\n addArtalkJS()\n if(memoAt){\n clearInterval(start)\n var cssLink = document.createElement(\"link\");\n cssLink.rel = \"stylesheet\";\n cssLink.href = \"https://unpkg.com/artalk/dist/Artalk.css\";\n document.head.appendChild(cssLink);\n memoAt.insertAdjacentHTML('afterend', '
');\n setTimeout(function() {\n Artalk.init({\n el: '#Comments',\n pageKey: location.pathname,\n pageTitle: document.title,\n server: 'https://atim.fly.dev',\n site: 'memos',\n darkMode: 'auto'\n });\n Artalk.on('list-loaded', function() {\n // console.log('评论加载完成');\n memoLoading.innerHTML = ''\n startArtalk();\n });\n }, 1000);\n }\n }\n //console.log(window.location.href);\n }, 1000)\n}\nstartArtalk();\n```\n\n## 自定义样式\n\n```\na.time-text:after { content: ' 评论 💬 '; }\n.atk-main-editor { margin-top: 20px; }\n\n```\n","slug":"给Memos添加Artalk评论","published":1,"comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhh00ffoko0fofe62zd","content":"

上文提到
给Memos添加Twikoo评论

\n

2023.9.26更新提醒: memos升级到0.15.1后版本,本方法失效

\n

自定义脚本

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
// Artalk comments 2023.8.15更新
// 用 JS 向页面中插入 JS
function addArtalkJS() {
var memosArtalk = document.createElement("script");
memosArtalk.src = `https://unpkg.com/artalk/dist/Artalk.js`;
var artakPos = document.getElementsByTagName("script")[0];
artakPos.parentNode.insertBefore(memosArtalk, artakPos);
};
// div
function startArtalk() {
start = setInterval(function(){
var artalkDom = document.getElementById('Comments') || '';
var memoAt = document.querySelector('.memo-wrapper') || '';
var memoLoading = document.querySelector('.action-button-container') || '';
var memoLoadingA = document.querySelector('.action-button-container a') || '';
if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && memoLoadingA){
memoLoading.innerHTML = "评论加载中……"
}
if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && !artalkDom){
addArtalkJS()
if(memoAt){
clearInterval(start)
var cssLink = document.createElement("link");
cssLink.rel = "stylesheet";
cssLink.href = "https://unpkg.com/artalk/dist/Artalk.css";
document.head.appendChild(cssLink);
memoAt.insertAdjacentHTML('afterend', '<div id="Comments"></div>');
setTimeout(function() {
Artalk.init({
el: '#Comments',
pageKey: location.pathname,
pageTitle: document.title,
server: 'https://atim.fly.dev',
site: 'memos',
darkMode: 'auto'
});
Artalk.on('list-loaded', function() {
// console.log('评论加载完成');
memoLoading.innerHTML = ''
startArtalk();
});
}, 1000);
}
}
//console.log(window.location.href);
}, 1000)
}
startArtalk();
\n\n

自定义样式

1
2
3
a.time-text:after { content: '   评论 💬 '; }
.atk-main-editor { margin-top: 20px; }

\n","site":{"data":{}},"more":"

上文提到
给Memos添加Twikoo评论

\n

2023.9.26更新提醒: memos升级到0.15.1后版本,本方法失效

\n

自定义脚本

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
// Artalk comments 2023.8.15更新
// 用 JS 向页面中插入 JS
function addArtalkJS() {
var memosArtalk = document.createElement("script");
memosArtalk.src = `https://unpkg.com/artalk/dist/Artalk.js`;
var artakPos = document.getElementsByTagName("script")[0];
artakPos.parentNode.insertBefore(memosArtalk, artakPos);
};
// div
function startArtalk() {
start = setInterval(function(){
var artalkDom = document.getElementById('Comments') || '';
var memoAt = document.querySelector('.memo-wrapper') || '';
var memoLoading = document.querySelector('.action-button-container') || '';
var memoLoadingA = document.querySelector('.action-button-container a') || '';
if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && memoLoadingA){
memoLoading.innerHTML = "评论加载中……"
}
if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && !artalkDom){
addArtalkJS()
if(memoAt){
clearInterval(start)
var cssLink = document.createElement("link");
cssLink.rel = "stylesheet";
cssLink.href = "https://unpkg.com/artalk/dist/Artalk.css";
document.head.appendChild(cssLink);
memoAt.insertAdjacentHTML('afterend', '<div id="Comments"></div>');
setTimeout(function() {
Artalk.init({
el: '#Comments',
pageKey: location.pathname,
pageTitle: document.title,
server: 'https://atim.fly.dev',
site: 'memos',
darkMode: 'auto'
});
Artalk.on('list-loaded', function() {
// console.log('评论加载完成');
memoLoading.innerHTML = ''
startArtalk();
});
}, 1000);
}
}
//console.log(window.location.href);
}, 1000)
}
startArtalk();
\n\n

自定义样式

1
2
3
a.time-text:after { content: '   评论 💬 '; }
.atk-main-editor { margin-top: 20px; }

\n"},{"title":"现实就是这么现实","excerpt":"","abbrlink":53315,"date":"2011-08-06T09:20:54.000Z","_content":"\n我今年24了,属于大龄未婚青年了。\n\n 在我们村子里这都属于奇闻轶事了。\n \n 就是在那样一个仍然有封建思想残留的小村子里,我已然年迈的父亲找人说媒给我安排了相亲。\n \n相亲不是今年才流行来的,而是一直从遥远到不知道什么朝代流传下来的。\n \n我的老一辈,我的同辈,甚至我的小辈都注定要把这个模式延续下去。 \n \n在父母的催说下我开始了我纠结的相亲之路。 \n \n相亲是现实的,他关系到婚姻,他关系到子孙后代,他关系到家族兴旺,他关系到历史更迭。\n \n是这样的。我没有任何夸张。 \n \n相亲的过程是矛盾而纠结的,有新鲜刺激,有仓皇失措。 \n \n我总得找一个我喜欢的人来相爱来相守来相伴到死吧。\n \n所以,尽管我相亲的数量在增加但成功率一直没有丝毫见涨。 \n \n我很灰心。总结起来有如下几点我没有做到。 \n \n第一、彩礼。如今的我没有积蓄没有任何突出的收入。如何能拿出近10W的礼金? \n \n第二、房子。我没有丝毫的信心在我死之前可以买到一套房。 \n \n第三、车。四个轮子的车没有。车马炮的车倒是有。 \n \n第四、事业。糊口可以富足就永远也谈不上。 \n \n就是这样的现实。\n \n相亲就是在这样的问题问答当中开始又结束。 \n \n仓促的见面又仓促的各奔东西,在各自的记忆中丝毫不会留下半分的印象。 \n \n这个社会理想永远是遥远的不可实现的。 \n \n就是这么的现实。 \n \n今天是七夕。\n \n祝福大家有情人终究分手。有钱人终成眷属。","source":"_posts/现实就是这么现实.md","raw":"---\ntitle: 现实就是这么现实\ntags:\n - 七夕\n - 情人节\n - 现实\n - 生活\n - 相亲\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 53315\ndate: 2011-08-06 17:20:54\n---\n\n我今年24了,属于大龄未婚青年了。\n\n 在我们村子里这都属于奇闻轶事了。\n \n 就是在那样一个仍然有封建思想残留的小村子里,我已然年迈的父亲找人说媒给我安排了相亲。\n \n相亲不是今年才流行来的,而是一直从遥远到不知道什么朝代流传下来的。\n \n我的老一辈,我的同辈,甚至我的小辈都注定要把这个模式延续下去。 \n \n在父母的催说下我开始了我纠结的相亲之路。 \n \n相亲是现实的,他关系到婚姻,他关系到子孙后代,他关系到家族兴旺,他关系到历史更迭。\n \n是这样的。我没有任何夸张。 \n \n相亲的过程是矛盾而纠结的,有新鲜刺激,有仓皇失措。 \n \n我总得找一个我喜欢的人来相爱来相守来相伴到死吧。\n \n所以,尽管我相亲的数量在增加但成功率一直没有丝毫见涨。 \n \n我很灰心。总结起来有如下几点我没有做到。 \n \n第一、彩礼。如今的我没有积蓄没有任何突出的收入。如何能拿出近10W的礼金? \n \n第二、房子。我没有丝毫的信心在我死之前可以买到一套房。 \n \n第三、车。四个轮子的车没有。车马炮的车倒是有。 \n \n第四、事业。糊口可以富足就永远也谈不上。 \n \n就是这样的现实。\n \n相亲就是在这样的问题问答当中开始又结束。 \n \n仓促的见面又仓促的各奔东西,在各自的记忆中丝毫不会留下半分的印象。 \n \n这个社会理想永远是遥远的不可实现的。 \n \n就是这么的现实。 \n \n今天是七夕。\n \n祝福大家有情人终究分手。有钱人终成眷属。","slug":"现实就是这么现实","published":1,"updated":"2023-09-29T07:51:06.392Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhi00fioko0d3mecfeg","content":"

我今年24了,属于大龄未婚青年了。

\n

在我们村子里这都属于奇闻轶事了。

\n

就是在那样一个仍然有封建思想残留的小村子里,我已然年迈的父亲找人说媒给我安排了相亲。

\n

相亲不是今年才流行来的,而是一直从遥远到不知道什么朝代流传下来的。

\n

我的老一辈,我的同辈,甚至我的小辈都注定要把这个模式延续下去。

\n

在父母的催说下我开始了我纠结的相亲之路。

\n

相亲是现实的,他关系到婚姻,他关系到子孙后代,他关系到家族兴旺,他关系到历史更迭。

\n

是这样的。我没有任何夸张。

\n

相亲的过程是矛盾而纠结的,有新鲜刺激,有仓皇失措。

\n

我总得找一个我喜欢的人来相爱来相守来相伴到死吧。

\n

所以,尽管我相亲的数量在增加但成功率一直没有丝毫见涨。

\n

我很灰心。总结起来有如下几点我没有做到。

\n

第一、彩礼。如今的我没有积蓄没有任何突出的收入。如何能拿出近10W的礼金?

\n

第二、房子。我没有丝毫的信心在我死之前可以买到一套房。

\n

第三、车。四个轮子的车没有。车马炮的车倒是有。

\n

第四、事业。糊口可以富足就永远也谈不上。

\n

就是这样的现实。

\n

相亲就是在这样的问题问答当中开始又结束。

\n

仓促的见面又仓促的各奔东西,在各自的记忆中丝毫不会留下半分的印象。

\n

这个社会理想永远是遥远的不可实现的。

\n

就是这么的现实。

\n

今天是七夕。

\n

祝福大家有情人终究分手。有钱人终成眷属。

\n","site":{"data":{}},"more":"

我今年24了,属于大龄未婚青年了。

\n

在我们村子里这都属于奇闻轶事了。

\n

就是在那样一个仍然有封建思想残留的小村子里,我已然年迈的父亲找人说媒给我安排了相亲。

\n

相亲不是今年才流行来的,而是一直从遥远到不知道什么朝代流传下来的。

\n

我的老一辈,我的同辈,甚至我的小辈都注定要把这个模式延续下去。

\n

在父母的催说下我开始了我纠结的相亲之路。

\n

相亲是现实的,他关系到婚姻,他关系到子孙后代,他关系到家族兴旺,他关系到历史更迭。

\n

是这样的。我没有任何夸张。

\n

相亲的过程是矛盾而纠结的,有新鲜刺激,有仓皇失措。

\n

我总得找一个我喜欢的人来相爱来相守来相伴到死吧。

\n

所以,尽管我相亲的数量在增加但成功率一直没有丝毫见涨。

\n

我很灰心。总结起来有如下几点我没有做到。

\n

第一、彩礼。如今的我没有积蓄没有任何突出的收入。如何能拿出近10W的礼金?

\n

第二、房子。我没有丝毫的信心在我死之前可以买到一套房。

\n

第三、车。四个轮子的车没有。车马炮的车倒是有。

\n

第四、事业。糊口可以富足就永远也谈不上。

\n

就是这样的现实。

\n

相亲就是在这样的问题问答当中开始又结束。

\n

仓促的见面又仓促的各奔东西,在各自的记忆中丝毫不会留下半分的印象。

\n

这个社会理想永远是遥远的不可实现的。

\n

就是这么的现实。

\n

今天是七夕。

\n

祝福大家有情人终究分手。有钱人终成眷属。

\n"},{"title":"编译AppleALC出现错误","excerpt":"","abbrlink":7142,"date":"2022-05-28T23:01:10.000Z","_content":"\n> In subcomponent: /Users/admin/Library/Developer/Xcode/DerivedData/AppleALC-fqueikknxpxowubueomyyxuwlnmg/Build/Products/Debug/AppleALC.kext/Contents/PlugIns/PinConfigs.kext/Contents/Info.plist.md5 Command CodeSign failed with a nonzero exit code\n\n解决办法\n\nOther Code Signing Flags添加参数--deep","source":"_posts/编译AppleALC出现错误.md","raw":"---\ntitle: 编译AppleALC出现错误\ntags:\n - AppleALC\n - macOS\n - xcode\n - 笔记\nexcerpt: ''\ncategories:\n - 分享 \nabbrlink: 7142\ndate: 2022-05-29 07:01:10\n---\n\n> In subcomponent: /Users/admin/Library/Developer/Xcode/DerivedData/AppleALC-fqueikknxpxowubueomyyxuwlnmg/Build/Products/Debug/AppleALC.kext/Contents/PlugIns/PinConfigs.kext/Contents/Info.plist.md5 Command CodeSign failed with a nonzero exit code\n\n解决办法\n\nOther Code Signing Flags添加参数--deep","slug":"编译AppleALC出现错误","published":1,"updated":"2023-09-29T07:51:06.397Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhi00fmoko0b6jtb4fq","content":"
\n

In subcomponent: /Users/admin/Library/Developer/Xcode/DerivedData/AppleALC-fqueikknxpxowubueomyyxuwlnmg/Build/Products/Debug/AppleALC.kext/Contents/PlugIns/PinConfigs.kext/Contents/Info.plist.md5 Command CodeSign failed with a nonzero exit code

\n
\n

解决办法

\n

Other Code Signing Flags添加参数–deep

\n","site":{"data":{}},"more":"
\n

In subcomponent: /Users/admin/Library/Developer/Xcode/DerivedData/AppleALC-fqueikknxpxowubueomyyxuwlnmg/Build/Products/Debug/AppleALC.kext/Contents/PlugIns/PinConfigs.kext/Contents/Info.plist.md5 Command CodeSign failed with a nonzero exit code

\n
\n

解决办法

\n

Other Code Signing Flags添加参数–deep

\n"},{"abbrlink":"507a5d86","date":"2023-06-13T05:40:54.534Z","excerpt":"...","title":"给Memos添加Twikoo评论","updated":"2023-09-29T07:51:06.393Z","cover":null,"_content":"2023.9.26 更新.memos升级0.15.1版本后无法使用\n\n代码来自于@[林木木](https://immmmm.com/memos-with-twikoo/)\n\n## 自定义脚本\n\n```json\n//添加 twikoo 评论 v2023.06.10\nvar twikooENV = 'https://twikoo.jiong.us/'\nfunction addTwikooJS() { \n var memosTwikoo = document.createElement(\"script\");\n memosTwikoo.src = `https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js`;\n var tws = document.getElementsByTagName(\"script\")[0];\n tws.parentNode.insertBefore(memosTwikoo, tws);\n};\nfunction addComIcon(){\n var memoTwIcons = document.querySelectorAll('.time-text') || '';\n if(memoTwIcons){\n for(var i=0;i < memoTwIcons.length;i++){\n //if(memoTwIcon[i].hasChildNodes == false){\n memoTwIcons[i].insertAdjacentHTML('afterbegin', '
');\n //}\n }\n }\n};\nfunction startTwikoo() {\n start = setInterval(function(){\n var twikooDom = document.getElementById('twikoo') || '';\n var memoTw = document.querySelector('.memo-wrapper') || '';\n var memoLoading = document.querySelector('.action-button-container') || '';\n var memoLoadingA = document.querySelector('.action-button-container a') || '';\n var memoTwIcons = document.querySelectorAll('.time-text .twicon') || '';\n var nowHref = window.location.href;\n if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && memoLoadingA){\n memoLoading.innerHTML = \"评论加载中……\"\n }\n if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && !twikooDom){\n addTwikooJS()\n if(memoTw){\n clearInterval(start)\n memoTw.insertAdjacentHTML('afterend', '
');\n setTimeout(function() {\n twikoo.init({\n envId: twikooENV,\n el: '#mtcomment',\n path: nowHref.replace(/^(.*\\/m\\/[0-9]+).*$/,'$1'),\n onCommentLoaded: function () {\n //console.log('评论加载完成');\n memoLoading.innerHTML = ''\n startTwikoo()\n }\n })\n }, 1000)\n }\n }\n if(nowHref.replace(/^.*\\/(explore).*$/,'$1') == \"explore\" || nowHref.replace(/^.*\\/(u).*$/,'$1') == \"u\"){\n memoTwIcons.forEach(memoTwIcon => {memoTwIcon.remove();});\n addComIcon()\n //console.log('图标添加成功');\n }\n //console.log(window.location.href);\n }, 1000)\n}\nstartTwikoo();\n```\n\n## 自定义样式\n\n```\n#twikoo{padding: 1rem;background-color: rgb(63,63,70);margin: 1rem 0;border-radius: .5rem;color: #fff !important;}\n.twicon{position: absolute;right: 1rem;}\n.btns-container.space-x-2{margin-right:1.5rem;}\n.action-button-container{color: #e5e7eb;}\n.action-button-container a{display:none !important;}\n```","source":"_posts/给Memos添加Twikoo评论.md","raw":"---\nabbrlink: 507a5d86\ncategories:\n - - 分享\ndate: '2023-06-13T13:40:54.534656+08:00'\nexcerpt: ...\ntags:\n - Memos\n - Twikoo\ntitle: 给Memos添加Twikoo评论\nupdated: '2023-6-13T13:53:48.150+8:0'\ncover:\n---\n2023.9.26 更新.memos升级0.15.1版本后无法使用\n\n代码来自于@[林木木](https://immmmm.com/memos-with-twikoo/)\n\n## 自定义脚本\n\n```json\n//添加 twikoo 评论 v2023.06.10\nvar twikooENV = 'https://twikoo.jiong.us/'\nfunction addTwikooJS() { \n var memosTwikoo = document.createElement(\"script\");\n memosTwikoo.src = `https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js`;\n var tws = document.getElementsByTagName(\"script\")[0];\n tws.parentNode.insertBefore(memosTwikoo, tws);\n};\nfunction addComIcon(){\n var memoTwIcons = document.querySelectorAll('.time-text') || '';\n if(memoTwIcons){\n for(var i=0;i < memoTwIcons.length;i++){\n //if(memoTwIcon[i].hasChildNodes == false){\n memoTwIcons[i].insertAdjacentHTML('afterbegin', '
');\n //}\n }\n }\n};\nfunction startTwikoo() {\n start = setInterval(function(){\n var twikooDom = document.getElementById('twikoo') || '';\n var memoTw = document.querySelector('.memo-wrapper') || '';\n var memoLoading = document.querySelector('.action-button-container') || '';\n var memoLoadingA = document.querySelector('.action-button-container a') || '';\n var memoTwIcons = document.querySelectorAll('.time-text .twicon') || '';\n var nowHref = window.location.href;\n if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && memoLoadingA){\n memoLoading.innerHTML = \"评论加载中……\"\n }\n if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && !twikooDom){\n addTwikooJS()\n if(memoTw){\n clearInterval(start)\n memoTw.insertAdjacentHTML('afterend', '
');\n setTimeout(function() {\n twikoo.init({\n envId: twikooENV,\n el: '#mtcomment',\n path: nowHref.replace(/^(.*\\/m\\/[0-9]+).*$/,'$1'),\n onCommentLoaded: function () {\n //console.log('评论加载完成');\n memoLoading.innerHTML = ''\n startTwikoo()\n }\n })\n }, 1000)\n }\n }\n if(nowHref.replace(/^.*\\/(explore).*$/,'$1') == \"explore\" || nowHref.replace(/^.*\\/(u).*$/,'$1') == \"u\"){\n memoTwIcons.forEach(memoTwIcon => {memoTwIcon.remove();});\n addComIcon()\n //console.log('图标添加成功');\n }\n //console.log(window.location.href);\n }, 1000)\n}\nstartTwikoo();\n```\n\n## 自定义样式\n\n```\n#twikoo{padding: 1rem;background-color: rgb(63,63,70);margin: 1rem 0;border-radius: .5rem;color: #fff !important;}\n.twicon{position: absolute;right: 1rem;}\n.btns-container.space-x-2{margin-right:1.5rem;}\n.action-button-container{color: #e5e7eb;}\n.action-button-container a{display:none !important;}\n```","slug":"给Memos添加Twikoo评论","published":1,"comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhi00fpoko08kqtatpb","content":"

2023.9.26 更新.memos升级0.15.1版本后无法使用

\n

代码来自于@林木木

\n

自定义脚本

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
//添加 twikoo 评论 v2023.06.10
var twikooENV = 'https://twikoo.jiong.us/'
function addTwikooJS() {
var memosTwikoo = document.createElement("script");
memosTwikoo.src = `https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js`;
var tws = document.getElementsByTagName("script")[0];
tws.parentNode.insertBefore(memosTwikoo, tws);
};
function addComIcon(){
var memoTwIcons = document.querySelectorAll('.time-text') || '';
if(memoTwIcons){
for(var i=0;i < memoTwIcons.length;i++){
//if(memoTwIcon[i].hasChildNodes == false){
memoTwIcons[i].insertAdjacentHTML('afterbegin', '<div class="twicon"><svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M896 138.667H128c-38.4 0-64 25.6-64 64v544c0 38.4 25.6 64 64 64h128v128c83.2 0 166.4-44.8 256-128h384c38.4 0 64-25.6 64-64v-544c0-38.4-25.6-64-64-64zm0 608H486.4l-19.2 19.2c-51.2 51.2-102.4 83.2-147.2 96v-115.2H128v-544h768v544z" fill="#8a8a8a"/><path d="M256 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM448 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM640 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0z" fill="#8a8a8a"/></svg></div>');
//}
}
}
};
function startTwikoo() {
start = setInterval(function(){
var twikooDom = document.getElementById('twikoo') || '';
var memoTw = document.querySelector('.memo-wrapper') || '';
var memoLoading = document.querySelector('.action-button-container') || '';
var memoLoadingA = document.querySelector('.action-button-container a') || '';
var memoTwIcons = document.querySelectorAll('.time-text .twicon') || '';
var nowHref = window.location.href;
if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && memoLoadingA){
memoLoading.innerHTML = "评论加载中……"
}
if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && !twikooDom){
addTwikooJS()
if(memoTw){
clearInterval(start)
memoTw.insertAdjacentHTML('afterend', '<div id="mtcomment"></div>');
setTimeout(function() {
twikoo.init({
envId: twikooENV,
el: '#mtcomment',
path: nowHref.replace(/^(.*\\/m\\/[0-9]+).*$/,'$1'),
onCommentLoaded: function () {
//console.log('评论加载完成');
memoLoading.innerHTML = ''
startTwikoo()
}
})
}, 1000)
}
}
if(nowHref.replace(/^.*\\/(explore).*$/,'$1') == "explore" || nowHref.replace(/^.*\\/(u).*$/,'$1') == "u"){
memoTwIcons.forEach(memoTwIcon => {memoTwIcon.remove();});
addComIcon()
//console.log('图标添加成功');
}
//console.log(window.location.href);
}, 1000)
}
startTwikoo();
\n\n

自定义样式

1
2
3
4
5
#twikoo{padding: 1rem;background-color: rgb(63,63,70);margin: 1rem 0;border-radius: .5rem;color: #fff !important;}
.twicon{position: absolute;right: 1rem;}
.btns-container.space-x-2{margin-right:1.5rem;}
.action-button-container{color: #e5e7eb;}
.action-button-container a{display:none !important;}
","site":{"data":{}},"more":"

2023.9.26 更新.memos升级0.15.1版本后无法使用

\n

代码来自于@林木木

\n

自定义脚本

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
//添加 twikoo 评论 v2023.06.10
var twikooENV = 'https://twikoo.jiong.us/'
function addTwikooJS() {
var memosTwikoo = document.createElement("script");
memosTwikoo.src = `https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js`;
var tws = document.getElementsByTagName("script")[0];
tws.parentNode.insertBefore(memosTwikoo, tws);
};
function addComIcon(){
var memoTwIcons = document.querySelectorAll('.time-text') || '';
if(memoTwIcons){
for(var i=0;i < memoTwIcons.length;i++){
//if(memoTwIcon[i].hasChildNodes == false){
memoTwIcons[i].insertAdjacentHTML('afterbegin', '<div class="twicon"><svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M896 138.667H128c-38.4 0-64 25.6-64 64v544c0 38.4 25.6 64 64 64h128v128c83.2 0 166.4-44.8 256-128h384c38.4 0 64-25.6 64-64v-544c0-38.4-25.6-64-64-64zm0 608H486.4l-19.2 19.2c-51.2 51.2-102.4 83.2-147.2 96v-115.2H128v-544h768v544z" fill="#8a8a8a"/><path d="M256 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM448 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM640 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0z" fill="#8a8a8a"/></svg></div>');
//}
}
}
};
function startTwikoo() {
start = setInterval(function(){
var twikooDom = document.getElementById('twikoo') || '';
var memoTw = document.querySelector('.memo-wrapper') || '';
var memoLoading = document.querySelector('.action-button-container') || '';
var memoLoadingA = document.querySelector('.action-button-container a') || '';
var memoTwIcons = document.querySelectorAll('.time-text .twicon') || '';
var nowHref = window.location.href;
if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && memoLoadingA){
memoLoading.innerHTML = "评论加载中……"
}
if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && !twikooDom){
addTwikooJS()
if(memoTw){
clearInterval(start)
memoTw.insertAdjacentHTML('afterend', '<div id="mtcomment"></div>');
setTimeout(function() {
twikoo.init({
envId: twikooENV,
el: '#mtcomment',
path: nowHref.replace(/^(.*\\/m\\/[0-9]+).*$/,'$1'),
onCommentLoaded: function () {
//console.log('评论加载完成');
memoLoading.innerHTML = ''
startTwikoo()
}
})
}, 1000)
}
}
if(nowHref.replace(/^.*\\/(explore).*$/,'$1') == "explore" || nowHref.replace(/^.*\\/(u).*$/,'$1') == "u"){
memoTwIcons.forEach(memoTwIcon => {memoTwIcon.remove();});
addComIcon()
//console.log('图标添加成功');
}
//console.log(window.location.href);
}, 1000)
}
startTwikoo();
\n\n

自定义样式

1
2
3
4
5
#twikoo{padding: 1rem;background-color: rgb(63,63,70);margin: 1rem 0;border-radius: .5rem;color: #fff !important;}
.twicon{position: absolute;right: 1rem;}
.btns-container.space-x-2{margin-right:1.5rem;}
.action-button-container{color: #e5e7eb;}
.action-button-container a{display:none !important;}
"},{"title":"群晖CPU和内存占满的排查记录","published":1,"abbrlink":"bc338f20","date":"2023-07-07T07:57:00.000Z","cover":null,"_content":"## 起因 \n最近一段时间群晖老是CPU和内存满载,桌面安装的套件自动停止 \n一开始我认为是迅雷NAS版的问题,可是重装几次问题依旧.\n## 排查 \n打开菜单-`资源监控`-`任务管理器` \n发现虚拟机的CPU占用了80%,于是卸载虚拟机的套件.重启.\n问题依旧.\n继续查看`任务管理器`.\n发现`video station`内存占用9G以上,回想起自己曾经安装过`video station`的刮削补丁.\n于是,卸载补丁,重启\n完美解决.\n## 总结\n不要安装一些以为很有用的第三方补丁.\n其实没什么用.\n还会造成一些莫名其妙的问题.\nNAS还是稳定为主,不折腾了.\n","source":"_posts/群晖CPU和内存占用过高的排查记录.md","raw":"---\ntitle: 群晖CPU和内存占满的排查记录\ntags:\n - 群晖\npublished: true\ncategories: 分享\nabbrlink: bc338f20\ndate: 2023-07-07 15:57:00\ncover:\n---\n## 起因 \n最近一段时间群晖老是CPU和内存满载,桌面安装的套件自动停止 \n一开始我认为是迅雷NAS版的问题,可是重装几次问题依旧.\n## 排查 \n打开菜单-`资源监控`-`任务管理器` \n发现虚拟机的CPU占用了80%,于是卸载虚拟机的套件.重启.\n问题依旧.\n继续查看`任务管理器`.\n发现`video station`内存占用9G以上,回想起自己曾经安装过`video station`的刮削补丁.\n于是,卸载补丁,重启\n完美解决.\n## 总结\n不要安装一些以为很有用的第三方补丁.\n其实没什么用.\n还会造成一些莫名其妙的问题.\nNAS还是稳定为主,不折腾了.\n","slug":"群晖CPU和内存占用过高的排查记录","updated":"2023-09-29T07:51:06.397Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhj00fsoko05rs764v5","content":"

起因

最近一段时间群晖老是CPU和内存满载,桌面安装的套件自动停止
一开始我认为是迅雷NAS版的问题,可是重装几次问题依旧.

\n

排查

打开菜单-资源监控-任务管理器
发现虚拟机的CPU占用了80%,于是卸载虚拟机的套件.重启.
问题依旧.
继续查看任务管理器.
发现video station内存占用9G以上,回想起自己曾经安装过video station的刮削补丁.
于是,卸载补丁,重启
完美解决.

\n

总结

不要安装一些以为很有用的第三方补丁.
其实没什么用.
还会造成一些莫名其妙的问题.
NAS还是稳定为主,不折腾了.

\n","site":{"data":{}},"excerpt":"","more":"

起因

最近一段时间群晖老是CPU和内存满载,桌面安装的套件自动停止
一开始我认为是迅雷NAS版的问题,可是重装几次问题依旧.

\n

排查

打开菜单-资源监控-任务管理器
发现虚拟机的CPU占用了80%,于是卸载虚拟机的套件.重启.
问题依旧.
继续查看任务管理器.
发现video station内存占用9G以上,回想起自己曾经安装过video station的刮削补丁.
于是,卸载补丁,重启
完美解决.

\n

总结

不要安装一些以为很有用的第三方补丁.
其实没什么用.
还会造成一些莫名其妙的问题.
NAS还是稳定为主,不折腾了.

\n"},{"abbrlink":"63a51e75","cover":"https://blogcdn.asbid.cn/2023/06/06/1686013906.png","date":"2023-06-15T11:14:38.701Z","excerpt":"...","title":"群晖docker出现注册表无法访问的解决办法","updated":"2023-09-29T07:51:06.397Z","_content":"# 问题出现\n\n群晖docker升级到DSM7.2之后出现了新的问题,原本可以正常访问的群晖镜像仓库竟然无法访问了.\n原本启用注册表镜像URL就可以解决这个问题\n如今也无法使用这个解决方案了\n经过排查发现原来是因为docker仓库的域名被墙了.\n\n# 解决办法\n\n使用魔法.\n\n## 准备工作\n\n请参见 [`X-UI:支持多协议多用户的 xray 面板`](https://blog.asbid.cn/post/341.html)\n搭建一个代理服务,使用海外或者港台地区VPS\n\n## 开启群晖SSH\n\n![微信截图_20230606091022.png][1]\n\n## 使用SSH登录\n\n`ssh 用户名@群晖IP`登录\n例如\n\n```\nssh admin@192.168.31.100\n```\n\n输入密码,回车\n\n```\nsudo -i\n```\n\n输入密码,回车\n\n```\ndocker run -d \\\n--restart=always \\\n--privileged \\\n--network=host \\\n--name v2raya \\\n-v /volume2/docker/v2raya:/etc/v2raya \\ #此处/volume2/docker/v2raya为群晖目录改成自己的实际存放目录\nmzz2017/v2raya\n```\n\n使用docker部署v2ray\n部署成功就可以在docker的管理界面看到这个容器了.\n使用IP+端口2017登录web管理界面\n示例 192.168.31.100:2017\nsock代理端口为20170\nhttp代理端口为20171\n\n## 使用v2raya\n\n进入web管理界面点击创建\n填写代理资料\n![创建.png][2]\n填写完毕点击这里测试一下是否连通\n![photo_2023-06-06_09-22-32.jpg][3]\n![微信截图_20230606092047.png][4]\n![设置.png][5]\n设置完成后点击左上角的运行\n\n## 群晖设置\n\n打开控制面板-网络\n![群晖代理.png][6]\n保存即可\n\n\n[1]: https://blogcdn.asbid.cn/2023/06/06/1686013906.png\n[2]: https://blogcdn.asbid.cn/2023/06/06/1686014583.png\n[3]: https://blogcdn.asbid.cn/2023/06/06/1686014582.jpg\n[4]: https://blogcdn.asbid.cn/2023/06/06/1686014586.png\n[5]: https://blogcdn.asbid.cn/2023/06/06/1686014585.png\n[6]: https://blogcdn.asbid.cn/2023/06/06/1686015169.png\n","source":"_posts/群晖docker出现注册表无法访问的解决办法.md","raw":"---\nabbrlink: 63a51e75\ncategories:\n - - 分享\ncover: 'https://blogcdn.asbid.cn/2023/06/06/1686013906.png'\ndate: '2023-06-15T19:14:38.701492+08:00'\nexcerpt: ...\ntags:\n - 群晖\n - docker\ntitle: 群晖docker出现注册表无法访问的解决办法\nupdated: '2023-6-15T19:17:37.714+8:0'\n---\n# 问题出现\n\n群晖docker升级到DSM7.2之后出现了新的问题,原本可以正常访问的群晖镜像仓库竟然无法访问了.\n原本启用注册表镜像URL就可以解决这个问题\n如今也无法使用这个解决方案了\n经过排查发现原来是因为docker仓库的域名被墙了.\n\n# 解决办法\n\n使用魔法.\n\n## 准备工作\n\n请参见 [`X-UI:支持多协议多用户的 xray 面板`](https://blog.asbid.cn/post/341.html)\n搭建一个代理服务,使用海外或者港台地区VPS\n\n## 开启群晖SSH\n\n![微信截图_20230606091022.png][1]\n\n## 使用SSH登录\n\n`ssh 用户名@群晖IP`登录\n例如\n\n```\nssh admin@192.168.31.100\n```\n\n输入密码,回车\n\n```\nsudo -i\n```\n\n输入密码,回车\n\n```\ndocker run -d \\\n--restart=always \\\n--privileged \\\n--network=host \\\n--name v2raya \\\n-v /volume2/docker/v2raya:/etc/v2raya \\ #此处/volume2/docker/v2raya为群晖目录改成自己的实际存放目录\nmzz2017/v2raya\n```\n\n使用docker部署v2ray\n部署成功就可以在docker的管理界面看到这个容器了.\n使用IP+端口2017登录web管理界面\n示例 192.168.31.100:2017\nsock代理端口为20170\nhttp代理端口为20171\n\n## 使用v2raya\n\n进入web管理界面点击创建\n填写代理资料\n![创建.png][2]\n填写完毕点击这里测试一下是否连通\n![photo_2023-06-06_09-22-32.jpg][3]\n![微信截图_20230606092047.png][4]\n![设置.png][5]\n设置完成后点击左上角的运行\n\n## 群晖设置\n\n打开控制面板-网络\n![群晖代理.png][6]\n保存即可\n\n\n[1]: https://blogcdn.asbid.cn/2023/06/06/1686013906.png\n[2]: https://blogcdn.asbid.cn/2023/06/06/1686014583.png\n[3]: https://blogcdn.asbid.cn/2023/06/06/1686014582.jpg\n[4]: https://blogcdn.asbid.cn/2023/06/06/1686014586.png\n[5]: https://blogcdn.asbid.cn/2023/06/06/1686014585.png\n[6]: https://blogcdn.asbid.cn/2023/06/06/1686015169.png\n","slug":"群晖docker出现注册表无法访问的解决办法","published":1,"comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhj00fvoko07p789xfu","content":"

问题出现

群晖docker升级到DSM7.2之后出现了新的问题,原本可以正常访问的群晖镜像仓库竟然无法访问了.
原本启用注册表镜像URL就可以解决这个问题
如今也无法使用这个解决方案了
经过排查发现原来是因为docker仓库的域名被墙了.

\n

解决办法

使用魔法.

\n

准备工作

请参见 X-UI:支持多协议多用户的 xray 面板
搭建一个代理服务,使用海外或者港台地区VPS

\n

开启群晖SSH

\"微信截图_20230606091022.png\"

\n

使用SSH登录

ssh 用户名@群晖IP登录
例如

\n
1
ssh admin@192.168.31.100
\n\n

输入密码,回车

\n
1
sudo -i
\n\n

输入密码,回车

\n
1
2
3
4
5
6
7
docker run -d \\
--restart=always \\
--privileged \\
--network=host \\
--name v2raya \\
-v /volume2/docker/v2raya:/etc/v2raya \\ #此处/volume2/docker/v2raya为群晖目录改成自己的实际存放目录
mzz2017/v2raya
\n\n

使用docker部署v2ray
部署成功就可以在docker的管理界面看到这个容器了.
使用IP+端口2017登录web管理界面
示例 192.168.31.100:2017
sock代理端口为20170
http代理端口为20171

\n

使用v2raya

进入web管理界面点击创建
填写代理资料
\"创建.png\"
填写完毕点击这里测试一下是否连通
\"photo_2023-06-06_09-22-32.jpg\"
\"微信截图_20230606092047.png\"
\"设置.png\"
设置完成后点击左上角的运行

\n

群晖设置

打开控制面板-网络
\"群晖代理.png\"
保存即可

\n","site":{"data":{}},"more":"

问题出现

群晖docker升级到DSM7.2之后出现了新的问题,原本可以正常访问的群晖镜像仓库竟然无法访问了.
原本启用注册表镜像URL就可以解决这个问题
如今也无法使用这个解决方案了
经过排查发现原来是因为docker仓库的域名被墙了.

\n

解决办法

使用魔法.

\n

准备工作

请参见 X-UI:支持多协议多用户的 xray 面板
搭建一个代理服务,使用海外或者港台地区VPS

\n

开启群晖SSH

\"微信截图_20230606091022.png\"

\n

使用SSH登录

ssh 用户名@群晖IP登录
例如

\n
1
ssh admin@192.168.31.100
\n\n

输入密码,回车

\n
1
sudo -i
\n\n

输入密码,回车

\n
1
2
3
4
5
6
7
docker run -d \\
--restart=always \\
--privileged \\
--network=host \\
--name v2raya \\
-v /volume2/docker/v2raya:/etc/v2raya \\ #此处/volume2/docker/v2raya为群晖目录改成自己的实际存放目录
mzz2017/v2raya
\n\n

使用docker部署v2ray
部署成功就可以在docker的管理界面看到这个容器了.
使用IP+端口2017登录web管理界面
示例 192.168.31.100:2017
sock代理端口为20170
http代理端口为20171

\n

使用v2raya

进入web管理界面点击创建
填写代理资料
\"创建.png\"
填写完毕点击这里测试一下是否连通
\"photo_2023-06-06_09-22-32.jpg\"
\"微信截图_20230606092047.png\"
\"设置.png\"
设置完成后点击左上角的运行

\n

群晖设置

打开控制面板-网络
\"群晖代理.png\"
保存即可

\n"},{"title":"荒唐 文,古龙","excerpt":"","abbrlink":5587,"date":"2017-01-27T16:50:21.000Z","_content":"\n荒唐 \n\n(文:古龙)\n\n --给愚蠢的我及聪明的狐\n\n\n我遇见的事远比最荒唐的梦更为离奇, \n\n有风的晚上我在无风的地方遇着了你;\n\n你烟般氤氲著的影子在窗上散而又聚, \n\n淡淡的月光穿透了你重重的宫绡罗衣。\n\n从此书斋外再不闻我夜半的朗朗书声, \n\n有的只是我和你的轻嗔浅笑低吟细语;\n\n一年后你忽然问我为何总是烂醉如泥, \n\n我笑了笑只因我没有向你诉说的勇气。\n\n我梦想你能有诛奸的剑供我任意挥舞, \n\n我渴望海一般的智慧和山一般的财富;\n\n日日夜夜我只望你能赐我权势和幸福, \n \n只因为那荒唐的聊斋故事我早已听熟。\n\n\n我竟忘了你的爱情便是我最大的幸福, \n\n也忘了没有爱情时我的寂寞萧索愁苦;\n\n有一日你笑著抛给我一枚如意的指环, \n\n告诉我它可为我带来我梦中企求之物。\n\n我狂喜着试验它是否真的有那般魔力, \n\n你却已冷笑着在银雾中袅娜随风逝去;\n\n于是我得到了智慧与财富却失去了你, \n\n于是我夜夜只有对着孤独的影子低泣。\n\n昨夜雨声里我又自梦见你的梦中醒来, \n\n我梦见你乘著朵多采的云霞羽衣飘逸;\n\n但是你只冷冷望我一眼便又乘云而去, \n\n我只有更恨自己不知对爱情多加珍惜。","source":"_posts/荒唐-文,古龙.md","raw":"---\ntitle: 荒唐 文,古龙\ntags:\n - 古龙\n - 生活\n - 荒唐\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 5587\ndate: 2017-01-28 00:50:21\n---\n\n荒唐 \n\n(文:古龙)\n\n --给愚蠢的我及聪明的狐\n\n\n我遇见的事远比最荒唐的梦更为离奇, \n\n有风的晚上我在无风的地方遇着了你;\n\n你烟般氤氲著的影子在窗上散而又聚, \n\n淡淡的月光穿透了你重重的宫绡罗衣。\n\n从此书斋外再不闻我夜半的朗朗书声, \n\n有的只是我和你的轻嗔浅笑低吟细语;\n\n一年后你忽然问我为何总是烂醉如泥, \n\n我笑了笑只因我没有向你诉说的勇气。\n\n我梦想你能有诛奸的剑供我任意挥舞, \n\n我渴望海一般的智慧和山一般的财富;\n\n日日夜夜我只望你能赐我权势和幸福, \n \n只因为那荒唐的聊斋故事我早已听熟。\n\n\n我竟忘了你的爱情便是我最大的幸福, \n\n也忘了没有爱情时我的寂寞萧索愁苦;\n\n有一日你笑著抛给我一枚如意的指环, \n\n告诉我它可为我带来我梦中企求之物。\n\n我狂喜着试验它是否真的有那般魔力, \n\n你却已冷笑着在银雾中袅娜随风逝去;\n\n于是我得到了智慧与财富却失去了你, \n\n于是我夜夜只有对着孤独的影子低泣。\n\n昨夜雨声里我又自梦见你的梦中醒来, \n\n我梦见你乘著朵多采的云霞羽衣飘逸;\n\n但是你只冷冷望我一眼便又乘云而去, \n\n我只有更恨自己不知对爱情多加珍惜。","slug":"荒唐-文,古龙","published":1,"updated":"2023-09-29T07:51:06.398Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhk00fyoko08mj1164d","content":"

荒唐

\n

(文:古龙)

\n

--给愚蠢的我及聪明的狐

\n

我遇见的事远比最荒唐的梦更为离奇,

\n

有风的晚上我在无风的地方遇着了你;

\n

你烟般氤氲著的影子在窗上散而又聚,

\n

淡淡的月光穿透了你重重的宫绡罗衣。

\n

从此书斋外再不闻我夜半的朗朗书声,

\n

有的只是我和你的轻嗔浅笑低吟细语;

\n

一年后你忽然问我为何总是烂醉如泥,

\n

我笑了笑只因我没有向你诉说的勇气。

\n

我梦想你能有诛奸的剑供我任意挥舞,

\n

我渴望海一般的智慧和山一般的财富;

\n

日日夜夜我只望你能赐我权势和幸福,

\n

只因为那荒唐的聊斋故事我早已听熟。

\n

我竟忘了你的爱情便是我最大的幸福,

\n

也忘了没有爱情时我的寂寞萧索愁苦;

\n

有一日你笑著抛给我一枚如意的指环,

\n

告诉我它可为我带来我梦中企求之物。

\n

我狂喜着试验它是否真的有那般魔力,

\n

你却已冷笑着在银雾中袅娜随风逝去;

\n

于是我得到了智慧与财富却失去了你,

\n

于是我夜夜只有对着孤独的影子低泣。

\n

昨夜雨声里我又自梦见你的梦中醒来,

\n

我梦见你乘著朵多采的云霞羽衣飘逸;

\n

但是你只冷冷望我一眼便又乘云而去,

\n

我只有更恨自己不知对爱情多加珍惜。

\n","site":{"data":{}},"more":"

荒唐

\n

(文:古龙)

\n

--给愚蠢的我及聪明的狐

\n

我遇见的事远比最荒唐的梦更为离奇,

\n

有风的晚上我在无风的地方遇着了你;

\n

你烟般氤氲著的影子在窗上散而又聚,

\n

淡淡的月光穿透了你重重的宫绡罗衣。

\n

从此书斋外再不闻我夜半的朗朗书声,

\n

有的只是我和你的轻嗔浅笑低吟细语;

\n

一年后你忽然问我为何总是烂醉如泥,

\n

我笑了笑只因我没有向你诉说的勇气。

\n

我梦想你能有诛奸的剑供我任意挥舞,

\n

我渴望海一般的智慧和山一般的财富;

\n

日日夜夜我只望你能赐我权势和幸福,

\n

只因为那荒唐的聊斋故事我早已听熟。

\n

我竟忘了你的爱情便是我最大的幸福,

\n

也忘了没有爱情时我的寂寞萧索愁苦;

\n

有一日你笑著抛给我一枚如意的指环,

\n

告诉我它可为我带来我梦中企求之物。

\n

我狂喜着试验它是否真的有那般魔力,

\n

你却已冷笑着在银雾中袅娜随风逝去;

\n

于是我得到了智慧与财富却失去了你,

\n

于是我夜夜只有对着孤独的影子低泣。

\n

昨夜雨声里我又自梦见你的梦中醒来,

\n

我梦见你乘著朵多采的云霞羽衣飘逸;

\n

但是你只冷冷望我一眼便又乘云而去,

\n

我只有更恨自己不知对爱情多加珍惜。

\n"},{"title":"老子与太上老君","excerpt":"","abbrlink":27137,"date":"2011-09-02T05:36:18.000Z","_content":"\n> 历史中的老子,姓李名耳字聃,又字伯阳,春秋时楚国苦县人。曾任周朝守藏室之史。主无为之说,后世以为道家始祖。孔子尝往问礼,著有《道德经》五千余言。现今社会各行业中,如:铁匠、煤窑匠、碗筷匠、磨刀匠、蹄铁匠等,皆祭拜老子为祖师爷。亦称 为伯阳、太上老君、老聃、老君、老子、老子道君、李伯阳、李老君。\n\n以上百度百科。 > 神话中的太上老君,全称“一气化三清太清居火赤天仙登太清境 玄气所成日神宝君道德天尊混元上帝”,简称“老君”。道教天神,传说中的道教教主,为三清之第三位。又称“道德天尊”、“混元老君”、“降生天尊”、“太清大帝”等。三清为玉清元始天尊、上清灵宝天尊、太清道德天尊。 在道教宫观“三清殿”,其塑像居左位,手执蒲扇。相传老君居住在太清圣境。《西游记》中,老君居“离恨天兜率宫”;《封神榜》中,则是“大罗天玄都洞八景宫”。\n\n以上依旧是无所不知的百度百科。 封神演义中曾说,盘古开天之后一缕精气所化为老子,元始天尊,通天教主。 老子主人教,元始掌阐教,通天握截教。 三教教主为应杀劫,共同制定封神榜。 凡封神榜上有姓名者皆封神拜将在天庭为官,受天规束缚。 太上老君为人教教主之尊怎可能在天庭供职。 而且为什么他法力差劲的连孙悟空都制服不了。 我严重怀疑这老头在隐藏实力。 可为什么呢?","source":"_posts/老子与太上老君.md","raw":"---\ntitle: 老子与太上老君\ntags:\n - 太上老君\n - 封神演义\n - 笔记\n - 老子\n - 西游记\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 27137\ndate: 2011-09-02 13:36:18\n---\n\n> 历史中的老子,姓李名耳字聃,又字伯阳,春秋时楚国苦县人。曾任周朝守藏室之史。主无为之说,后世以为道家始祖。孔子尝往问礼,著有《道德经》五千余言。现今社会各行业中,如:铁匠、煤窑匠、碗筷匠、磨刀匠、蹄铁匠等,皆祭拜老子为祖师爷。亦称 为伯阳、太上老君、老聃、老君、老子、老子道君、李伯阳、李老君。\n\n以上百度百科。 > 神话中的太上老君,全称“一气化三清太清居火赤天仙登太清境 玄气所成日神宝君道德天尊混元上帝”,简称“老君”。道教天神,传说中的道教教主,为三清之第三位。又称“道德天尊”、“混元老君”、“降生天尊”、“太清大帝”等。三清为玉清元始天尊、上清灵宝天尊、太清道德天尊。 在道教宫观“三清殿”,其塑像居左位,手执蒲扇。相传老君居住在太清圣境。《西游记》中,老君居“离恨天兜率宫”;《封神榜》中,则是“大罗天玄都洞八景宫”。\n\n以上依旧是无所不知的百度百科。 封神演义中曾说,盘古开天之后一缕精气所化为老子,元始天尊,通天教主。 老子主人教,元始掌阐教,通天握截教。 三教教主为应杀劫,共同制定封神榜。 凡封神榜上有姓名者皆封神拜将在天庭为官,受天规束缚。 太上老君为人教教主之尊怎可能在天庭供职。 而且为什么他法力差劲的连孙悟空都制服不了。 我严重怀疑这老头在隐藏实力。 可为什么呢?","slug":"老子与太上老君","published":1,"updated":"2023-09-29T07:51:06.397Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhl00g2oko0effdh6o6","content":"
\n

历史中的老子,姓李名耳字聃,又字伯阳,春秋时楚国苦县人。曾任周朝守藏室之史。主无为之说,后世以为道家始祖。孔子尝往问礼,著有《道德经》五千余言。现今社会各行业中,如:铁匠、煤窑匠、碗筷匠、磨刀匠、蹄铁匠等,皆祭拜老子为祖师爷。亦称 为伯阳、太上老君、老聃、老君、老子、老子道君、李伯阳、李老君。

\n
\n

以上百度百科。 > 神话中的太上老君,全称“一气化三清太清居火赤天仙登太清境 玄气所成日神宝君道德天尊混元上帝”,简称“老君”。道教天神,传说中的道教教主,为三清之第三位。又称“道德天尊”、“混元老君”、“降生天尊”、“太清大帝”等。三清为玉清元始天尊、上清灵宝天尊、太清道德天尊。 在道教宫观“三清殿”,其塑像居左位,手执蒲扇。相传老君居住在太清圣境。《西游记》中,老君居“离恨天兜率宫”;《封神榜》中,则是“大罗天玄都洞八景宫”。

\n

以上依旧是无所不知的百度百科。 封神演义中曾说,盘古开天之后一缕精气所化为老子,元始天尊,通天教主。 老子主人教,元始掌阐教,通天握截教。 三教教主为应杀劫,共同制定封神榜。 凡封神榜上有姓名者皆封神拜将在天庭为官,受天规束缚。 太上老君为人教教主之尊怎可能在天庭供职。 而且为什么他法力差劲的连孙悟空都制服不了。 我严重怀疑这老头在隐藏实力。 可为什么呢?

\n","site":{"data":{}},"more":"
\n

历史中的老子,姓李名耳字聃,又字伯阳,春秋时楚国苦县人。曾任周朝守藏室之史。主无为之说,后世以为道家始祖。孔子尝往问礼,著有《道德经》五千余言。现今社会各行业中,如:铁匠、煤窑匠、碗筷匠、磨刀匠、蹄铁匠等,皆祭拜老子为祖师爷。亦称 为伯阳、太上老君、老聃、老君、老子、老子道君、李伯阳、李老君。

\n
\n

以上百度百科。 > 神话中的太上老君,全称“一气化三清太清居火赤天仙登太清境 玄气所成日神宝君道德天尊混元上帝”,简称“老君”。道教天神,传说中的道教教主,为三清之第三位。又称“道德天尊”、“混元老君”、“降生天尊”、“太清大帝”等。三清为玉清元始天尊、上清灵宝天尊、太清道德天尊。 在道教宫观“三清殿”,其塑像居左位,手执蒲扇。相传老君居住在太清圣境。《西游记》中,老君居“离恨天兜率宫”;《封神榜》中,则是“大罗天玄都洞八景宫”。

\n

以上依旧是无所不知的百度百科。 封神演义中曾说,盘古开天之后一缕精气所化为老子,元始天尊,通天教主。 老子主人教,元始掌阐教,通天握截教。 三教教主为应杀劫,共同制定封神榜。 凡封神榜上有姓名者皆封神拜将在天庭为官,受天规束缚。 太上老君为人教教主之尊怎可能在天庭供职。 而且为什么他法力差劲的连孙悟空都制服不了。 我严重怀疑这老头在隐藏实力。 可为什么呢?

\n"},{"title":"西游记中的谜","excerpt":"","abbrlink":19164,"date":"2011-08-18T14:43:25.000Z","_content":"\n新版西游记已经开播,只看两集就觉得被雷到了。 \n\n最近在看西游记的吴本小说。 \n\n有些很奇妙的地方始终没能在书中找到答案。 \n\n一、水帘洞的来历、我感觉水帘洞不可能只是一个单纯的洞府。\n\n为何进去之后有石碗石椅石凳石瓢,还有:花果山福地,水帘洞洞天的对联。 \n\n二、须菩提祖师的来历。\n\n整部书中最深不可测的不是如来不是元始天尊不是老子,而是这位须菩提祖师。\n\n这位祖师能谈道论禅。\n\n连漫天星宿都无法战胜的齐天大圣孙悟空也不过只是在其门下修行了近十余年而已。 \n\n\n三、孙悟空的辈分是菩提祖师给的。\n\n为何猪八戒沙僧的辈分都是悟字辈呢。\n\n如果说唐僧是如来的弟子,悟空是唐僧的弟子。 \n\n那须菩提祖师又是谁呢。\n\n极有可能就是西方圣人之一的准提道人","source":"_posts/西游记中的谜.md","raw":"---\ntitle: 西游记中的谜\ntags:\n - 笔记\n - 西游记\n - 谜\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 19164\ndate: 2011-08-18 22:43:25\n---\n\n新版西游记已经开播,只看两集就觉得被雷到了。 \n\n最近在看西游记的吴本小说。 \n\n有些很奇妙的地方始终没能在书中找到答案。 \n\n一、水帘洞的来历、我感觉水帘洞不可能只是一个单纯的洞府。\n\n为何进去之后有石碗石椅石凳石瓢,还有:花果山福地,水帘洞洞天的对联。 \n\n二、须菩提祖师的来历。\n\n整部书中最深不可测的不是如来不是元始天尊不是老子,而是这位须菩提祖师。\n\n这位祖师能谈道论禅。\n\n连漫天星宿都无法战胜的齐天大圣孙悟空也不过只是在其门下修行了近十余年而已。 \n\n\n三、孙悟空的辈分是菩提祖师给的。\n\n为何猪八戒沙僧的辈分都是悟字辈呢。\n\n如果说唐僧是如来的弟子,悟空是唐僧的弟子。 \n\n那须菩提祖师又是谁呢。\n\n极有可能就是西方圣人之一的准提道人","slug":"西游记中的谜","published":1,"updated":"2023-09-29T07:51:06.398Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhl00g5oko09tei1t3o","content":"

新版西游记已经开播,只看两集就觉得被雷到了。

\n

最近在看西游记的吴本小说。

\n

有些很奇妙的地方始终没能在书中找到答案。

\n

一、水帘洞的来历、我感觉水帘洞不可能只是一个单纯的洞府。

\n

为何进去之后有石碗石椅石凳石瓢,还有:花果山福地,水帘洞洞天的对联。

\n

二、须菩提祖师的来历。

\n

整部书中最深不可测的不是如来不是元始天尊不是老子,而是这位须菩提祖师。

\n

这位祖师能谈道论禅。

\n

连漫天星宿都无法战胜的齐天大圣孙悟空也不过只是在其门下修行了近十余年而已。

\n

三、孙悟空的辈分是菩提祖师给的。

\n

为何猪八戒沙僧的辈分都是悟字辈呢。

\n

如果说唐僧是如来的弟子,悟空是唐僧的弟子。

\n

那须菩提祖师又是谁呢。

\n

极有可能就是西方圣人之一的准提道人

\n","site":{"data":{}},"more":"

新版西游记已经开播,只看两集就觉得被雷到了。

\n

最近在看西游记的吴本小说。

\n

有些很奇妙的地方始终没能在书中找到答案。

\n

一、水帘洞的来历、我感觉水帘洞不可能只是一个单纯的洞府。

\n

为何进去之后有石碗石椅石凳石瓢,还有:花果山福地,水帘洞洞天的对联。

\n

二、须菩提祖师的来历。

\n

整部书中最深不可测的不是如来不是元始天尊不是老子,而是这位须菩提祖师。

\n

这位祖师能谈道论禅。

\n

连漫天星宿都无法战胜的齐天大圣孙悟空也不过只是在其门下修行了近十余年而已。

\n

三、孙悟空的辈分是菩提祖师给的。

\n

为何猪八戒沙僧的辈分都是悟字辈呢。

\n

如果说唐僧是如来的弟子,悟空是唐僧的弟子。

\n

那须菩提祖师又是谁呢。

\n

极有可能就是西方圣人之一的准提道人

\n"},{"title":"记在8月","excerpt":"","abbrlink":54391,"date":"2011-08-31T05:26:32.000Z","_content":"\n我想说的是 春困夏乏秋无力,冬日正好眠。","source":"_posts/记在8月.md","raw":"---\ntitle: 记在8月\ntags:\n - 心情\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 54391\ndate: 2011-08-31 13:26:32\n---\n\n我想说的是 春困夏乏秋无力,冬日正好眠。","slug":"记在8月","published":1,"updated":"2023-09-29T07:51:06.398Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhm00g9oko08z1r71at","content":"

我想说的是 春困夏乏秋无力,冬日正好眠。

\n","site":{"data":{}},"more":"

我想说的是 春困夏乏秋无力,冬日正好眠。

\n"},{"title":"论坛社交的没落,终究是败给了时代","excerpt":"","abbrlink":15245,"date":"2017-04-17T11:23:09.000Z","_content":"\n时代永远属于先进者,新兴社交网络无可厚非是当今时代的宠儿。传统BBS社区的没落除了自身的缺陷和堕落,更多是输给了时代。曾经火爆一时的西祠、天涯、猫扑等传统论坛社区,是互联网的风向标,是新闻记者的新闻源,是网友的关注点,在这里也产生了大量互联网热门词语和段子,风头势如破竹。 传统论坛现衰落之气 事实上,时代在变,产品也在更新换代,企业或网站就像人的生命一样,皆有定数。就像诺基亚手机,我们不能说他变差了,而是时代变了,这就是它的定数。博客、论坛作为老一代的社交平台,已经显示出其衰落之气。 新兴社交软件的出现 还记得曾经火爆网络的猫扑网么,还记得风靡一时的西祠胡同么?还记得曾每天必上的天涯论坛么?当然,纵使它们的没落有自身的原因,但很大程度上是因为新形态产品的替代,比如以微博、微信为代表的移动社交网络,不仅改变了传统的互联网社交形态,而且对各行各业产生了不小的影响,而移动端产品大肆流行又抢走了PC端产品的用户。 移动互联时代的来临 究竟是一股什么势力,把国内这些大型传统BBS社区逼上绝路了呢? 短短几年,大屏手机的兴起,移动互联网的到来,诞生了以微信、微博为主的新兴社交平台的出现。现在用手机可以做一切你能够想到的事情,只要有一部智能手机,几乎可以足不出户地操控着日常生活的方方面面。手机显然成了生活中不可或缺的一部分,在社交方面,可以随时随地的分享自己的感受,随时随地的和朋友互动。随着移动互联网给大众带来的便利,改变了大众的阅读习惯,标志着信息碎片化时代的到来。再看传统BBS的长篇大论,显然是与时代脉络不在一个节奏上。于是移动社交成为当下最流行的网络社交形态,给传统BBS带来致命打击。在被微博、微信等新社交平台的夹击下,用户群体被分解得四零八落。 每个产品的发展都跟它所在的环境和时代有关系。猫扑、天涯的衰落是必然的。新模式革命旧模式是自然规律,虽然我们不舍,但在互联网的进化过程里却是无法避免的。","source":"_posts/论坛社交的没落,终究是败给了时代.md","raw":"---\ntitle: 论坛社交的没落,终究是败给了时代\ntags:\n - 生活\n - 社交\n - 论坛\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 15245\ndate: 2017-04-17 19:23:09\n---\n\n时代永远属于先进者,新兴社交网络无可厚非是当今时代的宠儿。传统BBS社区的没落除了自身的缺陷和堕落,更多是输给了时代。曾经火爆一时的西祠、天涯、猫扑等传统论坛社区,是互联网的风向标,是新闻记者的新闻源,是网友的关注点,在这里也产生了大量互联网热门词语和段子,风头势如破竹。 传统论坛现衰落之气 事实上,时代在变,产品也在更新换代,企业或网站就像人的生命一样,皆有定数。就像诺基亚手机,我们不能说他变差了,而是时代变了,这就是它的定数。博客、论坛作为老一代的社交平台,已经显示出其衰落之气。 新兴社交软件的出现 还记得曾经火爆网络的猫扑网么,还记得风靡一时的西祠胡同么?还记得曾每天必上的天涯论坛么?当然,纵使它们的没落有自身的原因,但很大程度上是因为新形态产品的替代,比如以微博、微信为代表的移动社交网络,不仅改变了传统的互联网社交形态,而且对各行各业产生了不小的影响,而移动端产品大肆流行又抢走了PC端产品的用户。 移动互联时代的来临 究竟是一股什么势力,把国内这些大型传统BBS社区逼上绝路了呢? 短短几年,大屏手机的兴起,移动互联网的到来,诞生了以微信、微博为主的新兴社交平台的出现。现在用手机可以做一切你能够想到的事情,只要有一部智能手机,几乎可以足不出户地操控着日常生活的方方面面。手机显然成了生活中不可或缺的一部分,在社交方面,可以随时随地的分享自己的感受,随时随地的和朋友互动。随着移动互联网给大众带来的便利,改变了大众的阅读习惯,标志着信息碎片化时代的到来。再看传统BBS的长篇大论,显然是与时代脉络不在一个节奏上。于是移动社交成为当下最流行的网络社交形态,给传统BBS带来致命打击。在被微博、微信等新社交平台的夹击下,用户群体被分解得四零八落。 每个产品的发展都跟它所在的环境和时代有关系。猫扑、天涯的衰落是必然的。新模式革命旧模式是自然规律,虽然我们不舍,但在互联网的进化过程里却是无法避免的。","slug":"论坛社交的没落,终究是败给了时代","published":1,"updated":"2023-09-29T07:51:06.399Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhm00gcoko081xv48y9","content":"

时代永远属于先进者,新兴社交网络无可厚非是当今时代的宠儿。传统BBS社区的没落除了自身的缺陷和堕落,更多是输给了时代。曾经火爆一时的西祠、天涯、猫扑等传统论坛社区,是互联网的风向标,是新闻记者的新闻源,是网友的关注点,在这里也产生了大量互联网热门词语和段子,风头势如破竹。 传统论坛现衰落之气 事实上,时代在变,产品也在更新换代,企业或网站就像人的生命一样,皆有定数。就像诺基亚手机,我们不能说他变差了,而是时代变了,这就是它的定数。博客、论坛作为老一代的社交平台,已经显示出其衰落之气。 新兴社交软件的出现 还记得曾经火爆网络的猫扑网么,还记得风靡一时的西祠胡同么?还记得曾每天必上的天涯论坛么?当然,纵使它们的没落有自身的原因,但很大程度上是因为新形态产品的替代,比如以微博、微信为代表的移动社交网络,不仅改变了传统的互联网社交形态,而且对各行各业产生了不小的影响,而移动端产品大肆流行又抢走了PC端产品的用户。 移动互联时代的来临 究竟是一股什么势力,把国内这些大型传统BBS社区逼上绝路了呢? 短短几年,大屏手机的兴起,移动互联网的到来,诞生了以微信、微博为主的新兴社交平台的出现。现在用手机可以做一切你能够想到的事情,只要有一部智能手机,几乎可以足不出户地操控着日常生活的方方面面。手机显然成了生活中不可或缺的一部分,在社交方面,可以随时随地的分享自己的感受,随时随地的和朋友互动。随着移动互联网给大众带来的便利,改变了大众的阅读习惯,标志着信息碎片化时代的到来。再看传统BBS的长篇大论,显然是与时代脉络不在一个节奏上。于是移动社交成为当下最流行的网络社交形态,给传统BBS带来致命打击。在被微博、微信等新社交平台的夹击下,用户群体被分解得四零八落。 每个产品的发展都跟它所在的环境和时代有关系。猫扑、天涯的衰落是必然的。新模式革命旧模式是自然规律,虽然我们不舍,但在互联网的进化过程里却是无法避免的。

\n","site":{"data":{}},"more":"

时代永远属于先进者,新兴社交网络无可厚非是当今时代的宠儿。传统BBS社区的没落除了自身的缺陷和堕落,更多是输给了时代。曾经火爆一时的西祠、天涯、猫扑等传统论坛社区,是互联网的风向标,是新闻记者的新闻源,是网友的关注点,在这里也产生了大量互联网热门词语和段子,风头势如破竹。 传统论坛现衰落之气 事实上,时代在变,产品也在更新换代,企业或网站就像人的生命一样,皆有定数。就像诺基亚手机,我们不能说他变差了,而是时代变了,这就是它的定数。博客、论坛作为老一代的社交平台,已经显示出其衰落之气。 新兴社交软件的出现 还记得曾经火爆网络的猫扑网么,还记得风靡一时的西祠胡同么?还记得曾每天必上的天涯论坛么?当然,纵使它们的没落有自身的原因,但很大程度上是因为新形态产品的替代,比如以微博、微信为代表的移动社交网络,不仅改变了传统的互联网社交形态,而且对各行各业产生了不小的影响,而移动端产品大肆流行又抢走了PC端产品的用户。 移动互联时代的来临 究竟是一股什么势力,把国内这些大型传统BBS社区逼上绝路了呢? 短短几年,大屏手机的兴起,移动互联网的到来,诞生了以微信、微博为主的新兴社交平台的出现。现在用手机可以做一切你能够想到的事情,只要有一部智能手机,几乎可以足不出户地操控着日常生活的方方面面。手机显然成了生活中不可或缺的一部分,在社交方面,可以随时随地的分享自己的感受,随时随地的和朋友互动。随着移动互联网给大众带来的便利,改变了大众的阅读习惯,标志着信息碎片化时代的到来。再看传统BBS的长篇大论,显然是与时代脉络不在一个节奏上。于是移动社交成为当下最流行的网络社交形态,给传统BBS带来致命打击。在被微博、微信等新社交平台的夹击下,用户群体被分解得四零八落。 每个产品的发展都跟它所在的环境和时代有关系。猫扑、天涯的衰落是必然的。新模式革命旧模式是自然规律,虽然我们不舍,但在互联网的进化过程里却是无法避免的。

\n"},{"title":"还有两天就过完2016","excerpt":"","abbrlink":62032,"date":"2016-12-29T14:35:23.000Z","_content":"\n值此辞旧迎新之际,祝大家。。。 鸡年大吉吧。\n![](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)\n\n 照片拍摄自珠海大道。","source":"_posts/还有两天就过完2016.md","raw":"---\ntitle: 还有两天就过完2016\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 62032\ndate: 2016-12-29 22:35:23\n---\n\n值此辞旧迎新之际,祝大家。。。 鸡年大吉吧。\n![](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)\n\n 照片拍摄自珠海大道。","slug":"还有两天就过完2016","published":1,"updated":"2023-09-29T07:51:06.400Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhn00gfoko05tafeumv","content":"

值此辞旧迎新之际,祝大家。。。 鸡年大吉吧。
](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)

\n

照片拍摄自珠海大道。

\n","site":{"data":{}},"more":"

值此辞旧迎新之际,祝大家。。。 鸡年大吉吧。
](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)

\n

照片拍摄自珠海大道。

\n"},{"title":"路下如烟","excerpt":"","abbrlink":49268,"date":"2018-08-07T05:04:33.000Z","_content":"(文.璟)\n\n“我会不逼你戒烟。“ \n\n”哦,为什么呢?“ \n\n”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“ \n\n金菁喜欢穿有帽子的衣服, 她觉得戴上帽子很有安全感。\n\n她在大学的时候不喜欢跟人说话,圈子很小,她熟稔一切能自己做的事情,比如画画,比如看书,比如打游戏,比如去学校附近的小酒吧安静的坐一夜。\n\n她最喜欢酒吧里一个总穿着帽衫,头发略长的瘦瘦的男生唱的歌,不像那些装蛋的摇滚,难听的嗓音在夜里爆炸出很多玻璃碎痕,让原本烦闷的人更烦闷。\n\n那个男生唱的歌总是温柔的老歌,或者日本动漫里的歌曲。\n\n金菁喜欢这两种风格,一种治愈她,一种填满她。 \n\n有天夜里,帽衫男生下班,背着吉他走出酒吧。\n\n金菁戴上帽子跟着他,帽衫男生点了一根烟,金菁也点了一根烟。\n\n男生走进了金菁的大学,金菁也跟他走进去。\n\n帽衫男生回过头来看着她,她也直视着男生。\n\n帽衫男生站在月亮的阴影下,他说:我认识你。我叫戴笠。 \n\n戴笠说他很久就前就注意到金菁了,总在他演唱的时候坐在最远的卡座上。\n\n戴笠说他不是这个大学的,他只是有个好朋友在这里上学,他来这个城市混日子,住在他宿舍里。 \n\n戴笠说有一次看到金菁穿着樱木花道的印花T恤,他就唱了一首《灌篮高手》的主题曲。\n\n戴笠说秋天看到金菁穿一件印着寒冰射手的帽衫,他的心怦然一跳。\n\n戴笠不怎么爱说话,在一起了一个月,金菁也只记住这些比较重要的。 \n\n金菁给戴笠买了很多帽衫,他俩经常手牵手去网吧双排。\n\n戴笠打的很好,尤其是坦克式英雄,金菁还有课业,打游戏的时间不多,戴笠每晚唱到两三点,就会去网吧通宵到早上,然后闷头睡一天。\n\n他俩相处的时间多是黑夜,路灯下每个小摊,金菁都知道他们的味道。\n\n戴笠唱歌需要嗓子,可他又极度依赖烟,唱的时间越来越短。金菁期末考试周时,戴笠得了咽炎。 \n\n金菁仿佛从那个时候开始,变成了贤妻良母。她不去泡图书馆,也不去参加集体活动,她偷偷买了小煮锅,给戴笠煮梨汤,省下钱去买化咽炎的药。\n\n戴笠没有了酒吧的工作,每天窝在男生寝室里打游戏,晚上出来跟金菁在操场散步,看着长腿的姑娘挽着挺拔的小伙。\n\n他俩在操场的尽头比赛似的抽烟,戴笠抽下金菁的烟,轻轻的亲吻她的嘴。 \n\n放了假的金菁回到老家,她在火车卧铺上就疯狂的想念戴笠。\n\n两个人在南北两地开着视频打rank,戴笠会用有些沙哑的嗓音给她唱歌,还会寄栗子糕给她。\n\n金菁开始留头发,开始每天在家里学煲粥和炖汤,她出门去买菜,喜欢萝卜刺眼的色彩。\n\n她买了所LOL里所有的情侣皮肤,她看到中路阿狸站在戴笠的蛮王身边,她会一撇嘴射出一道冰箭过去,暴击百分百。\n\n过完年了的某一天,戴笠截了一张最强王者的段位图给她,还有一张频道邀请主播函。\n\n金菁买了全套泳池皮肤送给他,事后想想好像戴笠只喜欢用里面的鳄鱼。 \n\n金菁回到广州上学,戴笠在机场用白色的大羽绒服裹住了她。\n\n她闻到浓浓的烟草味和CK香水味道,暖暖的从他的怀里渗出来。\n\n戴笠的咽炎还没好,他 嘶哑着嗓子说:\" 我真想你“。她陪着戴笠在机场吃了最后一顿饭,戴笠提着行李箱下午飞往苏州。 \n\n现在想来,金菁也不知道戴笠什么时候一举成名,变成职业选手都认识的玩家。\n\n他的直播成千上万的人看,他的名字也曾上过百度头条,金菁只是日复一日的过起曾经不言不语的日子,她在小吃摊前想着那个头发半长,却依旧很精神的戴笠。\n\n第一个月金菁飞去苏州找他,他跟几个主播一起合租,桌上有成堆的沙县小吃外卖盒,戴笠的屋里乱成一团。她每月都会尽力去苏州看他,帮他做些吃的,收拾房间。\n\n戴笠的胃在苏州也被搞坏了,睡眠又很差,金菁常常会彻夜一语不发陪着他做完直播 ,然后抱着像个孩子一样的他哄他睡去。 \n\n渐渐很多姑娘喜欢戴笠,很多人喜欢他的直播。\n\n金菁的那个暑假没有回家,她帮戴笠开了一个淘宝店,她则在苏州找了一个兼职,戴笠每天打直播,她则在线下忙着联系发货卖货。\n\n此时的戴笠剪了短发,精神洋溢的。\n\n戴笠偶尔带她直播双排,她只选辅助或者ADC,戴笠也随她走着下路。\n\n他的ADC太浪,辅助英雄一个也没有,常常下路崩的一拍两散。\n\n金菁总会嘻嘻嘻的笑,戴笠也无奈的摸摸她的头\n\n。戴笠给金菁买了一条薄荷爱喜。\n\n他说你不是喜欢艾希么。\n\n第二年戴笠又给金菁买了一条她最喜欢的萨摩,说起来,那大概是戴笠唯一送给她的礼物了。\n\n戴笠叫他”小j8,“,后来金菁改成了盖伦。 \n\n金菁总在戒烟,可好像总也戒不掉。\n\n她看着戴笠的时候想抽,看不到的时候也想抽。\n\n戴笠打野的时候她就想我怎么不是蓝爸爸,戴笠在上路被抓时她就想骂中路的卡牌为什么不飞大,戴笠中路越塔时她就想冲进去替他抗塔。\n\n戴笠的吉他一直仍在角落,她无聊的时候就去擦拭,她看到频道里对戴笠疯狂爱慕的女生她会轻蔑的笑。\n\n她把戴笠的头抱在怀里,她想这样安抚他一辈子。 \n\n后来的事情就没有后来了,戴笠参加过一次线下比赛后,彻底火了。\n\n他回到了老家安徽,买了专用的电脑和椅子,专职做起了主播。\n\n她慢慢的把自己的很多都放到了戴笠家里,情侣的睡衣,拖鞋,牙刷,提莫的玩偶,寒冰的手办,她的帽衫们……她回到广州准备毕业答辩,她抱着论文的心情就像抱着结婚证书一样激动。\n\n她知道的,差不多。\n\n她开始想戒烟了,但是她舍不得。\n\n她一直记得戴笠第一次夸她的那个场景。\n\n两人坐在学校附近的路边,一起抽着烟。 \n\n戴笠摸着她的头说:“我会不逼你戒烟。“\n\n”哦,为什么呢?“\n\n”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“\n \n还没得知答辩结果的金菁就飞到了芜湖见戴笠,那就是人生里最狗血的一幕,大中午的戴笠睡在被窝里——那很正常,里面还有一个女人——那不正常。 \n再后来,她就什么都不知道了。\n \n她开始清醒的时候,就是一条一条写着戴笠生活习惯的时候\n \n——他不能吃辣不能吃隔夜不能吃真空包装不能喝牛奶他有起床气他胃病很严重他的咽炎需要抑制他的亲昵很少……。\n \n她不敢想他站在那个女人面前维护他的样子。\n \n就像自己的辅助,站到了对面ADC的身边。\n \n如果那还是个机器人,她一把把你抓到了他们的防御塔下,折磨你,打死你。\n \n她打开自己的游戏记录,几乎都是与戴笠一起双排的,他是ADC,或者他是打野。\n\n她闭上眼,写道:戴笠不爱打下路,不要逼他。 \n\n走的那天,金菁哭着说:戴笠,我要好好努力,我要去拳头公司,我要让他们在上路也有双人组合,我不要上单自己一个人! \n\n金菁好像真的把烟戒了。","source":"_posts/路下如烟.md","raw":"---\ntitle: 路下如烟\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 49268\ndate: 2018-08-07 13:04:33\n---\n(文.璟)\n\n“我会不逼你戒烟。“ \n\n”哦,为什么呢?“ \n\n”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“ \n\n金菁喜欢穿有帽子的衣服, 她觉得戴上帽子很有安全感。\n\n她在大学的时候不喜欢跟人说话,圈子很小,她熟稔一切能自己做的事情,比如画画,比如看书,比如打游戏,比如去学校附近的小酒吧安静的坐一夜。\n\n她最喜欢酒吧里一个总穿着帽衫,头发略长的瘦瘦的男生唱的歌,不像那些装蛋的摇滚,难听的嗓音在夜里爆炸出很多玻璃碎痕,让原本烦闷的人更烦闷。\n\n那个男生唱的歌总是温柔的老歌,或者日本动漫里的歌曲。\n\n金菁喜欢这两种风格,一种治愈她,一种填满她。 \n\n有天夜里,帽衫男生下班,背着吉他走出酒吧。\n\n金菁戴上帽子跟着他,帽衫男生点了一根烟,金菁也点了一根烟。\n\n男生走进了金菁的大学,金菁也跟他走进去。\n\n帽衫男生回过头来看着她,她也直视着男生。\n\n帽衫男生站在月亮的阴影下,他说:我认识你。我叫戴笠。 \n\n戴笠说他很久就前就注意到金菁了,总在他演唱的时候坐在最远的卡座上。\n\n戴笠说他不是这个大学的,他只是有个好朋友在这里上学,他来这个城市混日子,住在他宿舍里。 \n\n戴笠说有一次看到金菁穿着樱木花道的印花T恤,他就唱了一首《灌篮高手》的主题曲。\n\n戴笠说秋天看到金菁穿一件印着寒冰射手的帽衫,他的心怦然一跳。\n\n戴笠不怎么爱说话,在一起了一个月,金菁也只记住这些比较重要的。 \n\n金菁给戴笠买了很多帽衫,他俩经常手牵手去网吧双排。\n\n戴笠打的很好,尤其是坦克式英雄,金菁还有课业,打游戏的时间不多,戴笠每晚唱到两三点,就会去网吧通宵到早上,然后闷头睡一天。\n\n他俩相处的时间多是黑夜,路灯下每个小摊,金菁都知道他们的味道。\n\n戴笠唱歌需要嗓子,可他又极度依赖烟,唱的时间越来越短。金菁期末考试周时,戴笠得了咽炎。 \n\n金菁仿佛从那个时候开始,变成了贤妻良母。她不去泡图书馆,也不去参加集体活动,她偷偷买了小煮锅,给戴笠煮梨汤,省下钱去买化咽炎的药。\n\n戴笠没有了酒吧的工作,每天窝在男生寝室里打游戏,晚上出来跟金菁在操场散步,看着长腿的姑娘挽着挺拔的小伙。\n\n他俩在操场的尽头比赛似的抽烟,戴笠抽下金菁的烟,轻轻的亲吻她的嘴。 \n\n放了假的金菁回到老家,她在火车卧铺上就疯狂的想念戴笠。\n\n两个人在南北两地开着视频打rank,戴笠会用有些沙哑的嗓音给她唱歌,还会寄栗子糕给她。\n\n金菁开始留头发,开始每天在家里学煲粥和炖汤,她出门去买菜,喜欢萝卜刺眼的色彩。\n\n她买了所LOL里所有的情侣皮肤,她看到中路阿狸站在戴笠的蛮王身边,她会一撇嘴射出一道冰箭过去,暴击百分百。\n\n过完年了的某一天,戴笠截了一张最强王者的段位图给她,还有一张频道邀请主播函。\n\n金菁买了全套泳池皮肤送给他,事后想想好像戴笠只喜欢用里面的鳄鱼。 \n\n金菁回到广州上学,戴笠在机场用白色的大羽绒服裹住了她。\n\n她闻到浓浓的烟草味和CK香水味道,暖暖的从他的怀里渗出来。\n\n戴笠的咽炎还没好,他 嘶哑着嗓子说:\" 我真想你“。她陪着戴笠在机场吃了最后一顿饭,戴笠提着行李箱下午飞往苏州。 \n\n现在想来,金菁也不知道戴笠什么时候一举成名,变成职业选手都认识的玩家。\n\n他的直播成千上万的人看,他的名字也曾上过百度头条,金菁只是日复一日的过起曾经不言不语的日子,她在小吃摊前想着那个头发半长,却依旧很精神的戴笠。\n\n第一个月金菁飞去苏州找他,他跟几个主播一起合租,桌上有成堆的沙县小吃外卖盒,戴笠的屋里乱成一团。她每月都会尽力去苏州看他,帮他做些吃的,收拾房间。\n\n戴笠的胃在苏州也被搞坏了,睡眠又很差,金菁常常会彻夜一语不发陪着他做完直播 ,然后抱着像个孩子一样的他哄他睡去。 \n\n渐渐很多姑娘喜欢戴笠,很多人喜欢他的直播。\n\n金菁的那个暑假没有回家,她帮戴笠开了一个淘宝店,她则在苏州找了一个兼职,戴笠每天打直播,她则在线下忙着联系发货卖货。\n\n此时的戴笠剪了短发,精神洋溢的。\n\n戴笠偶尔带她直播双排,她只选辅助或者ADC,戴笠也随她走着下路。\n\n他的ADC太浪,辅助英雄一个也没有,常常下路崩的一拍两散。\n\n金菁总会嘻嘻嘻的笑,戴笠也无奈的摸摸她的头\n\n。戴笠给金菁买了一条薄荷爱喜。\n\n他说你不是喜欢艾希么。\n\n第二年戴笠又给金菁买了一条她最喜欢的萨摩,说起来,那大概是戴笠唯一送给她的礼物了。\n\n戴笠叫他”小j8,“,后来金菁改成了盖伦。 \n\n金菁总在戒烟,可好像总也戒不掉。\n\n她看着戴笠的时候想抽,看不到的时候也想抽。\n\n戴笠打野的时候她就想我怎么不是蓝爸爸,戴笠在上路被抓时她就想骂中路的卡牌为什么不飞大,戴笠中路越塔时她就想冲进去替他抗塔。\n\n戴笠的吉他一直仍在角落,她无聊的时候就去擦拭,她看到频道里对戴笠疯狂爱慕的女生她会轻蔑的笑。\n\n她把戴笠的头抱在怀里,她想这样安抚他一辈子。 \n\n后来的事情就没有后来了,戴笠参加过一次线下比赛后,彻底火了。\n\n他回到了老家安徽,买了专用的电脑和椅子,专职做起了主播。\n\n她慢慢的把自己的很多都放到了戴笠家里,情侣的睡衣,拖鞋,牙刷,提莫的玩偶,寒冰的手办,她的帽衫们……她回到广州准备毕业答辩,她抱着论文的心情就像抱着结婚证书一样激动。\n\n她知道的,差不多。\n\n她开始想戒烟了,但是她舍不得。\n\n她一直记得戴笠第一次夸她的那个场景。\n\n两人坐在学校附近的路边,一起抽着烟。 \n\n戴笠摸着她的头说:“我会不逼你戒烟。“\n\n”哦,为什么呢?“\n\n”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“\n \n还没得知答辩结果的金菁就飞到了芜湖见戴笠,那就是人生里最狗血的一幕,大中午的戴笠睡在被窝里——那很正常,里面还有一个女人——那不正常。 \n再后来,她就什么都不知道了。\n \n她开始清醒的时候,就是一条一条写着戴笠生活习惯的时候\n \n——他不能吃辣不能吃隔夜不能吃真空包装不能喝牛奶他有起床气他胃病很严重他的咽炎需要抑制他的亲昵很少……。\n \n她不敢想他站在那个女人面前维护他的样子。\n \n就像自己的辅助,站到了对面ADC的身边。\n \n如果那还是个机器人,她一把把你抓到了他们的防御塔下,折磨你,打死你。\n \n她打开自己的游戏记录,几乎都是与戴笠一起双排的,他是ADC,或者他是打野。\n\n她闭上眼,写道:戴笠不爱打下路,不要逼他。 \n\n走的那天,金菁哭着说:戴笠,我要好好努力,我要去拳头公司,我要让他们在上路也有双人组合,我不要上单自己一个人! \n\n金菁好像真的把烟戒了。","slug":"路下如烟","published":1,"updated":"2023-09-29T07:51:06.400Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyhn00gioko03c3q5piq","content":"

(文.璟)

\n

“我会不逼你戒烟。“

\n

”哦,为什么呢?“

\n

”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“

\n

金菁喜欢穿有帽子的衣服, 她觉得戴上帽子很有安全感。

\n

她在大学的时候不喜欢跟人说话,圈子很小,她熟稔一切能自己做的事情,比如画画,比如看书,比如打游戏,比如去学校附近的小酒吧安静的坐一夜。

\n

她最喜欢酒吧里一个总穿着帽衫,头发略长的瘦瘦的男生唱的歌,不像那些装蛋的摇滚,难听的嗓音在夜里爆炸出很多玻璃碎痕,让原本烦闷的人更烦闷。

\n

那个男生唱的歌总是温柔的老歌,或者日本动漫里的歌曲。

\n

金菁喜欢这两种风格,一种治愈她,一种填满她。

\n

有天夜里,帽衫男生下班,背着吉他走出酒吧。

\n

金菁戴上帽子跟着他,帽衫男生点了一根烟,金菁也点了一根烟。

\n

男生走进了金菁的大学,金菁也跟他走进去。

\n

帽衫男生回过头来看着她,她也直视着男生。

\n

帽衫男生站在月亮的阴影下,他说:我认识你。我叫戴笠。

\n

戴笠说他很久就前就注意到金菁了,总在他演唱的时候坐在最远的卡座上。

\n

戴笠说他不是这个大学的,他只是有个好朋友在这里上学,他来这个城市混日子,住在他宿舍里。

\n

戴笠说有一次看到金菁穿着樱木花道的印花T恤,他就唱了一首《灌篮高手》的主题曲。

\n

戴笠说秋天看到金菁穿一件印着寒冰射手的帽衫,他的心怦然一跳。

\n

戴笠不怎么爱说话,在一起了一个月,金菁也只记住这些比较重要的。

\n

金菁给戴笠买了很多帽衫,他俩经常手牵手去网吧双排。

\n

戴笠打的很好,尤其是坦克式英雄,金菁还有课业,打游戏的时间不多,戴笠每晚唱到两三点,就会去网吧通宵到早上,然后闷头睡一天。

\n

他俩相处的时间多是黑夜,路灯下每个小摊,金菁都知道他们的味道。

\n

戴笠唱歌需要嗓子,可他又极度依赖烟,唱的时间越来越短。金菁期末考试周时,戴笠得了咽炎。

\n

金菁仿佛从那个时候开始,变成了贤妻良母。她不去泡图书馆,也不去参加集体活动,她偷偷买了小煮锅,给戴笠煮梨汤,省下钱去买化咽炎的药。

\n

戴笠没有了酒吧的工作,每天窝在男生寝室里打游戏,晚上出来跟金菁在操场散步,看着长腿的姑娘挽着挺拔的小伙。

\n

他俩在操场的尽头比赛似的抽烟,戴笠抽下金菁的烟,轻轻的亲吻她的嘴。

\n

放了假的金菁回到老家,她在火车卧铺上就疯狂的想念戴笠。

\n

两个人在南北两地开着视频打rank,戴笠会用有些沙哑的嗓音给她唱歌,还会寄栗子糕给她。

\n

金菁开始留头发,开始每天在家里学煲粥和炖汤,她出门去买菜,喜欢萝卜刺眼的色彩。

\n

她买了所LOL里所有的情侣皮肤,她看到中路阿狸站在戴笠的蛮王身边,她会一撇嘴射出一道冰箭过去,暴击百分百。

\n

过完年了的某一天,戴笠截了一张最强王者的段位图给她,还有一张频道邀请主播函。

\n

金菁买了全套泳池皮肤送给他,事后想想好像戴笠只喜欢用里面的鳄鱼。

\n

金菁回到广州上学,戴笠在机场用白色的大羽绒服裹住了她。

\n

她闻到浓浓的烟草味和CK香水味道,暖暖的从他的怀里渗出来。

\n

戴笠的咽炎还没好,他 嘶哑着嗓子说:” 我真想你“。她陪着戴笠在机场吃了最后一顿饭,戴笠提着行李箱下午飞往苏州。

\n

现在想来,金菁也不知道戴笠什么时候一举成名,变成职业选手都认识的玩家。

\n

他的直播成千上万的人看,他的名字也曾上过百度头条,金菁只是日复一日的过起曾经不言不语的日子,她在小吃摊前想着那个头发半长,却依旧很精神的戴笠。

\n

第一个月金菁飞去苏州找他,他跟几个主播一起合租,桌上有成堆的沙县小吃外卖盒,戴笠的屋里乱成一团。她每月都会尽力去苏州看他,帮他做些吃的,收拾房间。

\n

戴笠的胃在苏州也被搞坏了,睡眠又很差,金菁常常会彻夜一语不发陪着他做完直播 ,然后抱着像个孩子一样的他哄他睡去。

\n

渐渐很多姑娘喜欢戴笠,很多人喜欢他的直播。

\n

金菁的那个暑假没有回家,她帮戴笠开了一个淘宝店,她则在苏州找了一个兼职,戴笠每天打直播,她则在线下忙着联系发货卖货。

\n

此时的戴笠剪了短发,精神洋溢的。

\n

戴笠偶尔带她直播双排,她只选辅助或者ADC,戴笠也随她走着下路。

\n

他的ADC太浪,辅助英雄一个也没有,常常下路崩的一拍两散。

\n

金菁总会嘻嘻嘻的笑,戴笠也无奈的摸摸她的头

\n

。戴笠给金菁买了一条薄荷爱喜。

\n

他说你不是喜欢艾希么。

\n

第二年戴笠又给金菁买了一条她最喜欢的萨摩,说起来,那大概是戴笠唯一送给她的礼物了。

\n

戴笠叫他”小j8,“,后来金菁改成了盖伦。

\n

金菁总在戒烟,可好像总也戒不掉。

\n

她看着戴笠的时候想抽,看不到的时候也想抽。

\n

戴笠打野的时候她就想我怎么不是蓝爸爸,戴笠在上路被抓时她就想骂中路的卡牌为什么不飞大,戴笠中路越塔时她就想冲进去替他抗塔。

\n

戴笠的吉他一直仍在角落,她无聊的时候就去擦拭,她看到频道里对戴笠疯狂爱慕的女生她会轻蔑的笑。

\n

她把戴笠的头抱在怀里,她想这样安抚他一辈子。

\n

后来的事情就没有后来了,戴笠参加过一次线下比赛后,彻底火了。

\n

他回到了老家安徽,买了专用的电脑和椅子,专职做起了主播。

\n

她慢慢的把自己的很多都放到了戴笠家里,情侣的睡衣,拖鞋,牙刷,提莫的玩偶,寒冰的手办,她的帽衫们……她回到广州准备毕业答辩,她抱着论文的心情就像抱着结婚证书一样激动。

\n

她知道的,差不多。

\n

她开始想戒烟了,但是她舍不得。

\n

她一直记得戴笠第一次夸她的那个场景。

\n

两人坐在学校附近的路边,一起抽着烟。

\n

戴笠摸着她的头说:“我会不逼你戒烟。“

\n

”哦,为什么呢?“

\n

”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“

\n

还没得知答辩结果的金菁就飞到了芜湖见戴笠,那就是人生里最狗血的一幕,大中午的戴笠睡在被窝里——那很正常,里面还有一个女人——那不正常。
再后来,她就什么都不知道了。

\n

她开始清醒的时候,就是一条一条写着戴笠生活习惯的时候

\n

——他不能吃辣不能吃隔夜不能吃真空包装不能喝牛奶他有起床气他胃病很严重他的咽炎需要抑制他的亲昵很少……。

\n

她不敢想他站在那个女人面前维护他的样子。

\n

就像自己的辅助,站到了对面ADC的身边。

\n

如果那还是个机器人,她一把把你抓到了他们的防御塔下,折磨你,打死你。

\n

她打开自己的游戏记录,几乎都是与戴笠一起双排的,他是ADC,或者他是打野。

\n

她闭上眼,写道:戴笠不爱打下路,不要逼他。

\n

走的那天,金菁哭着说:戴笠,我要好好努力,我要去拳头公司,我要让他们在上路也有双人组合,我不要上单自己一个人!

\n

金菁好像真的把烟戒了。

\n","site":{"data":{}},"more":"

(文.璟)

\n

“我会不逼你戒烟。“

\n

”哦,为什么呢?“

\n

”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“

\n

金菁喜欢穿有帽子的衣服, 她觉得戴上帽子很有安全感。

\n

她在大学的时候不喜欢跟人说话,圈子很小,她熟稔一切能自己做的事情,比如画画,比如看书,比如打游戏,比如去学校附近的小酒吧安静的坐一夜。

\n

她最喜欢酒吧里一个总穿着帽衫,头发略长的瘦瘦的男生唱的歌,不像那些装蛋的摇滚,难听的嗓音在夜里爆炸出很多玻璃碎痕,让原本烦闷的人更烦闷。

\n

那个男生唱的歌总是温柔的老歌,或者日本动漫里的歌曲。

\n

金菁喜欢这两种风格,一种治愈她,一种填满她。

\n

有天夜里,帽衫男生下班,背着吉他走出酒吧。

\n

金菁戴上帽子跟着他,帽衫男生点了一根烟,金菁也点了一根烟。

\n

男生走进了金菁的大学,金菁也跟他走进去。

\n

帽衫男生回过头来看着她,她也直视着男生。

\n

帽衫男生站在月亮的阴影下,他说:我认识你。我叫戴笠。

\n

戴笠说他很久就前就注意到金菁了,总在他演唱的时候坐在最远的卡座上。

\n

戴笠说他不是这个大学的,他只是有个好朋友在这里上学,他来这个城市混日子,住在他宿舍里。

\n

戴笠说有一次看到金菁穿着樱木花道的印花T恤,他就唱了一首《灌篮高手》的主题曲。

\n

戴笠说秋天看到金菁穿一件印着寒冰射手的帽衫,他的心怦然一跳。

\n

戴笠不怎么爱说话,在一起了一个月,金菁也只记住这些比较重要的。

\n

金菁给戴笠买了很多帽衫,他俩经常手牵手去网吧双排。

\n

戴笠打的很好,尤其是坦克式英雄,金菁还有课业,打游戏的时间不多,戴笠每晚唱到两三点,就会去网吧通宵到早上,然后闷头睡一天。

\n

他俩相处的时间多是黑夜,路灯下每个小摊,金菁都知道他们的味道。

\n

戴笠唱歌需要嗓子,可他又极度依赖烟,唱的时间越来越短。金菁期末考试周时,戴笠得了咽炎。

\n

金菁仿佛从那个时候开始,变成了贤妻良母。她不去泡图书馆,也不去参加集体活动,她偷偷买了小煮锅,给戴笠煮梨汤,省下钱去买化咽炎的药。

\n

戴笠没有了酒吧的工作,每天窝在男生寝室里打游戏,晚上出来跟金菁在操场散步,看着长腿的姑娘挽着挺拔的小伙。

\n

他俩在操场的尽头比赛似的抽烟,戴笠抽下金菁的烟,轻轻的亲吻她的嘴。

\n

放了假的金菁回到老家,她在火车卧铺上就疯狂的想念戴笠。

\n

两个人在南北两地开着视频打rank,戴笠会用有些沙哑的嗓音给她唱歌,还会寄栗子糕给她。

\n

金菁开始留头发,开始每天在家里学煲粥和炖汤,她出门去买菜,喜欢萝卜刺眼的色彩。

\n

她买了所LOL里所有的情侣皮肤,她看到中路阿狸站在戴笠的蛮王身边,她会一撇嘴射出一道冰箭过去,暴击百分百。

\n

过完年了的某一天,戴笠截了一张最强王者的段位图给她,还有一张频道邀请主播函。

\n

金菁买了全套泳池皮肤送给他,事后想想好像戴笠只喜欢用里面的鳄鱼。

\n

金菁回到广州上学,戴笠在机场用白色的大羽绒服裹住了她。

\n

她闻到浓浓的烟草味和CK香水味道,暖暖的从他的怀里渗出来。

\n

戴笠的咽炎还没好,他 嘶哑着嗓子说:” 我真想你“。她陪着戴笠在机场吃了最后一顿饭,戴笠提着行李箱下午飞往苏州。

\n

现在想来,金菁也不知道戴笠什么时候一举成名,变成职业选手都认识的玩家。

\n

他的直播成千上万的人看,他的名字也曾上过百度头条,金菁只是日复一日的过起曾经不言不语的日子,她在小吃摊前想着那个头发半长,却依旧很精神的戴笠。

\n

第一个月金菁飞去苏州找他,他跟几个主播一起合租,桌上有成堆的沙县小吃外卖盒,戴笠的屋里乱成一团。她每月都会尽力去苏州看他,帮他做些吃的,收拾房间。

\n

戴笠的胃在苏州也被搞坏了,睡眠又很差,金菁常常会彻夜一语不发陪着他做完直播 ,然后抱着像个孩子一样的他哄他睡去。

\n

渐渐很多姑娘喜欢戴笠,很多人喜欢他的直播。

\n

金菁的那个暑假没有回家,她帮戴笠开了一个淘宝店,她则在苏州找了一个兼职,戴笠每天打直播,她则在线下忙着联系发货卖货。

\n

此时的戴笠剪了短发,精神洋溢的。

\n

戴笠偶尔带她直播双排,她只选辅助或者ADC,戴笠也随她走着下路。

\n

他的ADC太浪,辅助英雄一个也没有,常常下路崩的一拍两散。

\n

金菁总会嘻嘻嘻的笑,戴笠也无奈的摸摸她的头

\n

。戴笠给金菁买了一条薄荷爱喜。

\n

他说你不是喜欢艾希么。

\n

第二年戴笠又给金菁买了一条她最喜欢的萨摩,说起来,那大概是戴笠唯一送给她的礼物了。

\n

戴笠叫他”小j8,“,后来金菁改成了盖伦。

\n

金菁总在戒烟,可好像总也戒不掉。

\n

她看着戴笠的时候想抽,看不到的时候也想抽。

\n

戴笠打野的时候她就想我怎么不是蓝爸爸,戴笠在上路被抓时她就想骂中路的卡牌为什么不飞大,戴笠中路越塔时她就想冲进去替他抗塔。

\n

戴笠的吉他一直仍在角落,她无聊的时候就去擦拭,她看到频道里对戴笠疯狂爱慕的女生她会轻蔑的笑。

\n

她把戴笠的头抱在怀里,她想这样安抚他一辈子。

\n

后来的事情就没有后来了,戴笠参加过一次线下比赛后,彻底火了。

\n

他回到了老家安徽,买了专用的电脑和椅子,专职做起了主播。

\n

她慢慢的把自己的很多都放到了戴笠家里,情侣的睡衣,拖鞋,牙刷,提莫的玩偶,寒冰的手办,她的帽衫们……她回到广州准备毕业答辩,她抱着论文的心情就像抱着结婚证书一样激动。

\n

她知道的,差不多。

\n

她开始想戒烟了,但是她舍不得。

\n

她一直记得戴笠第一次夸她的那个场景。

\n

两人坐在学校附近的路边,一起抽着烟。

\n

戴笠摸着她的头说:“我会不逼你戒烟。“

\n

”哦,为什么呢?“

\n

”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“

\n

还没得知答辩结果的金菁就飞到了芜湖见戴笠,那就是人生里最狗血的一幕,大中午的戴笠睡在被窝里——那很正常,里面还有一个女人——那不正常。
再后来,她就什么都不知道了。

\n

她开始清醒的时候,就是一条一条写着戴笠生活习惯的时候

\n

——他不能吃辣不能吃隔夜不能吃真空包装不能喝牛奶他有起床气他胃病很严重他的咽炎需要抑制他的亲昵很少……。

\n

她不敢想他站在那个女人面前维护他的样子。

\n

就像自己的辅助,站到了对面ADC的身边。

\n

如果那还是个机器人,她一把把你抓到了他们的防御塔下,折磨你,打死你。

\n

她打开自己的游戏记录,几乎都是与戴笠一起双排的,他是ADC,或者他是打野。

\n

她闭上眼,写道:戴笠不爱打下路,不要逼他。

\n

走的那天,金菁哭着说:戴笠,我要好好努力,我要去拳头公司,我要让他们在上路也有双人组合,我不要上单自己一个人!

\n

金菁好像真的把烟戒了。

\n"},{"title":"阿里悟空服务下线","excerpt":"","abbrlink":29655,"date":"2016-11-15T08:08:23.000Z","_content":"\n阿里悟空服务宣布于2016年10月31号正式下线,基于阿里悟空的phpwind移动版,基本上也可以宣告死亡了。 实际上phpwind早在两年前已经停止更新维护,目前的社区论坛程序discuz也处于停止更新维护的状态,伴随了广大草根站长走过十年岁月的两大社区程序也算是完成了自己的使命。 一直对社交网络不死心的阿里也放弃了pw是不是意味着社区论坛就此消亡。或者说,在将来不再会有个人草根站长了?毕竟网站开发维护的成本对于非IT人员来讲实在太过于高昂","source":"_posts/阿里悟空服务下线.md","raw":"---\ntitle: 阿里悟空服务下线\ntags:\n - 生活\n - 阿里\n - 阿里悟空\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 29655\ndate: 2016-11-15 16:08:23\n---\n\n阿里悟空服务宣布于2016年10月31号正式下线,基于阿里悟空的phpwind移动版,基本上也可以宣告死亡了。 实际上phpwind早在两年前已经停止更新维护,目前的社区论坛程序discuz也处于停止更新维护的状态,伴随了广大草根站长走过十年岁月的两大社区程序也算是完成了自己的使命。 一直对社交网络不死心的阿里也放弃了pw是不是意味着社区论坛就此消亡。或者说,在将来不再会有个人草根站长了?毕竟网站开发维护的成本对于非IT人员来讲实在太过于高昂","slug":"阿里悟空服务下线","published":1,"updated":"2023-09-29T07:51:06.400Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyho00gmoko02ixqh8db","content":"

阿里悟空服务宣布于2016年10月31号正式下线,基于阿里悟空的phpwind移动版,基本上也可以宣告死亡了。 实际上phpwind早在两年前已经停止更新维护,目前的社区论坛程序discuz也处于停止更新维护的状态,伴随了广大草根站长走过十年岁月的两大社区程序也算是完成了自己的使命。 一直对社交网络不死心的阿里也放弃了pw是不是意味着社区论坛就此消亡。或者说,在将来不再会有个人草根站长了?毕竟网站开发维护的成本对于非IT人员来讲实在太过于高昂

\n","site":{"data":{}},"more":"

阿里悟空服务宣布于2016年10月31号正式下线,基于阿里悟空的phpwind移动版,基本上也可以宣告死亡了。 实际上phpwind早在两年前已经停止更新维护,目前的社区论坛程序discuz也处于停止更新维护的状态,伴随了广大草根站长走过十年岁月的两大社区程序也算是完成了自己的使命。 一直对社交网络不死心的阿里也放弃了pw是不是意味着社区论坛就此消亡。或者说,在将来不再会有个人草根站长了?毕竟网站开发维护的成本对于非IT人员来讲实在太过于高昂

\n"},{"title":"黄易先生逝世","excerpt":"","abbrlink":4108,"date":"2017-04-07T11:49:16.000Z","_content":"\n> 香港武侠小说家黄易4月5日中风过世,享年65岁。 黄易原名黄祖强,1952年出生于香港,毕业于香港中文大学,求学期间专攻传统中国绘画,1989年辞去高薪工作,隐居大屿山专心从事写作。上世纪90年代以来,武侠小说进入低迷期,黄易却一扫“金庸之后无武侠”的局面,另辟疆土,开创了玄幻(《星际浪子》)、穿越(《寻秦记》)和异侠(《大唐双龙传》)三大流派,被称为“新武侠宗师”。 黄易最爱的两位武侠名家是金庸及司马翎,尤其是善于刻画人与人之间关系的司马翎,对黄易影响颇深。他开始创作武侠小说源自于喜爱武侠的外公,黄易的外公经常租武侠小说看,而黄易顺带也读遍了这些小说。不过黄易是先创作科幻小说,之后才创作的武侠小说,他的创作中不乏“时空机器”等穿越回古代的情节,大胆而又充满想象力。 起初黄易的武侠小说被认为“没有市场”,因此久久得不到发表和出版,出版界人士建议他改写科幻小说,他用一个星期的时间就创作了第一部科幻作品《月魔》,自此一发不可收拾,黄易相继写出了《上帝之谜》、《湖祭》等作品。他将科幻与武侠结合起来,因此创作出了玄幻、穿越和异侠三大流派,创立了“新武侠”。 1997年以来,黄易小说在内地开始出版。2012年,黄易停笔五年后复出,带来一本玄幻新作《日月当空》,正式将网络版权授权给网站。该书纸质版由湖南人民出版社以最快的速度第一时间推出,创下了黄易小说在内地出版的纪录。 “2012第七届中国作家富豪榜”中,黄易以240万元的年度版税收入首登作家富豪榜,排名第22位并获得“2012第七届中国作家富豪榜年度武侠宗师”奖项。 黄易的小说创作手法对于当代网络小说,尤其是风靡的玄幻小说影响很大,许多网络文学作者的创作风格都与黄易相似,黄易的多部小说也改编成了网络游戏,很受年轻人欢迎。 不少读者在闻讯黄易逝世后,很是伤感。他们说,当代武侠五大家“金古梁温黄”如今只剩金庸和温瑞安二位了。\n\n昨日刷微博突然听闻黄易先生逝世的消息,刚开始并不愿意相信这是真的消息。 黄易的故事天马行空,十分的具有创造力。可以说是网络各种网文的开山祖师。一点也不夸张。 读书时候读过寻秦记,大唐双龙传等等。仿佛打开了新世界的大门,原来武侠还可以是这样写。竟然会有如此奇绝的江湖。 金古梁温黄武侠五大家,现如今也就只剩下封笔已久的金庸和温瑞安了。\n\n# 人间从此无黄易 愿他只是穿越去了武侠世界","source":"_posts/黄易先生逝世.md","raw":"---\ntitle: 黄易先生逝世\ntags:\n - 生活\n - 黄易\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 4108\ndate: 2017-04-07 19:49:16\n---\n\n> 香港武侠小说家黄易4月5日中风过世,享年65岁。 黄易原名黄祖强,1952年出生于香港,毕业于香港中文大学,求学期间专攻传统中国绘画,1989年辞去高薪工作,隐居大屿山专心从事写作。上世纪90年代以来,武侠小说进入低迷期,黄易却一扫“金庸之后无武侠”的局面,另辟疆土,开创了玄幻(《星际浪子》)、穿越(《寻秦记》)和异侠(《大唐双龙传》)三大流派,被称为“新武侠宗师”。 黄易最爱的两位武侠名家是金庸及司马翎,尤其是善于刻画人与人之间关系的司马翎,对黄易影响颇深。他开始创作武侠小说源自于喜爱武侠的外公,黄易的外公经常租武侠小说看,而黄易顺带也读遍了这些小说。不过黄易是先创作科幻小说,之后才创作的武侠小说,他的创作中不乏“时空机器”等穿越回古代的情节,大胆而又充满想象力。 起初黄易的武侠小说被认为“没有市场”,因此久久得不到发表和出版,出版界人士建议他改写科幻小说,他用一个星期的时间就创作了第一部科幻作品《月魔》,自此一发不可收拾,黄易相继写出了《上帝之谜》、《湖祭》等作品。他将科幻与武侠结合起来,因此创作出了玄幻、穿越和异侠三大流派,创立了“新武侠”。 1997年以来,黄易小说在内地开始出版。2012年,黄易停笔五年后复出,带来一本玄幻新作《日月当空》,正式将网络版权授权给网站。该书纸质版由湖南人民出版社以最快的速度第一时间推出,创下了黄易小说在内地出版的纪录。 “2012第七届中国作家富豪榜”中,黄易以240万元的年度版税收入首登作家富豪榜,排名第22位并获得“2012第七届中国作家富豪榜年度武侠宗师”奖项。 黄易的小说创作手法对于当代网络小说,尤其是风靡的玄幻小说影响很大,许多网络文学作者的创作风格都与黄易相似,黄易的多部小说也改编成了网络游戏,很受年轻人欢迎。 不少读者在闻讯黄易逝世后,很是伤感。他们说,当代武侠五大家“金古梁温黄”如今只剩金庸和温瑞安二位了。\n\n昨日刷微博突然听闻黄易先生逝世的消息,刚开始并不愿意相信这是真的消息。 黄易的故事天马行空,十分的具有创造力。可以说是网络各种网文的开山祖师。一点也不夸张。 读书时候读过寻秦记,大唐双龙传等等。仿佛打开了新世界的大门,原来武侠还可以是这样写。竟然会有如此奇绝的江湖。 金古梁温黄武侠五大家,现如今也就只剩下封笔已久的金庸和温瑞安了。\n\n# 人间从此无黄易 愿他只是穿越去了武侠世界","slug":"黄易先生逝世","published":1,"updated":"2023-09-29T07:51:06.401Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cln4obyho00gpoko0e5c3cfiw","content":"
\n

香港武侠小说家黄易4月5日中风过世,享年65岁。 黄易原名黄祖强,1952年出生于香港,毕业于香港中文大学,求学期间专攻传统中国绘画,1989年辞去高薪工作,隐居大屿山专心从事写作。上世纪90年代以来,武侠小说进入低迷期,黄易却一扫“金庸之后无武侠”的局面,另辟疆土,开创了玄幻(《星际浪子》)、穿越(《寻秦记》)和异侠(《大唐双龙传》)三大流派,被称为“新武侠宗师”。 黄易最爱的两位武侠名家是金庸及司马翎,尤其是善于刻画人与人之间关系的司马翎,对黄易影响颇深。他开始创作武侠小说源自于喜爱武侠的外公,黄易的外公经常租武侠小说看,而黄易顺带也读遍了这些小说。不过黄易是先创作科幻小说,之后才创作的武侠小说,他的创作中不乏“时空机器”等穿越回古代的情节,大胆而又充满想象力。 起初黄易的武侠小说被认为“没有市场”,因此久久得不到发表和出版,出版界人士建议他改写科幻小说,他用一个星期的时间就创作了第一部科幻作品《月魔》,自此一发不可收拾,黄易相继写出了《上帝之谜》、《湖祭》等作品。他将科幻与武侠结合起来,因此创作出了玄幻、穿越和异侠三大流派,创立了“新武侠”。 1997年以来,黄易小说在内地开始出版。2012年,黄易停笔五年后复出,带来一本玄幻新作《日月当空》,正式将网络版权授权给网站。该书纸质版由湖南人民出版社以最快的速度第一时间推出,创下了黄易小说在内地出版的纪录。 “2012第七届中国作家富豪榜”中,黄易以240万元的年度版税收入首登作家富豪榜,排名第22位并获得“2012第七届中国作家富豪榜年度武侠宗师”奖项。 黄易的小说创作手法对于当代网络小说,尤其是风靡的玄幻小说影响很大,许多网络文学作者的创作风格都与黄易相似,黄易的多部小说也改编成了网络游戏,很受年轻人欢迎。 不少读者在闻讯黄易逝世后,很是伤感。他们说,当代武侠五大家“金古梁温黄”如今只剩金庸和温瑞安二位了。

\n
\n

昨日刷微博突然听闻黄易先生逝世的消息,刚开始并不愿意相信这是真的消息。 黄易的故事天马行空,十分的具有创造力。可以说是网络各种网文的开山祖师。一点也不夸张。 读书时候读过寻秦记,大唐双龙传等等。仿佛打开了新世界的大门,原来武侠还可以是这样写。竟然会有如此奇绝的江湖。 金古梁温黄武侠五大家,现如今也就只剩下封笔已久的金庸和温瑞安了。

\n

人间从此无黄易 愿他只是穿越去了武侠世界

","site":{"data":{}},"more":"
\n

香港武侠小说家黄易4月5日中风过世,享年65岁。 黄易原名黄祖强,1952年出生于香港,毕业于香港中文大学,求学期间专攻传统中国绘画,1989年辞去高薪工作,隐居大屿山专心从事写作。上世纪90年代以来,武侠小说进入低迷期,黄易却一扫“金庸之后无武侠”的局面,另辟疆土,开创了玄幻(《星际浪子》)、穿越(《寻秦记》)和异侠(《大唐双龙传》)三大流派,被称为“新武侠宗师”。 黄易最爱的两位武侠名家是金庸及司马翎,尤其是善于刻画人与人之间关系的司马翎,对黄易影响颇深。他开始创作武侠小说源自于喜爱武侠的外公,黄易的外公经常租武侠小说看,而黄易顺带也读遍了这些小说。不过黄易是先创作科幻小说,之后才创作的武侠小说,他的创作中不乏“时空机器”等穿越回古代的情节,大胆而又充满想象力。 起初黄易的武侠小说被认为“没有市场”,因此久久得不到发表和出版,出版界人士建议他改写科幻小说,他用一个星期的时间就创作了第一部科幻作品《月魔》,自此一发不可收拾,黄易相继写出了《上帝之谜》、《湖祭》等作品。他将科幻与武侠结合起来,因此创作出了玄幻、穿越和异侠三大流派,创立了“新武侠”。 1997年以来,黄易小说在内地开始出版。2012年,黄易停笔五年后复出,带来一本玄幻新作《日月当空》,正式将网络版权授权给网站。该书纸质版由湖南人民出版社以最快的速度第一时间推出,创下了黄易小说在内地出版的纪录。 “2012第七届中国作家富豪榜”中,黄易以240万元的年度版税收入首登作家富豪榜,排名第22位并获得“2012第七届中国作家富豪榜年度武侠宗师”奖项。 黄易的小说创作手法对于当代网络小说,尤其是风靡的玄幻小说影响很大,许多网络文学作者的创作风格都与黄易相似,黄易的多部小说也改编成了网络游戏,很受年轻人欢迎。 不少读者在闻讯黄易逝世后,很是伤感。他们说,当代武侠五大家“金古梁温黄”如今只剩金庸和温瑞安二位了。

\n
\n

昨日刷微博突然听闻黄易先生逝世的消息,刚开始并不愿意相信这是真的消息。 黄易的故事天马行空,十分的具有创造力。可以说是网络各种网文的开山祖师。一点也不夸张。 读书时候读过寻秦记,大唐双龙传等等。仿佛打开了新世界的大门,原来武侠还可以是这样写。竟然会有如此奇绝的江湖。 金古梁温黄武侠五大家,现如今也就只剩下封笔已久的金庸和温瑞安了。

\n

人间从此无黄易 愿他只是穿越去了武侠世界

"}],"PostAsset":[],"PostCategory":[{"post_id":"cln4obye70001oko0bxdi99ti","category_id":"cln4obyee0007oko00w5f68mk","_id":"cln4obyem000loko09wix19yk"},{"post_id":"cln4obyei000goko09d2y8wcc","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyen000noko0fb1j66xe"},{"post_id":"cln4obyea0003oko05qum4gg0","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyeo000roko01e6x96jj"},{"post_id":"cln4obyee0006oko07b6qfj4f","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyep000toko027e3cqsf"},{"post_id":"cln4obyem000moko09tf4dkmc","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyeq000xoko05p1maekc"},{"post_id":"cln4obyen000qoko02wqif5zw","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyer0010oko0e01netr3"},{"post_id":"cln4obyeg0009oko0gp7e41ho","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyes0015oko09uto41r0"},{"post_id":"cln4obyeo000soko05gkyaby7","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyet0018oko0gkdv72ii"},{"post_id":"cln4obyep000woko07djvfgw8","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyeu001coko098g7671y"},{"post_id":"cln4obyeh000boko0az3mcwjb","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyev001eoko01bmu4j6x"},{"post_id":"cln4obyeq000zoko01d00cfpt","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyew001ioko0gjm2c0z1"},{"post_id":"cln4obyej000hoko0hi7u43ug","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyez001koko0bzr3672w"},{"post_id":"cln4obyeu001doko0e993e7bg","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf0001noko0d8z57wtq"},{"post_id":"cln4obyel000koko0dnjgcbcx","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf1001roko06e4jbzg6"},{"post_id":"cln4obyev001foko0ccn1cieg","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf1001voko063250943"},{"post_id":"cln4obyer0013oko0257idpe3","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf2001zoko0hjvc5yvr"},{"post_id":"cln4obyew001joko0et1hdhch","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf20022oko04j2u56q8"},{"post_id":"cln4obyf0001poko0gmyr00wf","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf30025oko02lca8g0w"},{"post_id":"cln4obyes0017oko03vhpgdbl","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf30027oko007mogtql"},{"post_id":"cln4obyf1001xoko08uo5ghw4","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf4002aoko08wnah339"},{"post_id":"cln4obyf1001soko01igb6ki8","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf4002coko0414ae8oi"},{"post_id":"cln4obyet001aoko088smaz6z","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf5002eoko06irshol7"},{"post_id":"cln4obyf30026oko0a5a07rta","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf5002hoko0gcwef7sy"},{"post_id":"cln4obyf30028oko09ts6ekbs","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf6002joko09b0w8r6k"},{"post_id":"cln4obyf4002boko0c90100qh","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf6002moko0fz6g2ov3"},{"post_id":"cln4obyf4002doko081pe6hp0","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf7002poko08t2pglap"},{"post_id":"cln4obyf5002goko06uq18aps","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf7002toko01gcs6h43"},{"post_id":"cln4obyf5002ioko0au7d42v6","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf8002woko0csjf2obl"},{"post_id":"cln4obyf6002loko07qa636nw","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf90030oko0f1cz5bvt"},{"post_id":"cln4obyf6002ooko07fxmbgky","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf90033oko08sxlh7t7"},{"post_id":"cln4obyf7002roko0gjnt49x5","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyfa0035oko0ed1s31lr"},{"post_id":"cln4obyf7002voko07ln09w8r","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyfb0039oko08uew2z0x"},{"post_id":"cln4obyf8002yoko0h5w9fg2u","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyfb003boko0hbsy5nps"},{"post_id":"cln4obyfa0034oko0b2okccuw","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyfb003eoko08sk599eo"},{"post_id":"cln4obyf90032oko03ow66itc","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyfb003foko0h53m1hxz"},{"post_id":"cln4obygg00aloko092hr1ozm","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygj00aroko0eqxtg04g"},{"post_id":"cln4obygh00amoko02r8ia768","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygk00atoko0fo8mgnp0"},{"post_id":"cln4obygi00aooko0evlmaeis","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygl00awoko0ezbmey4u"},{"post_id":"cln4obygj00asoko0ctp79eo3","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygl00b0oko0h6irb36b"},{"post_id":"cln4obygi00aqoko01uj5098h","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygm00b2oko02o6ngu0p"},{"post_id":"cln4obygk00avoko05lpmhi95","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygm00b5oko0cvrdbxey"},{"post_id":"cln4obygl00azoko066h93056","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygn00b8oko0417vg3da"},{"post_id":"cln4obygl00axoko039iy1kiz","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygn00bcoko0gu7514ap"},{"post_id":"cln4obygm00b1oko07rdt1v5y","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygo00bfoko0fyy6ep8n"},{"post_id":"cln4obygm00b4oko05ez0aioh","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygo00bioko03gnne1mb"},{"post_id":"cln4obygn00b7oko01rmaep60","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygp00bloko00cc1ako5"},{"post_id":"cln4obygn00bboko04ivg7ado","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygp00bnoko0g9848bel"},{"post_id":"cln4obygo00bhoko0ff58cnor","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygq00bqoko0845b3qae"},{"post_id":"cln4obygo00beoko0cvrs4xid","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygq00btoko0eoq5hr6v"},{"post_id":"cln4obygp00bkoko03c7x68kt","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygq00bwoko04930evxm"},{"post_id":"cln4obygp00bmoko06e55e2qs","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygr00bzoko04pv421os"},{"post_id":"cln4obygp00bpoko04ksq9jyj","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygr00c3oko09cb52sow"},{"post_id":"cln4obygq00bsoko0b3m95fuz","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygs00c6oko08iiacscl"},{"post_id":"cln4obygq00bvoko03fm2af8w","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygs00c9oko01c58gtq0"},{"post_id":"cln4obygr00byoko0f9geg7qr","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygt00ccoko07en9gd7r"},{"post_id":"cln4obygr00c2oko0g5g17r02","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygt00ceoko0f6mm9xdk"},{"post_id":"cln4obygr00c5oko05iw6cb5r","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygu00choko0ax1p2swx"},{"post_id":"cln4obygs00c8oko05vou10rf","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygu00ckoko03sk06ea5"},{"post_id":"cln4obygs00cboko02qmzgblk","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obygv00cooko01h4ehz8s"},{"post_id":"cln4obygt00cgoko0g20id478","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygv00cqoko0hgzh4hl9"},{"post_id":"cln4obygt00cdoko01rbg7j16","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygw00ctoko0668t3gf4"},{"post_id":"cln4obygu00cjoko08k2w4av4","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygw00cvoko0gn9p2voe"},{"post_id":"cln4obygu00cnoko0c80rcm8v","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygx00cxoko02fxfgdq8"},{"post_id":"cln4obygv00cpoko00gjxbw2h","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygx00d0oko00ntrh0sv"},{"post_id":"cln4obygv00csoko0btaq8ef7","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygy00d2oko0bm2q6k4t"},{"post_id":"cln4obygw00cuoko09nzsflwl","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygy00d6oko0fcac3pwe"},{"post_id":"cln4obygx00cwoko009q83i3o","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygz00d9oko0h45y0ep7"},{"post_id":"cln4obygx00czoko04ykd651a","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyh000ddoko0cudchmfm"},{"post_id":"cln4obygx00d1oko01vzifqgg","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh000dgoko0bfh0etqc"},{"post_id":"cln4obygy00d5oko08ebcgf9r","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh100dkoko0fni66wnz"},{"post_id":"cln4obygy00d8oko0grs88ez1","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyh200dnoko050qt2rmd"},{"post_id":"cln4obygz00dcoko06zdsbodi","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh200droko052sv5qrp"},{"post_id":"cln4obyh000dfoko091xdhsru","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyh300duoko0ajiscwf7"},{"post_id":"cln4obyh100djoko0f515b8ii","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh400dyoko05g3176ug"},{"post_id":"cln4obyh100dmoko02qj9fqke","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh400e1oko0del78b54"},{"post_id":"cln4obyh200dqoko0hanoeoxo","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh500e4oko02jox1nfd"},{"post_id":"cln4obyh300dtoko02up90jo7","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh600e8oko0gahzhwqi"},{"post_id":"cln4obyh300dxoko0aq8n03yw","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh700eboko013m5f75f"},{"post_id":"cln4obyh400e0oko0e4rr7rn9","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh800efoko0eim9fewr"},{"post_id":"cln4obyh500e3oko061ca3uey","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyh800eioko0axu9a8g9"},{"post_id":"cln4obyh500e7oko08s7t4jc0","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyh900eloko0eoxh68ru"},{"post_id":"cln4obyh600eaoko02f4m5jpj","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyha00eooko05o6ccbrd"},{"post_id":"cln4obyh700eeoko0c2cc6kbe","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhb00esoko02svrhekb"},{"post_id":"cln4obyh800ehoko043fs54g2","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhc00evoko0g09bgt9a"},{"post_id":"cln4obyh900ekoko03fm38moi","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhf00ezoko02ylw1ktb"},{"post_id":"cln4obyha00enoko04qe92oak","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhf00f2oko0f5y180cx"},{"post_id":"cln4obyhb00eroko0f4qacnho","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhg00f5oko032juftw5"},{"post_id":"cln4obyhb00euoko0fwkeeu7o","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhg00f9oko0a3ttdv32"},{"post_id":"cln4obyhc00eyoko0h93khtt7","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhh00fcoko0b4jx18qt"},{"post_id":"cln4obyhf00f1oko0051d659o","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhh00fgoko0bje4ehc7"},{"post_id":"cln4obyhg00f4oko0c91sbrhj","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhi00fjoko0f2xp98qt"},{"post_id":"cln4obyhg00f8oko0dpxihe04","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhi00fnoko0bwssdara"},{"post_id":"cln4obyhh00fboko02q2x30mc","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhj00fqoko0anr54qfy"},{"post_id":"cln4obyhi00fioko0d3mecfeg","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhj00ftoko0ax7y3mnj"},{"post_id":"cln4obyhh00ffoko0fofe62zd","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhk00fwoko01kevd6vj"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhk00fzoko02vl7ehmx"},{"post_id":"cln4obyhj00fsoko05rs764v5","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhl00g3oko0hk0262qz"},{"post_id":"cln4obyhi00fpoko08kqtatpb","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhl00g6oko0gf682340"},{"post_id":"cln4obyhk00fyoko08mj1164d","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhm00gaoko00adjcrwn"},{"post_id":"cln4obyhj00fvoko07p789xfu","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhn00gdoko0fmpfggky"},{"post_id":"cln4obyhl00g2oko0effdh6o6","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhn00ggoko0flrxgjmq"},{"post_id":"cln4obyhl00g5oko09tei1t3o","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyho00gjoko03ft5b0pv"},{"post_id":"cln4obyhm00g9oko08z1r71at","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyho00gnoko04u3h4g40"},{"post_id":"cln4obyhm00gcoko081xv48y9","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhp00gqoko09i8t33qp"},{"post_id":"cln4obyhn00gfoko05tafeumv","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhp00gsoko0fcmfft3a"},{"post_id":"cln4obyhn00gioko03c3q5piq","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhp00gvoko094yo4ohe"},{"post_id":"cln4obyho00gmoko02ixqh8db","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhp00gxoko00cyo0nwr"},{"post_id":"cln4obyho00gpoko0e5c3cfiw","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhp00gzoko0efdk2cdh"}],"PostTag":[{"post_id":"cln4obye70001oko0bxdi99ti","tag_id":"cln4obyeb0004oko0cugx8sp1","_id":"cln4obyei000eoko0hjsa5rhd"},{"post_id":"cln4obyea0003oko05qum4gg0","tag_id":"cln4obyeh000coko0h97kfin2","_id":"cln4obyeq000yoko0dvb4b6gp"},{"post_id":"cln4obyea0003oko05qum4gg0","tag_id":"cln4obyek000ioko0ckyl1g8e","_id":"cln4obyer0011oko0fwimamr5"},{"post_id":"cln4obyea0003oko05qum4gg0","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyes0016oko04s2207ix"},{"post_id":"cln4obyee0006oko07b6qfj4f","tag_id":"cln4obyep000voko07zdg3qel","_id":"cln4obyf1001qoko0duhkadv1"},{"post_id":"cln4obyee0006oko07b6qfj4f","tag_id":"cln4obyer0014oko0g1swad00","_id":"cln4obyf1001uoko0gux28m6f"},{"post_id":"cln4obyee0006oko07b6qfj4f","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyf2001yoko0bh8qgzdq"},{"post_id":"cln4obyee0006oko07b6qfj4f","tag_id":"cln4obyev001hoko0ak9bd2re","_id":"cln4obyf20021oko0hhtpfupd"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf0001ooko09ly74alq","_id":"cln4obyf6002noko06q593dye"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf1001woko02sl8dwge","_id":"cln4obyf7002qoko024hw6vi8"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf30024oko0dopf8gre","_id":"cln4obyf7002uoko0c81d5t2o"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf40029oko08j9dg6hj","_id":"cln4obyf8002xoko012ua96kv"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf5002foko0e4ol5ti1","_id":"cln4obyf90031oko0265pgyk5"},{"post_id":"cln4obyeh000boko0az3mcwjb","tag_id":"cln4obyf6002koko07m797b51","_id":"cln4obyfb0038oko09n1942t6"},{"post_id":"cln4obyeh000boko0az3mcwjb","tag_id":"cln4obyf7002soko0bd22hvxk","_id":"cln4obyfb003aoko0bx008r1j"},{"post_id":"cln4obyeh000boko0az3mcwjb","tag_id":"cln4obyf9002zoko0dbcf6394","_id":"cln4obyfb003doko0bzrfesso"},{"post_id":"cln4obyei000goko09d2y8wcc","tag_id":"cln4obyfa0036oko04fvq8k76","_id":"cln4obyfc003joko0hkopebxv"},{"post_id":"cln4obyei000goko09d2y8wcc","tag_id":"cln4obyfb003coko070mn9c8u","_id":"cln4obyfc003koko0hcf8fcs1"},{"post_id":"cln4obyei000goko09d2y8wcc","tag_id":"cln4obyfb003goko0a9xwaadv","_id":"cln4obyfc003moko050lb4peu"},{"post_id":"cln4obyei000goko09d2y8wcc","tag_id":"cln4obyfb003hoko0cnjrfp1q","_id":"cln4obyfc003noko08nvm3ys5"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003ioko05ozmbwp6","_id":"cln4obyfe003yoko0hrsmg7fy"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003loko0fhtf3q5i","_id":"cln4obyfe003zoko0dplsbea3"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003ooko0f4pxcut5","_id":"cln4obyfe0041oko0bvrdcdme"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003poko0c10rcgmq","_id":"cln4obyfe0042oko0efw6gsf0"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003qoko099apdqud","_id":"cln4obyfe0044oko0dz8l055d"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003roko0g8t19lrn","_id":"cln4obyfe0045oko0bgax4m1h"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfd003soko0degl63a9","_id":"cln4obyfe0047oko0gsaxafyl"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfd003toko0es181r6c","_id":"cln4obyfe0048oko0bpfaf1t6"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfd003uoko0aizfbxd0","_id":"cln4obyff004aoko0at1nc0om"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfd003voko0fre2ad9o","_id":"cln4obyff004boko0ged5h8rw"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfe003woko0edfve527","_id":"cln4obyff004coko0c0v84tcd"},{"post_id":"cln4obyel000koko0dnjgcbcx","tag_id":"cln4obyfe003xoko0bip1enfz","_id":"cln4obyff004eoko0bwp8bkrv"},{"post_id":"cln4obyel000koko0dnjgcbcx","tag_id":"cln4obyfe0040oko0af41d34o","_id":"cln4obyff004foko00ox5a330"},{"post_id":"cln4obyem000moko09tf4dkmc","tag_id":"cln4obyfa0036oko04fvq8k76","_id":"cln4obyff004hoko09k2ae6s4"},{"post_id":"cln4obyem000moko09tf4dkmc","tag_id":"cln4obyfe0046oko0ars92dgk","_id":"cln4obyff004ioko0114zfds5"},{"post_id":"cln4obyen000qoko02wqif5zw","tag_id":"cln4obyff0049oko0f3v0232s","_id":"cln4obyfg004koko07pqu2njh"},{"post_id":"cln4obyen000qoko02wqif5zw","tag_id":"cln4obyff004doko0185sdz6m","_id":"cln4obyfg004loko01uachm18"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyff004goko02i8j40a7","_id":"cln4obyfg004qoko07qwk250c"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyff004joko02hoa364n","_id":"cln4obyfg004roko07pyghx4j"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyfg004moko0dahvcxw1","_id":"cln4obyfh004toko05qr8a6ji"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyfg004noko0a0wseddv","_id":"cln4obyfh004uoko03m3efz0x"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyfg004ooko07ymac5z3","_id":"cln4obyfh004woko0h9e26wu5"},{"post_id":"cln4obyep000woko07djvfgw8","tag_id":"cln4obyfg004poko06sf1af7e","_id":"cln4obyfh004xoko08fvz2apr"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfg004soko03zulb32n","_id":"cln4obyfi0054oko0btq29opj"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfh004voko0e9crhizc","_id":"cln4obyfi0055oko0fcz2hq61"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfc003ioko05ozmbwp6","_id":"cln4obyfi0057oko033n84tf7"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfc003loko0fhtf3q5i","_id":"cln4obyfi0058oko00nne6las"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfc003poko0c10rcgmq","_id":"cln4obyfi005aoko08358fpit"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfi0051oko079h22g02","_id":"cln4obyfi005boko0hstq54ue"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfi0052oko0gnlq89d7","_id":"cln4obyfj005doko04n8c7uj0"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfe003xoko0bip1enfz","_id":"cln4obyfk005ioko098ikgq1u"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfi0056oko094np55j3","_id":"cln4obyfl005joko0day5a096"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfi0059oko00rgk866o","_id":"cln4obyfl005loko0e2og49a3"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfj005coko0a27u6b2k","_id":"cln4obyfl005moko018pm9yaj"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfj005eoko0dwqg658o","_id":"cln4obyfl005ooko0bv8j2t7w"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfj005foko01rim391a","_id":"cln4obyfl005poko0eyf07r6c"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfj005goko09lv9b8wv","_id":"cln4obyfl005roko04ddg8ru2"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfk005hoko05ng1gf0f","_id":"cln4obyfm005xoko02y8w48q8"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005koko0d5ancnga","_id":"cln4obyfm005yoko0eq7x9pf3"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005noko0ctv2d2gg","_id":"cln4obyfn0060oko09vlq9boe"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005qoko01e199bsl","_id":"cln4obyfn0061oko062085lxz"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005soko03falbgx1","_id":"cln4obyfn0063oko048s51iay"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005toko00fhudbgf","_id":"cln4obyfn0064oko05fatdhbe"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005uoko0aw3779gs","_id":"cln4obyfn0066oko0d5r73nbj"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyfo0067oko0aahag4wb"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyfo006coko02y0efixk"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyfp006doko0a67a0f1g"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfl005koko0d5ancnga","_id":"cln4obyfp006foko005xs1msv"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfn0065oko0b3kx7l6g","_id":"cln4obyfp006goko00pmkd0qi"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfo0068oko07o9sh7is","_id":"cln4obyfp006ioko0f9o50ghb"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfo0069oko0fyyt2ksn","_id":"cln4obyfp006joko00lb693ys"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfo006aoko0df8sc5z0","_id":"cln4obyfq006loko06ve8gmo7"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfo006boko0c5o43ryw","_id":"cln4obyfq006poko09uqda98d"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfk005hoko05ng1gf0f","_id":"cln4obyfq006qoko0cmls2pz0"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfl005toko00fhudbgf","_id":"cln4obyfr006soko0eegicuw4"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfn0065oko0b3kx7l6g","_id":"cln4obyfr006toko03bg18sto"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfq006moko070yy5gmd","_id":"cln4obyfr006voko0bhckfdma"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfo0068oko07o9sh7is","_id":"cln4obyfr006woko01jppdh9w"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfq006ooko0enb94e1q","_id":"cln4obyfs0070oko00kqx332k"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfo006boko0c5o43ryw","_id":"cln4obyfs0071oko065q204yk"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfr006uoko0hessa6jp","_id":"cln4obyfs0073oko00r9md9xw"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfr006xoko0dkq4addp","_id":"cln4obyfs0074oko0hc1kcdbk"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfr006yoko06ansck8z","_id":"cln4obyfs0076oko05j2t124u"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyfs006zoko084p22ij4","_id":"cln4obyfu007coko0608ybihn"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyfl005soko03falbgx1","_id":"cln4obyfu007doko01a8x4y35"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyfl005toko00fhudbgf","_id":"cln4obyfu007foko09c1l9442"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyfn0065oko0b3kx7l6g","_id":"cln4obyfu007goko0bcy59qib"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyft0078oko0g6r210tk","_id":"cln4obyfu007ioko02uhq9igb"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyft0079oko0fwb0d0rq","_id":"cln4obyfu007joko0ex4h27uz"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyft007aoko0e1jm5vb9","_id":"cln4obyfv007loko0hn074mrl"},{"post_id":"cln4obyez001loko06bsidojx","tag_id":"cln4obyft007boko00uxp590r","_id":"cln4obyfv007moko089ch4uq7"},{"post_id":"cln4obyf0001poko0gmyr00wf","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyfv007noko05wi64wsg"},{"post_id":"cln4obyf0001poko0gmyr00wf","tag_id":"cln4obyfu007hoko01llt1ldr","_id":"cln4obyfv007poko0fx274b13"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfu007koko0e8r9gb7f","_id":"cln4obyfx007xoko02y0d9ngo"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfv007ooko0ewfb33jv","_id":"cln4obyfx007yoko0hukzdi5k"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfu007hoko01llt1ldr","_id":"cln4obyfy0080oko0gtb3ehjp"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyft007boko00uxp590r","_id":"cln4obyfy0081oko08vcdaz8f"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfw007soko08mdv34vx","_id":"cln4obyfy0083oko06cxj59nb"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfw007toko00utj1uy9","_id":"cln4obyfy0084oko0dher6xsy"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfw007uoko088ga8hga","_id":"cln4obyfy0086oko0a4xqakt5"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfx007voko00nwcep58","_id":"cln4obyfy0087oko0alq714xo"},{"post_id":"cln4obyf1001xoko08uo5ghw4","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyfy0089oko0a2k9e4r4"},{"post_id":"cln4obyf1001xoko08uo5ghw4","tag_id":"cln4obyfu007hoko01llt1ldr","_id":"cln4obyfy008aoko07jx944iv"},{"post_id":"cln4obyf1001xoko08uo5ghw4","tag_id":"cln4obyft007boko00uxp590r","_id":"cln4obyfy008coko05orv2mbm"},{"post_id":"cln4obyf1001xoko08uo5ghw4","tag_id":"cln4obyfy0085oko0houqbjg3","_id":"cln4obyfy008doko0a7rfdr01"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyfz008joko0ei541pxo"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyft0078oko0g6r210tk","_id":"cln4obyfz008koko0294dh3mz"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfu007hoko01llt1ldr","_id":"cln4obyfz008moko07okt3fm3"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfz008foko0gfl2euzj","_id":"cln4obyfz008noko0h6wz95k0"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfz008goko0bs5ob868","_id":"cln4obyfz008poko00gpscxfx"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfz008hoko06lk1dais","_id":"cln4obyfz008qoko028yyb718"},{"post_id":"cln4obyf20023oko0hxdl1nde","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyg0008toko0fdu8hnp9"},{"post_id":"cln4obyf20023oko0hxdl1nde","tag_id":"cln4obyfz008loko078j52vrf","_id":"cln4obyg0008uoko00er66dif"},{"post_id":"cln4obyf20023oko0hxdl1nde","tag_id":"cln4obyfz008ooko0aomf7hch","_id":"cln4obyg0008woko0biap73p1"},{"post_id":"cln4obyf20023oko0hxdl1nde","tag_id":"cln4obyfz008roko01nqx0fsq","_id":"cln4obyg0008xoko0fsx909w0"},{"post_id":"cln4obyf30026oko0a5a07rta","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyg00091oko0cvnd2rgv"},{"post_id":"cln4obyf30026oko0a5a07rta","tag_id":"cln4obyfo006boko0c5o43ryw","_id":"cln4obyg00092oko02gtb4rvn"},{"post_id":"cln4obyf30026oko0a5a07rta","tag_id":"cln4obyfk005hoko05ng1gf0f","_id":"cln4obyg00094oko0e5tt847d"},{"post_id":"cln4obyf30026oko0a5a07rta","tag_id":"cln4obyg0008zoko08cww9qhw","_id":"cln4obyg00095oko0an1v4lwu"},{"post_id":"cln4obyf30028oko09ts6ekbs","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyg10099oko05sjp2xr1"},{"post_id":"cln4obyf30028oko09ts6ekbs","tag_id":"cln4obyfl005koko0d5ancnga","_id":"cln4obyg1009aoko05o5j0ew0"},{"post_id":"cln4obyf30028oko09ts6ekbs","tag_id":"cln4obyg10096oko0bezkfns4","_id":"cln4obyg1009coko0ae8o2cmd"},{"post_id":"cln4obyf30028oko09ts6ekbs","tag_id":"cln4obyg10097oko09c9d9t2a","_id":"cln4obyg1009doko017lia4lc"},{"post_id":"cln4obyf4002boko0c90100qh","tag_id":"cln4obyfj005coko0a27u6b2k","_id":"cln4obyg1009foko0gl71elqi"},{"post_id":"cln4obyf4002boko0c90100qh","tag_id":"cln4obyg1009boko06w4beigl","_id":"cln4obyg1009goko0azd2ezzh"},{"post_id":"cln4obyf4002doko081pe6hp0","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyg2009loko06avp7hgl"},{"post_id":"cln4obyf4002doko081pe6hp0","tag_id":"cln4obyfl005uoko0aw3779gs","_id":"cln4obyg2009moko006tv3kc1"},{"post_id":"cln4obyf4002doko081pe6hp0","tag_id":"cln4obyg1009ioko0gg7tco4r","_id":"cln4obyg3009ooko0glwrbll3"},{"post_id":"cln4obyf4002doko081pe6hp0","tag_id":"cln4obyg2009joko08krladfl","_id":"cln4obyg3009poko0brpq6n7m"},{"post_id":"cln4obyf5002goko06uq18aps","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyg3009soko00qvn2it3"},{"post_id":"cln4obyf5002goko06uq18aps","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyg3009toko08i0b8jdj"},{"post_id":"cln4obyf5002goko06uq18aps","tag_id":"cln4obyg3009qoko0cn651b3w","_id":"cln4obyg3009voko08m7f23cj"},{"post_id":"cln4obyf5002ioko0au7d42v6","tag_id":"cln4obyg3009roko05kqj9rhu","_id":"cln4obyg4009yoko0ed105ytl"},{"post_id":"cln4obyf5002ioko0au7d42v6","tag_id":"cln4obyg3009uoko05vj9610g","_id":"cln4obyg4009zoko0fw3d3pad"},{"post_id":"cln4obyf5002ioko0au7d42v6","tag_id":"cln4obyg4009woko07rkcbdb6","_id":"cln4obyg400a1oko0553dczgn"},{"post_id":"cln4obyf6002loko07qa636nw","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyg500a3oko0arx4elh6"},{"post_id":"cln4obyf6002loko07qa636nw","tag_id":"cln4obyg400a0oko0hcm058xd","_id":"cln4obyg500a4oko00pbd93on"},{"post_id":"cln4obyf7002roko0gjnt49x5","tag_id":"cln4obyg400a2oko06rbr7rkj","_id":"cln4obyg500a6oko03juk84sl"},{"post_id":"cln4obyf7002voko07ln09w8r","tag_id":"cln4obyg10097oko09c9d9t2a","_id":"cln4obyg600aaoko03ffm2f0i"},{"post_id":"cln4obyf7002voko07ln09w8r","tag_id":"cln4obyg500a7oko05ese8whb","_id":"cln4obyg600aboko053bw7neg"},{"post_id":"cln4obyf7002voko07ln09w8r","tag_id":"cln4obyg500a8oko0hfx11cu2","_id":"cln4obyg600adoko0drqo1smh"},{"post_id":"cln4obyf90032oko03ow66itc","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyg600aeoko0e7n78y8f"},{"post_id":"cln4obyf90032oko03ow66itc","tag_id":"cln4obyg500a9oko094eefiwp","_id":"cln4obyg600agoko02me940z8"},{"post_id":"cln4obyfa0034oko0b2okccuw","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyg700aioko0egsd3h5l"},{"post_id":"cln4obyfa0034oko0b2okccuw","tag_id":"cln4obyg600afoko0324pefp0","_id":"cln4obyg700ajoko09a5kg0wr"},{"post_id":"cln4obyfa0034oko0b2okccuw","tag_id":"cln4obyg700ahoko0094fg015","_id":"cln4obyg700akoko08n8r4iro"},{"post_id":"cln4obygh00amoko02r8ia768","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obygi00apoko03wct9zd3"},{"post_id":"cln4obygg00aloko092hr1ozm","tag_id":"cln4obygi00anoko0h7xy3kro","_id":"cln4obygm00b6oko0eg2ogbqo"},{"post_id":"cln4obygg00aloko092hr1ozm","tag_id":"cln4obygk00auoko0ew5l9qau","_id":"cln4obygn00b9oko09nohbbrm"},{"post_id":"cln4obygg00aloko092hr1ozm","tag_id":"cln4obygl00ayoko0c7g4a8cx","_id":"cln4obygo00bdoko0hhv30q5t"},{"post_id":"cln4obygi00aooko0evlmaeis","tag_id":"cln4obygm00b3oko024840wdq","_id":"cln4obygo00bgoko0cjgw1rvs"},{"post_id":"cln4obygp00bmoko06e55e2qs","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obygq00broko06qs07c13"},{"post_id":"cln4obygi00aqoko01uj5098h","tag_id":"cln4obygn00baoko00p0418i1","_id":"cln4obygq00bxoko0cvkqg85m"},{"post_id":"cln4obygi00aqoko01uj5098h","tag_id":"cln4obygo00bjoko05fh33w1g","_id":"cln4obygr00c0oko09q8cejqy"},{"post_id":"cln4obygi00aqoko01uj5098h","tag_id":"cln4obygp00booko0hfjw64ak","_id":"cln4obygr00c4oko0c6cl3obc"},{"post_id":"cln4obygj00asoko0ctp79eo3","tag_id":"cln4obygq00buoko03rov894b","_id":"cln4obygs00c7oko0fmb39qt5"},{"post_id":"cln4obygk00avoko05lpmhi95","tag_id":"cln4obygr00c1oko00zbqfarw","_id":"cln4obygu00cioko0dz8y52bc"},{"post_id":"cln4obygk00avoko05lpmhi95","tag_id":"cln4obygs00caoko0f8vdc35j","_id":"cln4obygu00cloko0dyjc2ptt"},{"post_id":"cln4obygx00czoko04ykd651a","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obygy00d4oko04sx30l6i"},{"post_id":"cln4obygl00axoko039iy1kiz","tag_id":"cln4obygt00cfoko0cplxa9ga","_id":"cln4obygy00d7oko03l2e18lq"},{"post_id":"cln4obygl00axoko039iy1kiz","tag_id":"cln4obygu00cmoko09wz333a2","_id":"cln4obygz00dboko0biga5pda"},{"post_id":"cln4obygl00axoko039iy1kiz","tag_id":"cln4obygv00croko03ekudvqk","_id":"cln4obyh000deoko0e7rb7k40"},{"post_id":"cln4obygl00axoko039iy1kiz","tag_id":"cln4obygx00cyoko0g5f2htf3","_id":"cln4obyh100dioko043vi6vle"},{"post_id":"cln4obygx00d1oko01vzifqgg","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh100dloko0d5fm5721"},{"post_id":"cln4obygl00azoko066h93056","tag_id":"cln4obygy00d3oko0hleo8yqa","_id":"cln4obyh200dpoko0f98yhh2g"},{"post_id":"cln4obygy00d8oko0grs88ez1","tag_id":"cln4obyep000voko07zdg3qel","_id":"cln4obyh300dsoko035vd0pc7"},{"post_id":"cln4obygy00d8oko0grs88ez1","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh300dvoko073e976li"},{"post_id":"cln4obygz00dcoko06zdsbodi","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh400dzoko069fa6rsy"},{"post_id":"cln4obygm00b1oko07rdt1v5y","tag_id":"cln4obygr00c1oko00zbqfarw","_id":"cln4obyh500e2oko0f3gx7xmd"},{"post_id":"cln4obyh100djoko0f515b8ii","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh500e6oko04h21fewz"},{"post_id":"cln4obygm00b4oko05ez0aioh","tag_id":"cln4obygr00c1oko00zbqfarw","_id":"cln4obyh600e9oko02ek7ha2k"},{"post_id":"cln4obyh300dtoko02up90jo7","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh700edoko0cf3b0fqx"},{"post_id":"cln4obyh300dxoko0aq8n03yw","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh800egoko0cfw1a69s"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obyh200dooko02qq113y4","_id":"cln4obyh900emoko0bchidchz"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obyh300dwoko0aficcqee","_id":"cln4obyha00epoko0guyg9bd7"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyhb00etoko0d38a7ugs"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obyh500e5oko01l750ihw","_id":"cln4obyhc00ewoko063l75we3"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obygr00c1oko00zbqfarw","_id":"cln4obyhf00f0oko0dui4dbbf"},{"post_id":"cln4obyh800ehoko043fs54g2","tag_id":"cln4obyg3009roko05kqj9rhu","_id":"cln4obyhg00f3oko0dfw03xs4"},{"post_id":"cln4obyh900ekoko03fm38moi","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhg00f7oko0czmf6y05"},{"post_id":"cln4obygn00bboko04ivg7ado","tag_id":"cln4obyh900ejoko01g4qdynh","_id":"cln4obyhh00faoko06yok2tnt"},{"post_id":"cln4obyhb00eroko0f4qacnho","tag_id":"cln4obyfg004ooko07ymac5z3","_id":"cln4obyhh00fdoko09qk15bis"},{"post_id":"cln4obyhb00eroko0f4qacnho","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhh00fhoko07nu00z3f"},{"post_id":"cln4obygo00beoko0cvrs4xid","tag_id":"cln4obyhb00eqoko073txholr","_id":"cln4obyhi00fkoko08lzxcw6y"},{"post_id":"cln4obygo00beoko0cvrs4xid","tag_id":"cln4obyhc00exoko004mof98x","_id":"cln4obyhi00fooko0f0474gjt"},{"post_id":"cln4obygo00bhoko0ff58cnor","tag_id":"cln4obyhg00f6oko08flf968n","_id":"cln4obyhj00fuoko0aim382tt"},{"post_id":"cln4obygo00bhoko0ff58cnor","tag_id":"cln4obyhh00feoko00bwucyyq","_id":"cln4obyhk00fxoko0f2411fez"},{"post_id":"cln4obygo00bhoko0ff58cnor","tag_id":"cln4obyhi00floko0bd3s2ktw","_id":"cln4obyhk00g1oko0giwga4sr"},{"post_id":"cln4obygp00bkoko03c7x68kt","tag_id":"cln4obyhj00froko0b8h4eawz","_id":"cln4obyhl00g4oko02loqf0g5"},{"post_id":"cln4obygp00bkoko03c7x68kt","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhm00g8oko09kuo9bml"},{"post_id":"cln4obygp00bkoko03c7x68kt","tag_id":"cln4obyfc003loko0fhtf3q5i","_id":"cln4obyhm00gboko031v47d68"},{"post_id":"cln4obygp00bpoko04ksq9jyj","tag_id":"cln4obyhk00g0oko0cyrn3q95","_id":"cln4obyhn00ghoko06euv747w"},{"post_id":"cln4obygp00bpoko04ksq9jyj","tag_id":"cln4obyhm00g7oko07mek2oho","_id":"cln4obyho00gkoko07mls3l46"},{"post_id":"cln4obyhn00gfoko05tafeumv","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyho00gooko03ar9f4lb"},{"post_id":"cln4obyhn00gioko03c3q5piq","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhp00groko05f5319bc"},{"post_id":"cln4obygq00bsoko0b3m95fuz","tag_id":"cln4obyhn00geoko0co87ga9b","_id":"cln4obyhp00guoko0c9c3gfa8"},{"post_id":"cln4obygq00bsoko0b3m95fuz","tag_id":"cln4obyho00gloko0agncgbbh","_id":"cln4obyhp00gwoko01mnvghvg"},{"post_id":"cln4obygq00bvoko03fm2af8w","tag_id":"cln4obyhm00g7oko07mek2oho","_id":"cln4obyhq00h1oko0g4k5gydn"},{"post_id":"cln4obygq00bvoko03fm2af8w","tag_id":"cln4obyfa0036oko04fvq8k76","_id":"cln4obyhq00h2oko00n3pe97i"},{"post_id":"cln4obygq00bvoko03fm2af8w","tag_id":"cln4obyhp00gyoko0eiya3xam","_id":"cln4obyhq00h4oko01pjfgyrb"},{"post_id":"cln4obygr00byoko0f9geg7qr","tag_id":"cln4obyhp00h0oko0hd4b9qei","_id":"cln4obyhq00h7oko011385m7o"},{"post_id":"cln4obygr00byoko0f9geg7qr","tag_id":"cln4obyhq00h3oko0892wfye5","_id":"cln4obyhq00h8oko0ba1q68pw"},{"post_id":"cln4obygr00byoko0f9geg7qr","tag_id":"cln4obyhq00h5oko02cmc6kh8","_id":"cln4obyhq00haoko039gqgfvu"},{"post_id":"cln4obygr00c2oko0g5g17r02","tag_id":"cln4obyhq00h6oko00vm35evj","_id":"cln4obyhq00hboko0agcvfjsv"},{"post_id":"cln4obygr00c2oko0g5g17r02","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhq00hdoko0fijahwjy"},{"post_id":"cln4obygr00c5oko05iw6cb5r","tag_id":"cln4obyhq00h9oko0a9jqawsa","_id":"cln4obyhq00heoko047297k66"},{"post_id":"cln4obygr00c5oko05iw6cb5r","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhq00hgoko0dj4i27po"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhq00hcoko06tmmg8sv","_id":"cln4obyhr00hloko07pyzdixh"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhk00g0oko0cyrn3q95","_id":"cln4obyhr00hmoko027ucflw4"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhr00hhoko05p2xa8kt","_id":"cln4obyhr00hooko05nhy2576"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhr00hpoko0dzno7q03"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhr00hioko014us47ih","_id":"cln4obyhr00hroko0hf2f0ecm"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhr00hjoko0glsud9qz","_id":"cln4obyhr00hsoko0dcg1dmtc"},{"post_id":"cln4obygs00cboko02qmzgblk","tag_id":"cln4obyhr00hkoko010vhaw2x","_id":"cln4obyhr00huoko0b9ti4v9z"},{"post_id":"cln4obygs00cboko02qmzgblk","tag_id":"cln4obyhr00hnoko05k0eeu7n","_id":"cln4obyhs00hvoko0bjw002co"},{"post_id":"cln4obygt00cdoko01rbg7j16","tag_id":"cln4obyhr00hqoko047a67als","_id":"cln4obyhs00hwoko0gme4cwqp"},{"post_id":"cln4obygt00cgoko0g20id478","tag_id":"cln4obyhr00htoko0hr397al8","_id":"cln4obyhs00hzoko02jb81qxi"},{"post_id":"cln4obygt00cgoko0g20id478","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhs00i0oko09ri3atyo"},{"post_id":"cln4obygt00cgoko0g20id478","tag_id":"cln4obyhs00hxoko08x5zfo9k","_id":"cln4obyhs00i2oko0cf2qcp1e"},{"post_id":"cln4obygu00cjoko08k2w4av4","tag_id":"cln4obyhs00hyoko0dkp055d9","_id":"cln4obyhs00i4oko041le11kk"},{"post_id":"cln4obygu00cjoko08k2w4av4","tag_id":"cln4obyhs00i1oko06vki51rt","_id":"cln4obyht00i5oko0ges5adfu"},{"post_id":"cln4obygu00cjoko08k2w4av4","tag_id":"cln4obyfg004moko0dahvcxw1","_id":"cln4obyht00i7oko04knhgk72"},{"post_id":"cln4obygu00cjoko08k2w4av4","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyht00i8oko0gbutdq34"},{"post_id":"cln4obygu00cnoko0c80rcm8v","tag_id":"cln4obyhq00h6oko00vm35evj","_id":"cln4obyht00iaoko00x924jcc"},{"post_id":"cln4obygv00cpoko00gjxbw2h","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyht00iboko05j475fax"},{"post_id":"cln4obygv00cpoko00gjxbw2h","tag_id":"cln4obyht00i6oko04eni0r5l","_id":"cln4obyht00idoko06xkz635g"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyhs00hyoko0dkp055d9","_id":"cln4obyhu00ihoko0gfko06uq"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyht00icoko026fv9qiv","_id":"cln4obyhu00iioko01to47bro"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyhs00i1oko06vki51rt","_id":"cln4obyhu00ikoko0e95w2xlm"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyht00ifoko01uhp2hhr","_id":"cln4obyhu00iloko074omgohw"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhu00inoko0ffltfwtz"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyfg004noko0a0wseddv","_id":"cln4obyhu00iooko070ufe390"},{"post_id":"cln4obygw00cuoko09nzsflwl","tag_id":"cln4obyht00igoko0cn0hgm4c","_id":"cln4obyhu00iqoko025bv4na8"},{"post_id":"cln4obygw00cuoko09nzsflwl","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhu00iroko0b9neef0j"},{"post_id":"cln4obygx00cwoko009q83i3o","tag_id":"cln4obyhu00ijoko072mxhbvv","_id":"cln4obyhu00itoko0067u2xvm"},{"post_id":"cln4obygx00cwoko009q83i3o","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhu00iuoko088sdb31x"},{"post_id":"cln4obygy00d5oko08ebcgf9r","tag_id":"cln4obyhu00imoko0eopf6lvw","_id":"cln4obyhv00iwoko04nch5ibm"},{"post_id":"cln4obygy00d5oko08ebcgf9r","tag_id":"cln4obyhm00g7oko07mek2oho","_id":"cln4obyhv00ixoko09pd90c47"},{"post_id":"cln4obygy00d5oko08ebcgf9r","tag_id":"cln4obyhu00isoko0eyuc6zai","_id":"cln4obyhv00izoko057lphwb5"},{"post_id":"cln4obyh000dfoko091xdhsru","tag_id":"cln4obyhv00ivoko07wd4g3nj","_id":"cln4obyhv00j1oko05fkv4urr"},{"post_id":"cln4obyh000dfoko091xdhsru","tag_id":"cln4obyhv00iyoko07wgu9tni","_id":"cln4obyhv00j2oko0edeq8xtu"},{"post_id":"cln4obyh100dmoko02qj9fqke","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhv00j4oko0d43o70cw"},{"post_id":"cln4obyh100dmoko02qj9fqke","tag_id":"cln4obyhv00j0oko06a2n3bbn","_id":"cln4obyhv00j5oko0744oc1d2"},{"post_id":"cln4obyh200dqoko0hanoeoxo","tag_id":"cln4obyhv00j3oko0g2k66fr5","_id":"cln4obyhv00j7oko0cy7ldaci"},{"post_id":"cln4obyh200dqoko0hanoeoxo","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhv00j8oko06eabhi07"},{"post_id":"cln4obyh400e0oko0e4rr7rn9","tag_id":"cln4obyhv00j6oko0c7ut038k","_id":"cln4obyhw00jaoko0901y7i76"},{"post_id":"cln4obyh400e0oko0e4rr7rn9","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhw00jboko07ngobm2j"},{"post_id":"cln4obyh500e3oko061ca3uey","tag_id":"cln4obyhv00j9oko0dzgo1bf6","_id":"cln4obyhw00jdoko0hton7n2v"},{"post_id":"cln4obyh500e7oko08s7t4jc0","tag_id":"cln4obyhw00jcoko01q29cum5","_id":"cln4obyhw00jfoko09f3f7qu9"},{"post_id":"cln4obyh600eaoko02f4m5jpj","tag_id":"cln4obyhw00jeoko08367cay7","_id":"cln4obyhw00jjoko0243p6q7z"},{"post_id":"cln4obyh600eaoko02f4m5jpj","tag_id":"cln4obyhw00jgoko0dx3a427q","_id":"cln4obyhw00jkoko0gcf72br1"},{"post_id":"cln4obyh600eaoko02f4m5jpj","tag_id":"cln4obyhw00jhoko0dl4n4kms","_id":"cln4obyhw00jmoko056eaf0rt"},{"post_id":"cln4obyh700eeoko0c2cc6kbe","tag_id":"cln4obyhw00jioko04sof0ooy","_id":"cln4obyhx00jnoko0250u2o8v"},{"post_id":"cln4obyh700eeoko0c2cc6kbe","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhx00jpoko02e338xpo"},{"post_id":"cln4obyha00enoko04qe92oak","tag_id":"cln4obyhr00htoko0hr397al8","_id":"cln4obyhx00jqoko03ujqgsm9"},{"post_id":"cln4obyha00enoko04qe92oak","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhx00jsoko0fuya6m5q"},{"post_id":"cln4obyhb00euoko0fwkeeu7o","tag_id":"cln4obyhx00jooko09i1i5rrw","_id":"cln4obyhx00juoko0bxizd59l"},{"post_id":"cln4obyhb00euoko0fwkeeu7o","tag_id":"cln4obyhx00jroko0gr6oajxl","_id":"cln4obyhx00jvoko0g7o89dt8"},{"post_id":"cln4obyhb00euoko0fwkeeu7o","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhx00jxoko012ixbloc"},{"post_id":"cln4obyhc00eyoko0h93khtt7","tag_id":"cln4obyhx00jtoko0hll9cjhu","_id":"cln4obyhy00k0oko08wzgfipv"},{"post_id":"cln4obyhc00eyoko0h93khtt7","tag_id":"cln4obyhx00jwoko0828m7338","_id":"cln4obyhy00k1oko0ewcobl5v"},{"post_id":"cln4obyhc00eyoko0h93khtt7","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhy00k3oko0alad2i69"},{"post_id":"cln4obyhc00eyoko0h93khtt7","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhy00k4oko01fnv8szc"},{"post_id":"cln4obyhc00eyoko0h93khtt7","tag_id":"cln4obyhx00jyoko0difn5lii","_id":"cln4obyhy00k6oko0hwy8axgz"},{"post_id":"cln4obyhf00f1oko0051d659o","tag_id":"cln4obygs00caoko0f8vdc35j","_id":"cln4obyhy00k7oko0dm17a0x3"},{"post_id":"cln4obyhf00f1oko0051d659o","tag_id":"cln4obygs00caoko0f8vdc35j","_id":"cln4obyhy00k9oko0evnghtq2"},{"post_id":"cln4obyhf00f1oko0051d659o","tag_id":"cln4obyhx00jzoko0anvzdb59","_id":"cln4obyhy00kaoko0d9242rsv"},{"post_id":"cln4obyhg00f4oko0c91sbrhj","tag_id":"cln4obygs00caoko0f8vdc35j","_id":"cln4obyhy00kcoko0f2ct1yca"},{"post_id":"cln4obyhg00f4oko0c91sbrhj","tag_id":"cln4obyhx00jzoko0anvzdb59","_id":"cln4obyhy00kdoko0hw559nru"},{"post_id":"cln4obyhg00f4oko0c91sbrhj","tag_id":"cln4obygl00ayoko0c7g4a8cx","_id":"cln4obyhy00keoko0f1p1fowg"},{"post_id":"cln4obyhg00f8oko0dpxihe04","tag_id":"cln4obyhy00k5oko0d1j17k4l","_id":"cln4obyhz00kgoko0hqmpfbhm"},{"post_id":"cln4obyhg00f8oko0dpxihe04","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhz00khoko0adi8310p"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhy00k8oko01jpc4umq","_id":"cln4obyhz00kloko01fxv1soz"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhy00kboko0d07sezeq","_id":"cln4obyhz00kmoko0fcgb1ek9"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhy00kfoko001ew9b1c","_id":"cln4obyhz00kooko08vdy2fv0"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhz00kioko07krk0pyu","_id":"cln4obyhz00kpoko0fgrfbuhi"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhz00kjoko04dxz3xhh","_id":"cln4obyhz00kroko06gvd52n9"},{"post_id":"cln4obyhh00ffoko0fofe62zd","tag_id":"cln4obyhv00j9oko0dzgo1bf6","_id":"cln4obyhz00ksoko0cr2abja9"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyhz00knoko0b9ud9me7","_id":"cln4obyi000kwoko021fcefel"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyhz00kqoko03fjkct9p","_id":"cln4obyi000kxoko06d9d4d97"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyhz00ktoko05uchd6jh","_id":"cln4obyi000kzoko0hhv96gl4"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi000l0oko04g7v6eng"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyhq00h5oko02cmc6kh8","_id":"cln4obyi000l2oko0bxjcbksz"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","tag_id":"cln4obyi000kvoko0a9qy8nhz","_id":"cln4obyi100l5oko0f2uq3na1"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","tag_id":"cln4obyi000kyoko0hkwpatkz","_id":"cln4obyi100l6oko04pm6erwg"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","tag_id":"cln4obyi000l1oko019gw19fq","_id":"cln4obyi100l8oko03e4u2yr3"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","tag_id":"cln4obyhz00kjoko04dxz3xhh","_id":"cln4obyi100l9oko0get335bc"},{"post_id":"cln4obyhi00fpoko08kqtatpb","tag_id":"cln4obyhv00j9oko0dzgo1bf6","_id":"cln4obyi100lboko04vnsek9t"},{"post_id":"cln4obyhi00fpoko08kqtatpb","tag_id":"cln4obyi100l7oko0822f9pa9","_id":"cln4obyi100lcoko01rj9ehn2"},{"post_id":"cln4obyhj00fsoko05rs764v5","tag_id":"cln4obyi100laoko01faxe2hc","_id":"cln4obyi200leoko00vgg6tr2"},{"post_id":"cln4obyhj00fvoko07p789xfu","tag_id":"cln4obyi100laoko01faxe2hc","_id":"cln4obyi200lhoko0aqpa5oxi"},{"post_id":"cln4obyhj00fvoko07p789xfu","tag_id":"cln4obyi200lfoko0f9um3dij","_id":"cln4obyi200lioko02j6x1oie"},{"post_id":"cln4obyhk00fyoko08mj1164d","tag_id":"cln4obyi200lgoko00v7g7uqq","_id":"cln4obyi300lloko0dh6s1xz9"},{"post_id":"cln4obyhk00fyoko08mj1164d","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi300lmoko004tb34sd"},{"post_id":"cln4obyhk00fyoko08mj1164d","tag_id":"cln4obyi200ljoko0agp762o6","_id":"cln4obyi300looko0cx8x2l85"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyi200lkoko06xkp4gri","_id":"cln4obyi300ltoko0fjet4lt3"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyi300lnoko0cq1pf3k2","_id":"cln4obyi300luoko0dkq36k42"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyhz00kjoko04dxz3xhh","_id":"cln4obyi400lwoko0c75uh2lp"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyi300lqoko0cwt271wk","_id":"cln4obyi400lxoko0ein2597m"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyi300lroko0dbp458bo","_id":"cln4obyi400lzoko03a3425y8"},{"post_id":"cln4obyhl00g5oko09tei1t3o","tag_id":"cln4obyhz00kjoko04dxz3xhh","_id":"cln4obyi400m1oko07s1pclq4"},{"post_id":"cln4obyhl00g5oko09tei1t3o","tag_id":"cln4obyi300lroko0dbp458bo","_id":"cln4obyi400m2oko092ku1r60"},{"post_id":"cln4obyhl00g5oko09tei1t3o","tag_id":"cln4obyi400lyoko0bg964th9","_id":"cln4obyi400m4oko09nugftmz"},{"post_id":"cln4obyhm00g9oko08z1r71at","tag_id":"cln4obyi400m0oko0g6ua29ar","_id":"cln4obyi400m5oko08l0q7ldl"},{"post_id":"cln4obyhm00g9oko08z1r71at","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi500m7oko01fv23zlc"},{"post_id":"cln4obyhm00gcoko081xv48y9","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi500m8oko0dzyj2x8j"},{"post_id":"cln4obyhm00gcoko081xv48y9","tag_id":"cln4obyi400m3oko017nb7bw9","_id":"cln4obyi500maoko0bkrif4xt"},{"post_id":"cln4obyhm00gcoko081xv48y9","tag_id":"cln4obyev001hoko0ak9bd2re","_id":"cln4obyi500mboko09gt22d51"},{"post_id":"cln4obyho00gmoko02ixqh8db","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi500mdoko0fp6zaow4"},{"post_id":"cln4obyho00gmoko02ixqh8db","tag_id":"cln4obyi400m6oko00vex2z6w","_id":"cln4obyi500meoko071jh1k4v"},{"post_id":"cln4obyho00gmoko02ixqh8db","tag_id":"cln4obyi500m9oko082bn60ln","_id":"cln4obyi500mfoko02y3q1ro6"},{"post_id":"cln4obyho00gpoko0e5c3cfiw","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi500mgoko027qigax5"},{"post_id":"cln4obyho00gpoko0e5c3cfiw","tag_id":"cln4obyi500mcoko023m7eg2b","_id":"cln4obyi500mhoko0frqi926k"}],"Tag":[{"name":"hexo","_id":"cln4obyeb0004oko0cugx8sp1"},{"name":"台风","_id":"cln4obyeh000coko0h97kfin2"},{"name":"山竹","_id":"cln4obyek000ioko0ckyl1g8e"},{"name":"生活","_id":"cln4obyen000poko08lgae8pc"},{"name":"十年","_id":"cln4obyep000voko07zdg3qel"},{"name":"时光沉淀","_id":"cln4obyer0014oko0g1swad00"},{"name":"论坛","_id":"cln4obyev001hoko0ak9bd2re"},{"name":"求婚","_id":"cln4obyf0001ooko09ly74alq"},{"name":"狗尾续貂","_id":"cln4obyf1001woko02sl8dwge"},{"name":"求婚大作战","_id":"cln4obyf30024oko0dopf8gre"},{"name":"张艺兴","_id":"cln4obyf40029oko08j9dg6hj"},{"name":"陈都灵","_id":"cln4obyf5002foko0e4ol5ti1"},{"name":"网剧","_id":"cln4obyf6002koko07m797b51"},{"name":"开头","_id":"cln4obyf7002soko0bd22hvxk"},{"name":"邵庄","_id":"cln4obyf9002zoko0dbcf6394"},{"name":"珠海","_id":"cln4obyfa0036oko04fvq8k76"},{"name":"官塘","_id":"cln4obyfb003coko070mn9c8u"},{"name":"note4x","_id":"cln4obyfb003goko0a9xwaadv"},{"name":"红米","_id":"cln4obyfb003hoko0cnjrfp1q"},{"name":"神雕","_id":"cln4obyfc003ioko05ozmbwp6"},{"name":"金庸","_id":"cln4obyfc003loko0fhtf3q5i"},{"name":"影视剧","_id":"cln4obyfc003ooko0f4pxcut5"},{"name":"作品","_id":"cln4obyfc003poko0c10rcgmq"},{"name":"完稿","_id":"cln4obyfc003qoko099apdqud"},{"name":"小说","_id":"cln4obyfc003roko0g8t19lrn"},{"name":"旷世奇恋","_id":"cln4obyfd003soko0degl63a9"},{"name":"养女","_id":"cln4obyfd003toko0es181r6c"},{"name":"何沅君","_id":"cln4obyfd003uoko0aizfbxd0"},{"name":"小龙女","_id":"cln4obyfd003voko0fre2ad9o"},{"name":"杨过","_id":"cln4obyfe003woko0edfve527"},{"name":"wget","_id":"cln4obyfe003xoko0bip1enfz"},{"name":"shadowsocks","_id":"cln4obyfe0040oko0af41d34o"},{"name":"阴雨天","_id":"cln4obyfe0046oko0ars92dgk"},{"name":"绵羊","_id":"cln4obyff0049oko0f3v0232s"},{"name":"SNH48","_id":"cln4obyff004doko0185sdz6m"},{"name":"rng","_id":"cln4obyff004goko02i8j40a7"},{"name":"LOL","_id":"cln4obyff004joko02hoa364n"},{"name":"S8","_id":"cln4obyfg004moko0dahvcxw1"},{"name":"英雄联盟","_id":"cln4obyfg004noko0a0wseddv"},{"name":"拳头","_id":"cln4obyfg004ooko07ymac5z3"},{"name":"父亲节","_id":"cln4obyfg004poko06sf1af7e"},{"name":"演技","_id":"cln4obyfg004soko03zulb32n"},{"name":"剧情","_id":"cln4obyfh004voko0e9crhizc"},{"name":"版本","_id":"cln4obyfi0051oko079h22g02"},{"name":"倚天屠龙记","_id":"cln4obyfi0052oko0gnlq89d7"},{"name":"列表","_id":"cln4obyfi0056oko094np55j3"},{"name":"文件","_id":"cln4obyfi0059oko00rgk866o"},{"name":"命令","_id":"cln4obyfj005coko0a27u6b2k"},{"name":"安装","_id":"cln4obyfj005eoko0dwqg658o"},{"name":"ssr","_id":"cln4obyfj005foko01rim391a"},{"name":"service","_id":"cln4obyfj005goko09lv9b8wv"},{"name":"硬盘","_id":"cln4obyfk005hoko05ng1gf0f"},{"name":"opencore","_id":"cln4obyfl005koko0d5ancnga"},{"name":"网卡","_id":"cln4obyfl005noko0ctv2d2gg"},{"name":"i5","_id":"cln4obyfl005qoko01e199bsl"},{"name":"主板","_id":"cln4obyfl005soko03falbgx1"},{"name":"nvme","_id":"cln4obyfl005toko00fhudbgf"},{"name":"精粤","_id":"cln4obyfl005uoko0aw3779gs"},{"name":"黑苹果","_id":"cln4obyfm005voko0ebnqcnu7"},{"name":"macos","_id":"cln4obyfm005woko06h7aczwa"},{"name":"笔记本","_id":"cln4obyfn0065oko0b3kx7l6g"},{"name":"clover","_id":"cln4obyfo0068oko07o9sh7is"},{"name":"edid","_id":"cln4obyfo0069oko0fyyt2ksn"},{"name":"hackintool","_id":"cln4obyfo006aoko0df8sc5z0"},{"name":"固态","_id":"cln4obyfo006boko0c5o43ryw"},{"name":"夏普屏","_id":"cln4obyfq006moko070yy5gmd"},{"name":"厂商","_id":"cln4obyfq006ooko0enb94e1q"},{"name":"主控","_id":"cln4obyfr006uoko0hessa6jp"},{"name":"开卡","_id":"cln4obyfr006xoko0dkq4addp"},{"name":"硬盘盒","_id":"cln4obyfr006yoko06ansck8z"},{"name":"驱动","_id":"cln4obyfs006zoko084p22ij4"},{"name":"bios","_id":"cln4obyft0078oko0g6r210tk"},{"name":"编程器","_id":"cln4obyft0079oko0fwb0d0rq"},{"name":"焊盘","_id":"cln4obyft007aoko0e1jm5vb9"},{"name":"zip","_id":"cln4obyft007boko00uxp590r"},{"name":"下载","_id":"cln4obyfu007eoko055j9f0e8"},{"name":"地址","_id":"cln4obyfu007hoko01llt1ldr"},{"name":"苹果","_id":"cln4obyfu007koko0e8r9gb7f"},{"name":"情况","_id":"cln4obyfv007ooko0ewfb33jv"},{"name":"归档","_id":"cln4obyfw007soko08mdv34vx"},{"name":"无声","_id":"cln4obyfw007toko00utj1uy9"},{"name":"扬声器","_id":"cln4obyfw007uoko088ga8hga"},{"name":"修复","_id":"cln4obyfx007voko00nwcep58"},{"name":"vk22t","_id":"cln4obyfy0085oko0houqbjg3"},{"name":"颗粒","_id":"cln4obyfz008foko0gfl2euzj"},{"name":"打赏","_id":"cln4obyfz008goko0bs5ob868"},{"name":"海力士","_id":"cln4obyfz008hoko06lk1dais"},{"name":"显卡","_id":"cln4obyfz008loko078j52vrf"},{"name":"免驱","_id":"cln4obyfz008ooko0aomf7hch"},{"name":"amd","_id":"cln4obyfz008roko01nqx0fsq"},{"name":"samsung","_id":"cln4obyg0008zoko08cww9qhw"},{"name":"vk22","_id":"cln4obyg10096oko0bezkfns4"},{"name":"nec","_id":"cln4obyg10097oko09c9d9t2a"},{"name":"linux","_id":"cln4obyg1009boko06w4beigl"},{"name":"h97i","_id":"cln4obyg1009ioko0gg7tco4r"},{"name":"bcm943224","_id":"cln4obyg2009joko08krladfl"},{"name":"fliqlo","_id":"cln4obyg3009qoko0cn651b3w"},{"name":"typecho","_id":"cln4obyg3009roko05kqj9rhu"},{"name":"chajian","_id":"cln4obyg3009uoko05vj9610g"},{"name":"CommentsByQQ","_id":"cln4obyg4009woko07rkcbdb6"},{"name":"homebrew","_id":"cln4obyg400a0oko0hcm058xd"},{"name":"office","_id":"cln4obyg400a2oko06rbr7rkj"},{"name":"vk23","_id":"cln4obyg500a7oko05ese8whb"},{"name":"测评","_id":"cln4obyg500a8oko0hfx11cu2"},{"name":"疫情","_id":"cln4obyg500a9oko094eefiwp"},{"name":"时间同步","_id":"cln4obyg600afoko0324pefp0"},{"name":"windows","_id":"cln4obyg700ahoko0094fg015"},{"name":"chatgpt","_id":"cln4obygi00anoko0h7xy3kro"},{"name":"注册","_id":"cln4obygk00auoko0ew5l9qau"},{"name":"教程","_id":"cln4obygl00ayoko0c7g4a8cx"},{"name":"虚拟信用卡","_id":"cln4obygm00b3oko024840wdq"},{"name":"黑群晖","_id":"cln4obygn00baoko00p0418i1"},{"name":"镜像","_id":"cln4obygo00bjoko05fh33w1g"},{"name":"DSM918","_id":"cln4obygp00booko0hfjw64ak"},{"name":"git","_id":"cln4obygq00buoko03rov894b"},{"name":"centos","_id":"cln4obygr00c1oko00zbqfarw"},{"name":"VPS","_id":"cln4obygs00caoko0f8vdc35j"},{"name":"openwrt","_id":"cln4obygt00cfoko0cplxa9ga"},{"name":"lede","_id":"cln4obygu00cmoko09wz333a2"},{"name":"软路由","_id":"cln4obygv00croko03ekudvqk"},{"name":"科学上网","_id":"cln4obygx00cyoko0g5f2htf3"},{"name":"Linux","_id":"cln4obygy00d3oko0hleo8yqa"},{"name":"torrent","_id":"cln4obyh200dooko02qq113y4"},{"name":"磁力","_id":"cln4obyh300dwoko0aficcqee"},{"name":"cloud torrent","_id":"cln4obyh500e5oko01l750ihw"},{"name":"edge","_id":"cln4obyh900ejoko01g4qdynh"},{"name":"V2RAY","_id":"cln4obyhb00eqoko073txholr"},{"name":"梯子","_id":"cln4obyhc00exoko004mof98x"},{"name":"魔趣","_id":"cln4obyhg00f6oko08flf968n"},{"name":"安卓","_id":"cln4obyhh00feoko00bwucyyq"},{"name":"刷机","_id":"cln4obyhi00floko0bd3s2ktw"},{"name":"武侠","_id":"cln4obyhj00froko0b8h4eawz"},{"name":"上海","_id":"cln4obyhk00g0oko0cyrn3q95"},{"name":"影像","_id":"cln4obyhm00g7oko07mek2oho"},{"name":"中元节","_id":"cln4obyhn00geoko0co87ga9b"},{"name":"鬼节","_id":"cln4obyho00gloko0agncgbbh"},{"name":"雨天","_id":"cln4obyhp00gyoko0eiya3xam"},{"name":"中国","_id":"cln4obyhp00h0oko0hd4b9qei"},{"name":"吐槽","_id":"cln4obyhq00h3oko0892wfye5"},{"name":"相亲","_id":"cln4obyhq00h5oko02cmc6kh8"},{"name":"中秋节","_id":"cln4obyhq00h6oko00vm35evj"},{"name":"生日","_id":"cln4obyhq00h9oko0a9jqawsa"},{"name":"2018","_id":"cln4obyhq00hcoko06tmmg8sv"},{"name":"新年","_id":"cln4obyhr00hhoko05p2xa8kt"},{"name":"规划","_id":"cln4obyhr00hioko014us47ih"},{"name":"过年","_id":"cln4obyhr00hjoko0glsud9qz"},{"name":"Docker","_id":"cln4obyhr00hkoko010vhaw2x"},{"name":"Pleroma","_id":"cln4obyhr00hnoko05k0eeu7n"},{"name":"cloudflare","_id":"cln4obyhr00hqoko047a67als"},{"name":"爱情","_id":"cln4obyhr00htoko0hr397al8"},{"name":"网恋","_id":"cln4obyhs00hxoko08x5zfo9k"},{"name":"lol","_id":"cln4obyhs00hyoko0dkp055d9"},{"name":"RNG","_id":"cln4obyhs00i1oko06vki51rt"},{"name":"而立","_id":"cln4obyht00i6oko04eni0r5l"},{"name":"LPL","_id":"cln4obyht00icoko026fv9qiv"},{"name":"UZI","_id":"cln4obyht00ifoko01uhp2hhr"},{"name":"下班","_id":"cln4obyht00igoko0cn0hgm4c"},{"name":"感恩","_id":"cln4obyhu00ijoko072mxhbvv"},{"name":"冬日","_id":"cln4obyhu00imoko0eopf6lvw"},{"name":"武汉","_id":"cln4obyhu00isoko0eyuc6zai"},{"name":"memos","_id":"cln4obyhv00ivoko07wd4g3nj"},{"name":"Hexo","_id":"cln4obyhv00iyoko07wgu9tni"},{"name":"结婚","_id":"cln4obyhv00j0oko06a2n3bbn"},{"name":"H2","_id":"cln4obyhv00j3oko0g2k66fr5"},{"name":"圣诞节","_id":"cln4obyhv00j6oko0c7ut038k"},{"name":"Memos","_id":"cln4obyhv00j9oko0dzgo1bf6"},{"name":"artalk","_id":"cln4obyhw00jcoko01q29cum5"},{"name":"Gotosocial","_id":"cln4obyhw00jeoko08367cay7"},{"name":"fly.io","_id":"cln4obyhw00jgoko0dx3a427q"},{"name":"部署","_id":"cln4obyhw00jhoko0dl4n4kms"},{"name":"女子","_id":"cln4obyhw00jioko04sof0ooy"},{"name":"平庸","_id":"cln4obyhx00jooko09i1i5rrw"},{"name":"我","_id":"cln4obyhx00jroko0gr6oajxl"},{"name":"平凡","_id":"cln4obyhx00jtoko0hll9cjhu"},{"name":"梦想","_id":"cln4obyhx00jwoko0828m7338"},{"name":"老男孩","_id":"cln4obyhx00jyoko0difn5lii"},{"name":"搬瓦工","_id":"cln4obyhx00jzoko0anvzdb59"},{"name":"元旦","_id":"cln4obyhy00k5oko0d1j17k4l"},{"name":"MR.NEVERDIE","_id":"cln4obyhy00k8oko01jpc4umq"},{"name":"九把刀","_id":"cln4obyhy00kboko0d07sezeq"},{"name":"无与伦比的自由","_id":"cln4obyhy00kfoko001ew9b1c"},{"name":"杀手","_id":"cln4obyhz00kioko07krk0pyu"},{"name":"笔记","_id":"cln4obyhz00kjoko04dxz3xhh"},{"name":"七夕","_id":"cln4obyhz00knoko0b9ud9me7"},{"name":"情人节","_id":"cln4obyhz00kqoko03fjkct9p"},{"name":"现实","_id":"cln4obyhz00ktoko05uchd6jh"},{"name":"AppleALC","_id":"cln4obyi000kvoko0a9qy8nhz"},{"name":"macOS","_id":"cln4obyi000kyoko0hkwpatkz"},{"name":"xcode","_id":"cln4obyi000l1oko019gw19fq"},{"name":"Twikoo","_id":"cln4obyi100l7oko0822f9pa9"},{"name":"群晖","_id":"cln4obyi100laoko01faxe2hc"},{"name":"docker","_id":"cln4obyi200lfoko0f9um3dij"},{"name":"古龙","_id":"cln4obyi200lgoko00v7g7uqq"},{"name":"荒唐","_id":"cln4obyi200ljoko0agp762o6"},{"name":"太上老君","_id":"cln4obyi200lkoko06xkp4gri"},{"name":"封神演义","_id":"cln4obyi300lnoko0cq1pf3k2"},{"name":"老子","_id":"cln4obyi300lqoko0cwt271wk"},{"name":"西游记","_id":"cln4obyi300lroko0dbp458bo"},{"name":"谜","_id":"cln4obyi400lyoko0bg964th9"},{"name":"心情","_id":"cln4obyi400m0oko0g6ua29ar"},{"name":"社交","_id":"cln4obyi400m3oko017nb7bw9"},{"name":"阿里","_id":"cln4obyi400m6oko00vex2z6w"},{"name":"阿里悟空","_id":"cln4obyi500m9oko082bn60ln"},{"name":"黄易","_id":"cln4obyi500mcoko023m7eg2b"}]}} \ No newline at end of file +{"meta":{"version":1,"warehouse":"4.0.2"},"models":{"Asset":[{"_id":"source/favicon.jpg","path":"favicon.jpg","modified":0,"renderable":0},{"_id":"source/favicon.ico","path":"favicon.ico","modified":0,"renderable":0},{"_id":"source/wechat.png","path":"wechat.png","modified":0,"renderable":0},{"_id":"source/weixin.png","path":"weixin.png","modified":0,"renderable":0},{"_id":"source/zhifubao.png","path":"zhifubao.png","modified":0,"renderable":0},{"_id":"node_modules/hexo-theme-fluid/source/css/gitalk.css","path":"css/gitalk.css","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/css/main.styl","path":"css/main.styl","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/css/highlight-dark.styl","path":"css/highlight-dark.styl","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/css/mac.styl","path":"css/mac.styl","modified":0,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/css/highlight.styl","path":"css/highlight.styl","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/avatar.png","path":"img/avatar.png","modified":0,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/default.png","path":"img/default.png","modified":0,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/boot.js","path":"js/boot.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/color-schema.js","path":"js/color-schema.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/fluid.png","path":"img/fluid.png","modified":0,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/loading.gif","path":"img/loading.gif","modified":0,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/img/police_beian.png","path":"img/police_beian.png","modified":0,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/events.js","path":"js/events.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/plugins.js","path":"js/plugins.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/utils.js","path":"js/utils.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/img-lazyload.js","path":"js/img-lazyload.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/xml/local-search.xml","path":"xml/local-search.xml","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/local-search.js","path":"js/local-search.js","modified":1,"renderable":1},{"_id":"node_modules/hexo-theme-fluid/source/js/leancloud.js","path":"js/leancloud.js","modified":1,"renderable":1}],"Cache":[{"_id":"source/favicon.jpg","hash":"94e4da01b6f5685482c60a5c89c42a5566b98093","modified":1695973866406},{"_id":"source/favicon.ico","hash":"53318407d01613ab7d6cf45686d924577df70d69","modified":1695973866405},{"_id":"source/weixin.png","hash":"ed0e5e59660f207e2c2758791cd3235c132be70b","modified":1695973866420},{"_id":"source/_drafts/hello-world.md","hash":"4ac3009c7838f4ec47978b5fd515a4a905a04521","modified":1696042786510},{"_id":"source/zhifubao.png","hash":"d98f76b04fada8267307aeb2790ca5874db3f7ca","modified":1695973866420},{"_id":"source/categories/index.md","hash":"eee49429a1f967b3bc46672b3d1ff53dea13cc88","modified":1696042786524},{"_id":"source/about/index.md","hash":"6f23cbda5c6867f179582279daa0b107bd6e4d15","modified":1696042786524},{"_id":"source/fcircle/index.md","hash":"27fbbac92e71d897cd8e581c65edcac9147ee0f5","modified":1696042786525},{"_id":"source/_posts/2006-2016.md","hash":"47e94aea3600622a5a7d5939374f69f11c1dc033","modified":1696042786510},{"_id":"source/_posts/2017-08-17-shabusi.md","hash":"b7c94dc89a9414367925b4151c73de4c1abaac21","modified":1696042786510},{"_id":"source/_posts/15级强台风山竹即将登陆广东.md","hash":"cb0f8e07484b56a42a7e9db656f080d689cb103f","modified":1696042786510},{"_id":"source/_posts/2017-12-02-zhuhai.md","hash":"b7fc42ec771f7cb6a3b5d291ea362792b588f349","modified":1696042786510},{"_id":"source/_posts/2017-06-05-marry.md","hash":"6c6b94feb84582ae365d9d081fce1d05d8de67e7","modified":1696042786510},{"_id":"source/_posts/2018-04-17-shendiao.md","hash":"ebab063511fa69ef4112b7f8aa4c87a78a10cead","modified":1696042786510},{"_id":"source/_posts/2018-05-04-linux-SS.md","hash":"b269d0c6f097a925550ca0f76a0776d3f414124b","modified":1696042786510},{"_id":"source/_posts/2018-10-21-lol-s8.md","hash":"6a92e1d194448f278e5418e059c2888103d1ac7a","modified":1696042786511},{"_id":"source/_posts/2019-01-12-SNH48-xuyang.md","hash":"8d71cb360993203288d029730f781288aa09d785","modified":1696042786511},{"_id":"source/_posts/2017-06-26-zhuhai.md","hash":"3f5d06412d9f8e9f091da5ee95ebb1f14c663406","modified":1696042786510},{"_id":"source/_posts/2019-06-17-父亲节快乐.md","hash":"6c82228aa7ed3efc31b0ce6bb1e8742fa41b6ddc","modified":1696042786511},{"_id":"source/_posts/2019-03-03-yitian.md","hash":"822da04f654afab99f46cc3e2b5313e324dd3f54","modified":1696042786511},{"_id":"source/_posts/2019-04-03-CentOS-ShadowsocksR.md","hash":"5d1cbd9476504ce305ef480f6033651c266747f1","modified":1696042786511},{"_id":"source/_posts/2021-03-24-h97m-vh+i5_5575r_oc0.6.7-big_sur_.md","hash":"bfdb63403a5d673f656f7d9e8294d42d34a75de6","modified":1696042786511},{"_id":"source/_posts/2021-10-10-NEC_VK22_opencore.md","hash":"06abe89a0ff563f14ffddad690b6872378d88478","modified":1696042786511},{"_id":"source/_posts/2021-10-10-NEC_VK22t.md","hash":"d644d172eb1c00062a6fb55fc213c02be70cdceb","modified":1696042786512},{"_id":"source/_posts/2019-08-01-SSD.md","hash":"79f6465752b73235146ad92172916060789081c8","modified":1696042786511},{"_id":"source/_posts/2021-10-11-nec_vk22t-nvme.md","hash":"48330a7e0b74ff0136b531e566a2601f460a9e81","modified":1696042786512},{"_id":"source/_posts/2021-10-13-nvme-mod-small.md","hash":"afbfdcac3e273348d38b8b914666c8e3f8b6ca69","modified":1696042786512},{"_id":"source/_posts/2021-10-19-NEC_vk22t_bios_nvme.md","hash":"4528a3464568c4a5fd0366a1be89aa3051fc820f","modified":1696042786512},{"_id":"source/_posts/2021-10-19-onda_h410ipc_codec.md","hash":"580b39c0dae72d1189c3c1864e90b8ef4327bc5b","modified":1696042786512},{"_id":"source/_posts/2021-10-13-nec_vk22t_bios.md","hash":"a1cf58e8323c583df5ffde845364810b4aeb6c0c","modified":1696042786512},{"_id":"source/_posts/2021-12-14-rx560_4g_vbios.md","hash":"fbff4b1ce3e7b6675c04629e554967b12d59ac96","modified":1696042786512},{"_id":"source/_posts/2022-06-01-NEC_VK22T-OC0.8.0-macOS12.4.md","hash":"83fd4a9c9999f1d1cdee1673eb6a35d80eda477b","modified":1696042786512},{"_id":"source/_posts/2022-01-21-2023-amd-gpu.md","hash":"6b92e31d154fb778af3e850b5f13377121edbc57","modified":1696042786512},{"_id":"source/_posts/2022-04-12-ssd.md","hash":"50e2078e1eab3a8912bc88466ac9b04f8198904c","modified":1696042786512},{"_id":"source/_posts/2022-07-27-Linux-cms.md","hash":"82efb5ae46d2c997ae288e0fadb61dfd92e5438b","modified":1696042786513},{"_id":"source/_posts/2022-07-22-H97i_gmaing.md","hash":"0675db8ab9c284d71495eb371fb08aee22767d3c","modified":1696042786513},{"_id":"source/_posts/2022-08-08-macOS-fliqlo.md","hash":"eb0b078aa8a6095dc12ccbc70e7f4accd757dc9f","modified":1696042786513},{"_id":"source/_posts/2022-07-29-macOS-homebrew.md","hash":"e6e258e6ba901c2bc5104478f290689b4fb5f0d7","modified":1696042786513},{"_id":"source/_posts/2022-09-19-Typecho-CommentsByQQ.md","hash":"dc36d25f3a9df87df4b7dfa826051f5e2e4063cf","modified":1696042786513},{"_id":"source/_posts/2022-10-21-b150m-et_m2+rx560.md","hash":"45a6a238d58a33226efeb27426e1924eb461cc1f","modified":1696042786514},{"_id":"source/_posts/2022-10-14-office2016_Mac_.md","hash":"7334fd88d14b176e1c37c35eeb9ed9201c62c5cd","modified":1696042786513},{"_id":"source/_posts/2022-11-08-NEC_VK23T-vs-VK22T.md","hash":"6f4203ea838205007f06222b4192e2f87177946f","modified":1696042786514},{"_id":"source/_posts/2022-11-08-VK23-OpenCore0.8.5.md","hash":"892bdd87e6c4ac7f6454faa0167d611a98d8a525","modified":1696042786514},{"_id":"source/_posts/2022-11-15-macOS-Windows-time.md","hash":"453586d04cbbde5aae7e155b6d80782d105bf6db","modified":1696042786514},{"_id":"source/_posts/2022年12月8日终于全国防疫放开管控了.md","hash":"c7bf7483b8596e73fd8ec2fd4fedc36dfafaaeb0","modified":1696042786514},{"_id":"source/_posts/42个虚拟信用卡开卡渠道.md","hash":"37d66fe708ea60a443c7450bf9f31fd3444c4b47","modified":1696042786515},{"_id":"source/_posts/2023-guo-nei-zhu-ce-chatgpt-de-fang-fa.md","hash":"829507c8f5de1aa96248f99a13ad3eccd17bb026","modified":1696042786515},{"_id":"source/_posts/8月27.md","hash":"08f0916868e093facab986fde4e12ccd226a6fe3","modified":1696042786515},{"_id":"source/_posts/DSM918黑群晖引导7.1.0.md","hash":"379e4c2e6290baad80c3cfa8440bcd5d1e143102","modified":1696042786515},{"_id":"source/_posts/Git在windows下区分大小写.md","hash":"d48d496a87acb2c26e4b5dead98000730e59834d","modified":1696042786515},{"_id":"source/_posts/LEDE 软路由安装“XX上网”离线插件包提示含非法关键字的解决方法.md","hash":"5ade8a2000e059da0f2c5c881af5811f8e28c62b","modified":1696042786515},{"_id":"source/_posts/CentOS系统时间和时区查看以及修改的方法.md","hash":"3ca819afe98ef13f7da075001e9b87d110ddeea3","modified":1696042786515},{"_id":"source/_posts/Vi编辑器的基本使用方法!.md","hash":"f0b0ecad10253377f4eded09a0358202d2a0e892","modified":1696042786516},{"_id":"source/_posts/centos7_ssh连接慢的解决方法.md","hash":"84bcf30ff82067fde4f0edf9706838e47311f001","modified":1696042786516},{"_id":"source/_posts/centos7安装后没有网络.md","hash":"e52430c11173810109b831e55f97f4ebb33b9435","modified":1696042786516},{"_id":"source/_posts/cloud-torrent-for-centos-yi-jian-an-zhuang.md","hash":"2a24e22046fae619e66ec4d6cf4922f3a3150896","modified":1696042786517},{"_id":"source/_posts/edge_浏览器,出现“你的连接不是专用连接提示”,怎么办?.md","hash":"22cd6bbd1055bbe4f35ebed815f2679a0ad66e6e","modified":1696042786517},{"_id":"source/_posts/qv2ray-ke-hu-duan-ji-nei-he-xia-zai.md","hash":"ea37205b0e7cdbebc94109127d2d9b4731b06dfe","modified":1696042786517},{"_id":"source/_posts/mokee-rom.md","hash":"e456224e56e375ed10e91b5024ccfa077b441e68","modified":1696042786517},{"_id":"source/_posts/一个时代终将落幕.md","hash":"dd0a1f861ee481a2d573ef8808a3abd8002f0e4c","modified":1696042786517},{"_id":"source/_posts/一周之始.md","hash":"9c2150721ab400fa66289e755572c7e67ce2061c","modified":1696042786517},{"_id":"source/_posts/上海.md","hash":"6a4aa76ac6c4bb8abe6830d32b991bc858f97b2e","modified":1696042786517},{"_id":"source/_posts/中元节.md","hash":"077eebf043b65482670ed1e2245e2b8a94968148","modified":1696042786517},{"_id":"source/_posts/下雨了.md","hash":"ca35f600d206594db4bcae2f7d74ac29ed774759","modified":1696042786517},{"_id":"source/_posts/中国式相亲之现状.md","hash":"00352c3cc06857066b53c01bdc22185a945e23cb","modified":1696042786517},{"_id":"source/_posts/中秋节快乐.md","hash":"3ea4927995ffe170ac8a4a102d9230102d0e5221","modified":1696042786518},{"_id":"source/_posts/估计也只有QQ邮箱记得今天是什么日子.md","hash":"d30907bdd7d85bc9a3281b75af7d2aed99542b59","modified":1696042786518},{"_id":"source/_posts/你好2018.md","hash":"7d360634f52ef251cc095858b16a9b0a72b6191a","modified":1696042786518},{"_id":"source/_posts/使用 Docker 构建 Pleroma 实例.md","hash":"1ed5e9350e53d0edd735707d44ff5f1f0f72d4c5","modified":1696042786518},{"_id":"source/_posts/关于网恋.md","hash":"fdee7aebaae85b2cc4f64824ec8d3059b5f9742b","modified":1696042786518},{"_id":"source/_posts/使用cloudflare Tunnels实现内网穿透.md","hash":"3a2ecbd4c1f28c100f396e8b0ae415dd34b6b0e2","modified":1696042786518},{"_id":"source/_posts/关于英雄联盟S8八强对抗的预测.md","hash":"86441bdbc99ab3d415c27214ae440a7f4e0c956f","modified":1696042786518},{"_id":"source/_posts/写在2023中秋前夕.md","hash":"e5a2f2e18ccec1e13332bc2a0ad9d6d79e81f1d4","modified":1696042786518},{"_id":"source/_posts/写在30岁之后.md","hash":"71c63455f0684a3c8473f552bd5ae4a8f6c963e8","modified":1696042786518},{"_id":"source/_posts/写在MSI季中冠军赛RNG夺冠之后.md","hash":"c63030a364d1a1a61da2ee2a7548a55c56e11daa","modified":1696042786518},{"_id":"source/_posts/写在加班结束前.md","hash":"768786e1ad1e8d0f0a53b43fc9ebaf8f40b49aba","modified":1696042786518},{"_id":"source/_posts/写在感恩节的话.md","hash":"a6b3fc680da56551d569e41b5da5b6356fe94d03","modified":1696042786519},{"_id":"source/_posts/写在愚人节之后.md","hash":"d879a6cabca608152c9288a7963e3b1c97778f63","modified":1696042786519},{"_id":"source/_posts/到深圳的第一天.md","hash":"22417878bb8e608e2ae586ad59c3103953448987","modified":1696042786519},{"_id":"source/_posts/冬日-武汉.md","hash":"7c0cae22c4f3061c8198f14c238f7b30c0bc170b","modified":1696042786519},{"_id":"source/_posts/十年.md","hash":"4eb7b6ea03a055c9bfd5807e570ec8844cf9da66","modified":1696042786519},{"_id":"source/_posts/半年没有更新博客了.md","hash":"87f289426dbb79ca21ba401903f7da0487cdca5d","modified":1696042786520},{"_id":"source/_posts/博客的说说页面之Memos.md","hash":"56d7c9d2a4f88c32fa7ee1c85ff86b6ad37a9e7c","modified":1696042786520},{"_id":"source/_posts/又是一年冬季.md","hash":"6370e0552f001336b3df982b15cb045282ba1985","modified":1696042786520},{"_id":"source/_posts/压力山大.md","hash":"843a7fba6210dbe9b12197b0a88fdaf232bfebb4","modified":1696042786520},{"_id":"source/_posts/周二.md","hash":"a6b02a191f75e1656c31a1664b41c09fe68d9c3b","modified":1696042786520},{"_id":"source/_posts/又是拳头.md","hash":"3f5eb89861b781001889129d59fd0ca9b79e2773","modified":1696042786520},{"_id":"source/_posts/周日.md","hash":"5a210ce9d4bb921758b5d676cd80a31e41cddd63","modified":1696042786520},{"_id":"source/_posts/圣诞节.md","hash":"76f6d11433fca21d247f4f59dc06c2a40435df94","modified":1696042786520},{"_id":"source/_posts/在Fly.io部署Memos.md","hash":"6eefc9516f9320ca3190306e86d361a259b15d1e","modified":1696042786521},{"_id":"source/_posts/在fly.io部署artalk评论系统.md","hash":"208357acc7963267888f9f1ffd1aa0638e9f83cb","modified":1696042786521},{"_id":"source/_posts/在fly.io部署Gotosocial.md","hash":"30a4d95c7076d9e2b68d3a705c94ef19ae5c94f4","modified":1696042786521},{"_id":"source/_posts/女子.md","hash":"ebd8cb16c2de2b5ce40e8051cbb398a0cd8cf3e9","modified":1696042786521},{"_id":"source/_posts/如何快速在fly.io上部署typecho.md","hash":"e32752ba36be31130be0dc27ff49dcb2d1edc20f","modified":1696042786521},{"_id":"source/_posts/平安夜.md","hash":"70384f335b08f28d887d6d7d6d32eb52b76cc0e7","modified":1696042786521},{"_id":"source/_posts/得之我幸失之我命.md","hash":"14c8958754182c020f5472d6da9a1a9e6bdb1b20","modified":1696042786521},{"_id":"source/_posts/拳头.md","hash":"b724c5f5be0cb7ce5b7a08666ad4e2940f4867aa","modified":1696042786521},{"_id":"source/_posts/我们是如何变得平庸.md","hash":"58e857cf463fd2dc754b99001ca5aa036d984696","modified":1696042786521},{"_id":"source/_posts/搬瓦工VPS桌面监控工具BandwagongVPS-controller.md","hash":"37126ccf1eaa6902b23cf7e304b3d52f77386f07","modified":1696042786521},{"_id":"source/_posts/我的梦想.md","hash":"450c8a3c84621fb89be90f4ae47066881c56894f","modified":1696042786521},{"_id":"source/_posts/搬瓦工bandwagonhost-vps新手使用教程.md","hash":"d0154043bec86faac5e806c76fbd02aa813cf519","modified":1696042786522},{"_id":"source/_posts/新的一年2017.md","hash":"af1feaa2c9abbd5dcc3ca90e1179cddb414c0dbb","modified":1696042786522},{"_id":"source/_posts/杀手,无与伦比的自由.md","hash":"7dff45073459fbec1755e1d2ef3ba9bb95df98fa","modified":1696042786522},{"_id":"source/_posts/给Memos添加Artalk评论.md","hash":"4cecf653dd5f6a09c8333aa0ec6460e3f313d9e6","modified":1696042786522},{"_id":"source/_posts/现实就是这么现实.md","hash":"177f23f1e98f0a3ad4c9d16d4f1c69c6ccae55a7","modified":1696042786522},{"_id":"source/_posts/给Memos添加Twikoo评论.md","hash":"3a85ec299449721c6f912ad961191bbbb41a8db0","modified":1696042786522},{"_id":"source/_posts/编译AppleALC出现错误.md","hash":"57a330990be3b1359f068a742ba6582138f8b11e","modified":1696042786522},{"_id":"source/_posts/群晖CPU和内存占用过高的排查记录.md","hash":"5a92fcfd79728b0bfc1016b758ed7997071a7a71","modified":1696042786522},{"_id":"source/_posts/群晖docker出现注册表无法访问的解决办法.md","hash":"afbbadf14e4790b5450645d7e817a962338725b5","modified":1696042786522},{"_id":"source/_posts/老子与太上老君.md","hash":"99f91c5a8f0805fcfe2a42adad8cc648ee0a8298","modified":1696042786523},{"_id":"source/_posts/荒唐-文,古龙.md","hash":"70cdb2f4037bbb959c0ae8aa269bdb29cca7cdbc","modified":1696042786523},{"_id":"source/_posts/西游记中的谜.md","hash":"3bc6e079e08417a23987d9c9d3c0c7a5b8b36298","modified":1696042786523},{"_id":"source/_posts/记在8月.md","hash":"1268ed2c89594ab1307718256cd1c2a9bd07159b","modified":1696042786523},{"_id":"source/_posts/论坛社交的没落,终究是败给了时代.md","hash":"01a516159a32072c35a8f3ca768f70896010d6ab","modified":1696042786523},{"_id":"source/_posts/路下如烟.md","hash":"f2f63d97d0a5cc157c6e144c5850043af0c51ad7","modified":1696042786524},{"_id":"source/_posts/还有两天就过完2016.md","hash":"3cfbef10d23b10d3e4493358f57b4dab5648b6ef","modified":1696042786524},{"_id":"source/_posts/阿里悟空服务下线.md","hash":"c996e8f382b00c88fbc7825591f75246f2ea5811","modified":1696042786524},{"_id":"source/_posts/黄易先生逝世.md","hash":"3e8dc9c5e8911ae47321360001414b8f82ca4e04","modified":1696042786524},{"_id":"source/memos/index.md","hash":"6c2406c63acda7eab75fd039a3b99bdf0e50067b","modified":1696042786525},{"_id":"source/tags/index.md","hash":"d80916d59f33044c234fa668f896bfe9055f16d3","modified":1696042786525},{"_id":"source/links/index.md","hash":"eb6bc34c7455942310319c1831164d41dccf195c","modified":1696042786525},{"_id":"source/wechat.png","hash":"f14b99efb6d6a6bf8039af05b099cc147f1d668b","modified":1695973866419},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_tag/tag.styl","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1695973852140},{"_id":"node_modules/hexo-theme-fluid/package.json","hash":"b2c283d4e9aaf9ba49b8abb81adc03117b0e07db","modified":1696042784544},{"_id":"node_modules/hexo-theme-fluid/_config.yml","hash":"cdde6c6d6a1bdf9fb965313e21d92cf6213582b6","modified":1696042784537},{"_id":"node_modules/hexo-theme-fluid/LICENSE","hash":"26f9356fd6e84b5a88df6d9014378f41b65ba209","modified":1696042784536},{"_id":"node_modules/hexo-theme-fluid/README.md","hash":"49f681a203eecfa7127ac22edc13bd3b49693d0a","modified":1696042784537},{"_id":"node_modules/hexo-theme-fluid/languages/de.yml","hash":"0e7d455d9e004ff15d8924b7a0c35cea25ee5b1d","modified":1696042784537},{"_id":"node_modules/hexo-theme-fluid/languages/en.yml","hash":"cb11b39f44ea069652c9647179606b6cecc98d50","modified":1696042784538},{"_id":"node_modules/hexo-theme-fluid/languages/ja.yml","hash":"3dd6d20f8d26585a7c154a8e59fe8d5d902f4c6a","modified":1696042784538},{"_id":"node_modules/hexo-theme-fluid/languages/eo.yml","hash":"a556251cc50a5680578c03f1efbf252b1f4ab860","modified":1696042784538},{"_id":"node_modules/hexo-theme-fluid/languages/zh-CN.yml","hash":"a52da1a56925b76415b48e473cc7edf6bf11de21","modified":1696042784538},{"_id":"node_modules/hexo-theme-fluid/layout/404.ejs","hash":"b84d575c7b7f778b4cb64e89ad3d0aed4a896820","modified":1696042784539},{"_id":"node_modules/hexo-theme-fluid/languages/zh-HK.yml","hash":"80ed400a7adaa92ea54fc7f5d534c9af795bed00","modified":1696042784538},{"_id":"node_modules/hexo-theme-fluid/languages/es.yml","hash":"7112594259c88c04714be152af7fd377687dad40","modified":1696042784538},{"_id":"node_modules/hexo-theme-fluid/languages/zh-TW.yml","hash":"596d031dff3826ae8e4ffc8931fff28977b73247","modified":1696042784538},{"_id":"node_modules/hexo-theme-fluid/layout/archive.ejs","hash":"7c1f44005849791feae4abaa10fae4cb983d3277","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/languages/ru.yml","hash":"7dc78f22696649a4c68dc65a9b52d9a992fa82a0","modified":1696042784538},{"_id":"node_modules/hexo-theme-fluid/layout/category.ejs","hash":"f099161b738a16a32253f42085b5444f902018ed","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/layout/.DS_Store","hash":"e2295dbe42d85b294e6f3aeefaf3623bd31759ed","modified":1695973851999},{"_id":"node_modules/hexo-theme-fluid/layout/about.ejs","hash":"163bee643e6a38912d3ae70923c83c48d57222e7","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/layout/tag.ejs","hash":"9d686364c4d16a1a9219471623af452035c5b966","modified":1696042784544},{"_id":"node_modules/hexo-theme-fluid/layout/categories.ejs","hash":"13859726c27b6c79b5876ec174176d0f9c1ee164","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/layout/index.ejs","hash":"9b4c154462ce78de4c9ea7dd15dce4ca8e8c1cf8","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/layout/page.ejs","hash":"ed5007a3feb8f14d3d2843271bfb298eb0c56219","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/layout/layout.ejs","hash":"7e0023474128fbe4d68c467704c41f1712432415","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/layout/links.ejs","hash":"1cac32ec4579aaf7b9fa39d317497331d4c5e1dd","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/layout/tags.ejs","hash":"1d06af34b6cf1d8a20d2eb565e309326ceba309f","modified":1696042784544},{"_id":"node_modules/hexo-theme-fluid/scripts/.DS_Store","hash":"daec53fd4601c37ca272321ba2eb594d9b0a43ac","modified":1695973852051},{"_id":"node_modules/hexo-theme-fluid/layout/post.ejs","hash":"75ab6958d929e92566ca580d0b8bd0eeae10649a","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/source/.DS_Store","hash":"e11e97632e6d13d5b9dccadcc514268f3c039508","modified":1695973852098},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/category-chains.ejs","hash":"18309584aab83bc4deb20723ebad832149dd2e24","modified":1696042784539},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments.ejs","hash":"d707c47b2638c94e489bc43d4cfd098b7c58447f","modified":1696042784539},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/paginator.ejs","hash":"0f38a2c238169edcb63fc46c23bfc529ff3859b7","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/category-list.ejs","hash":"f8d2f1907450e61968e6d54443e9be8138196a77","modified":1696042784539},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/archive-list.ejs","hash":"7520fbf91f762207c2ab06b2c293235cd5b23905","modified":1696042784539},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/markdown-plugins.ejs","hash":"fc4bdf7de0cf1a66d0e5e4fba1b31d6f7ed49468","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/css.ejs","hash":"85f6e051550907681ab4ed2e268ac8f6e9ebf931","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/footer.ejs","hash":"10ccfb8eef4e16182183c9a3e175c90d5b6397d3","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/scripts/events/index.js","hash":"79de5a379b28cad759a49048351c7f6b8915bd7d","modified":1696042784544},{"_id":"node_modules/hexo-theme-fluid/scripts/filters/default-injects.js","hash":"b2013ae8e189cd07ebc8a2ff48a78e153345210f","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/scripts.ejs","hash":"da5810785105e5075861593c7ac22c7aa9665a72","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/scripts/filters/locals.js","hash":"58d0fec976f6b1d35e7ea03edc45414088acf05c","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/scripts/generators/index-generator.js","hash":"9159fc22fa84a7b605dd15fe4104f01fe9c71147","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/scripts/generators/local-search.js","hash":"9ac5ddad06e9b0e6015ce531430018182a4bc0fa","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/button.js","hash":"3eb43a8cdea0a64576ad6b31b4df6c2bf5698d4c","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/scripts/generators/pages.js","hash":"d3e75f53c59674d171309e50702954671f31f1a4","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/scripts/filters/post-filter.js","hash":"0047666f996c54017e06668b5242ed8a311ebce0","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/checkbox.js","hash":"4938610c3543a921a341bc074626d511cb1a4b45","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/group-image.js","hash":"4aeebb797026f1df25646a5d69f7fde79b1bcd26","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/mermaid.js","hash":"75160561e1ef3603b6d2ad2938464ab1cb77fd38","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/label.js","hash":"f05a6d32cca79535b22907dc03edb9d3fa2d8176","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/date.js","hash":"9bda6382f61b40a20c24af466fe10c8366ebb74c","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/scripts/tags/note.js","hash":"e3b456a079e5dc0032473b516c865b20f83d2c26","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/search.ejs","hash":"70e1c929e084ca8a2648cedabf29b372511ea2b8","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/engine.js","hash":"d3a231d106795ce99cb0bc77eb65f9ae44515933","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/import.js","hash":"ca53e8dbf7d44cfd372cfa79ac60f35a7d5b0076","modified":1696042784546},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/export-config.js","hash":"8e67b522c47aa250860e3fe2c733f1f958a506c0","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/header.ejs","hash":"0d5e397d30051e5fbabe7b47cfd1f1e6a5820af1","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/scope.js","hash":"d41d9d658fcb54964b388598e996747aadb85b0f","modified":1696042784546},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/injects.js","hash":"1ad2ae6b11bd8806ee7dd6eb7140d8b54a95d613","modified":1696042784546},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/page.js","hash":"4607607445233b3029ef20ed5e91de0da0a7f9c5","modified":1696042784546},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/wordcount.js","hash":"4543b8954c5c2ca91191cc0d53cf071b3f26faaa","modified":1696042784546},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/url.js","hash":"2a6a8288176d0e0f6ec008056bf2745a86e8943e","modified":1696042784546},{"_id":"node_modules/hexo-theme-fluid/scripts/helpers/utils.js","hash":"226f99b465ff513de075a8e78b321d6cb62592ca","modified":1696042784546},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/compare-versions.js","hash":"dbbc928c914fc2bd242cd66aa0c45971aec13a5d","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/resolve.js","hash":"8c4a8b62aa8608f12f1e9046231dff04859dc3e9","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/object.js","hash":"33b57e4decdc5e75c518859f168c8ba80b2c665b","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/url-join.js","hash":"718aab5e7b2059a06b093ca738de420d9afa44ba","modified":1696042784547},{"_id":"node_modules/hexo-theme-fluid/source/css/main.styl","hash":"855ae5fe229c51afa57f7645f6997a27a705d7e4","modified":1696042784553},{"_id":"node_modules/hexo-theme-fluid/scripts/events/.DS_Store","hash":"80308812974d7cb7e001cd8f64ff9fced30ff139","modified":1695973852051},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/head.ejs","hash":"7b7b1d098726e86687a15fe3d520d178577ffcae","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/source/css/mac.styl","hash":"cd35967b51908ab12b84b878f6830453ec695b77","modified":1695973852156},{"_id":"node_modules/hexo-theme-fluid/source/css/highlight-dark.styl","hash":"45695ef75c31a4aa57324dd408b7e2327a337018","modified":1696042784553},{"_id":"node_modules/hexo-theme-fluid/source/css/highlight.styl","hash":"a9efc52a646a9e585439c768557e3e3c9e3326dc","modified":1696042784553},{"_id":"node_modules/hexo-theme-fluid/scripts/utils/.DS_Store","hash":"df2fbeb1400acda0909a32c1cf6bf492f1121e07","modified":1695973852091},{"_id":"node_modules/hexo-theme-fluid/source/css/gitalk.css","hash":"a57b3cc8e04a0a4a27aefa07facf5b5e7bca0e76","modified":1696042784553},{"_id":"node_modules/hexo-theme-fluid/source/img/.DS_Store","hash":"df2fbeb1400acda0909a32c1cf6bf492f1121e07","modified":1695973852157},{"_id":"node_modules/hexo-theme-fluid/source/js/boot.js","hash":"38bd26c6b7acdafda86dda3560e6a3ca488d3c76","modified":1696042784555},{"_id":"node_modules/hexo-theme-fluid/source/img/avatar.png","hash":"fe739a158cc128f70f780eb5fa96f388b81d478f","modified":1695973852157},{"_id":"node_modules/hexo-theme-fluid/source/js/color-schema.js","hash":"76a198f8721352ebeaf5b2ef2f4db00612da4796","modified":1696042784555},{"_id":"node_modules/hexo-theme-fluid/source/img/fluid.png","hash":"64b215db2cb3af98fe639e94537cb5209f959c78","modified":1695973852160},{"_id":"node_modules/hexo-theme-fluid/source/img/loading.gif","hash":"2d2fc0f947940f98c21afafef39ecf226a2e8d55","modified":1695973852160},{"_id":"node_modules/hexo-theme-fluid/source/img/police_beian.png","hash":"90efded6baa2dde599a9d6b1387973e8e64923ea","modified":1695973852166},{"_id":"node_modules/hexo-theme-fluid/source/js/img-lazyload.js","hash":"cbdeca434ec4da51f488c821d51b4d23c73294af","modified":1696042784555},{"_id":"node_modules/hexo-theme-fluid/source/js/events.js","hash":"89e3561488a618ed0caeb9edf18e441978e29c25","modified":1696042784555},{"_id":"node_modules/hexo-theme-fluid/source/js/plugins.js","hash":"c34916291e392a774ff3e85c55badb83e8661297","modified":1696042784555},{"_id":"node_modules/hexo-theme-fluid/source/js/utils.js","hash":"b82e7c289a66dfd36064470fd41c0e96fc598b43","modified":1696042784555},{"_id":"node_modules/hexo-theme-fluid/source/xml/local-search.xml","hash":"8c96ba6a064705602ce28d096fd7dd9069630a55","modified":1696042784555},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/changyan.ejs","hash":"c9b2d68ed3d375f1953e7007307d2a3f75ed6249","modified":1696042784539},{"_id":"node_modules/hexo-theme-fluid/source/js/local-search.js","hash":"b9945f76f8682f3ec32edfb285b26eb559f7b7e8","modified":1696042784555},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/discuss.ejs","hash":"98d065b58ce06b7d18bff3c974e96fa0f34ae03a","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/source/js/leancloud.js","hash":"82bf785025a2420c5afd7e494f8233a79977e49d","modified":1696042784555},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/giscus.ejs","hash":"95f8b866b158eff9352c381c243b332a155a5110","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/disqus.ejs","hash":"aab4a4d24c55231a37db308ae94414319cecdd9b","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/cusdis.ejs","hash":"5f9dc012be27040bbe874d0c093c0d53958cc987","modified":1696042784539},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/livere.ejs","hash":"2264758fed57542a7389c7aa9f00f1aefa17eb87","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/gitalk.ejs","hash":"843bc141a4545eb20d1c92fb63c85d459b4271ec","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/remark42.ejs","hash":"d4e9532feeb02aed61bd15eda536b5b631454dac","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/valine.ejs","hash":"19ba937553dddd317f827d682661a1066a7b1f30","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/footer/beian.ejs","hash":"4fb9b5dd3f3e41a586d6af44e5069afe7c81fff2","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/waline.ejs","hash":"12727da7cf3ac83443270f550be4d1c06135b52b","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/header/navigation.ejs","hash":"870db75e4e403a840c4463dfeed2c9114846e7cc","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/footer/statistics.ejs","hash":"454d8dd4c39f9494ebeb03ca0746f5bc122af76a","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/header/banner.ejs","hash":"e07757b59e7b89eea213d0e595cb5932f812fd32","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/code-widget.ejs","hash":"3a505cba37942badf62a56bbb8b605b72af330aa","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/encrypt.ejs","hash":"0fff24cf5bf99fbe5c56c292e2eac4a89bf29db4","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/analytics.ejs","hash":"4f68c80bd1395e2f6d11e373116e54de11cb62e8","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/fancybox.ejs","hash":"9d1ea2a46b8c8ad8c168594d578f40764818ef13","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/anchorjs.ejs","hash":"40181442d3a2b8734783a0ad7caf2d2522e3f2ab","modified":1696042784541},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/highlight.ejs","hash":"7529dd215b09d3557804333942377b9e20fa554e","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/twikoo.ejs","hash":"d84bcb5ccd78470a60c067fc914ac0ac67ac8777","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/category-bar.ejs","hash":"8772bce97ed297e7a88523f4e939ed6436c22f87","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/mermaid.ejs","hash":"03ac02762f801970d1c4e73d6ec8d4c503780e50","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/comments/utterances.ejs","hash":"c7ccf7f28308334a6da6f5425b141a24b5eca0e2","modified":1696042784540},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/nprogress.ejs","hash":"4c2d39ce816b8a6dcd6b53113c8695f8bd650a23","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/math.ejs","hash":"dcbf9a381ee76f2f1f75fcbc22c50a502ec85023","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/plugins/typed.ejs","hash":"f345374885cd6a334f09a11f59c443b5d577c06c","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/compatible-configs.js","hash":"ef474d1fa5bbafc52619ced0f9dc7eaf2affb363","modified":1696042784544},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/sidebar-left.ejs","hash":"9992c99b3eb728ad195970e1b84d665f2c8691c4","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/footnote.js","hash":"b2f61b91fffb17d11ad56811f07d52d23f012741","modified":1696042784544},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/hello.js","hash":"44c5eb97b98813a07c659d6afedd17fad63b1821","modified":1696042784544},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/highlight.js","hash":"8d3ae1ec6660fbb0e563bc08c2f8deefde1f3bf6","modified":1696042784544},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/lazyload.js","hash":"9ba0d4bc224e22af8a5a48d6ff13e5a0fcfee2a4","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/injects.js","hash":"5ae4b07204683e54b5a1b74e931702bbce2ac23e","modified":1696042784544},{"_id":"node_modules/hexo-theme-fluid/source/css/_functions/base.styl","hash":"2e46f3f4e2c9fe34c1ff1c598738fc7349ae8188","modified":1696042784548},{"_id":"node_modules/hexo-theme-fluid/scripts/events/lib/merge-configs.js","hash":"7c944c43b2ece5dd84859bd9d1fe955d13427387","modified":1696042784545},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/copyright.ejs","hash":"529f3069742b3d338c769ba2d836e7f3c342a09d","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/sidebar-right.ejs","hash":"d5fcc9b60e02f869a29a8c17a16a6028ecc1e6d8","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/meta-bottom.ejs","hash":"375974ec017696e294dc12469fb0ae257800dc2d","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/meta-top.ejs","hash":"ce6e9f578f4faa45840abddf8f46af3f4b69c177","modified":1696042784542},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/pages.styl","hash":"b8e887bc7fb3b765a1f8ec9448eff8603a41984f","modified":1696042784552},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_about/about.styl","hash":"97fe42516ea531fdad771489b68aa8b2a7f6ae46","modified":1696042784548},{"_id":"node_modules/hexo-theme-fluid/source/css/_mixins/base.styl","hash":"542e306ee9494e8a78e44d6d7d409605d94caeb3","modified":1696042784548},{"_id":"node_modules/hexo-theme-fluid/layout/_partials/post/toc.ejs","hash":"635a89060fbf72eeda066fc4bd0a97462f069417","modified":1696042784543},{"_id":"node_modules/hexo-theme-fluid/source/css/_variables/base.styl","hash":"4ed5f0ae105ef4c7dd92eaf652ceda176c38e502","modified":1696042784553},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_archive/archive.styl","hash":"c475e6681546d30350eaed11f23081ecae80c375","modified":1696042784548},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/inline.styl","hash":"411a3fa3f924a87e00ff04d18b5c83283b049a4d","modified":1696042784551},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/base.styl","hash":"643284c567665f96915f0b64e59934dda315f74d","modified":1696042784550},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/color-schema.styl","hash":"e413212e5a667d5b8299c4d2a39c4dfa1378d119","modified":1696042784550},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_category/category-chain.styl","hash":"0cdf7ef50dfd0669d3b257821384ff31cd81b7c9","modified":1696042784551},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/keyframes.styl","hash":"94065ea50f5bef7566d184f2422f6ac20866ba22","modified":1696042784551},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/comment.styl","hash":"780f3788e7357bcd3f3262d781cb91bb53976a93","modified":1696042784552},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_index/index.styl","hash":"0acbd71633bcc7191672ea4e1b2277bea350d73b","modified":1696042784552},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/print.styl","hash":"166afbc596ea4b552bad7290ec372d25ec34db7b","modified":1696042784551},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_category/category-bar.styl","hash":"cc6df43fef6bb3efecbfdd8b9e467424a1dea581","modified":1696042784551},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/highlight.styl","hash":"4df764d298fe556e501db4afc2b05686fe6ebcfb","modified":1696042784552},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_tag/tags.styl","hash":"65bfc01c76abc927fa1a23bf2422892b0d566c3f","modified":1696042784552},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_category/category-list.styl","hash":"7edfe1b571ecca7d08f5f4dbcf76f4ffdcfbf0b5","modified":1696042784551},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_links/links.styl","hash":"5c7f2044e3f1da05a3229537c06bd879836f8d6e","modified":1696042784552},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/post-page.styl","hash":"ecf3488566b374d564ae985c61e08562ba908023","modified":1696042784552},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/board.styl","hash":"4397037fc3f0033dbe546c33cd9dbdabd8cb1632","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/banner.styl","hash":"7a0bd629bc234fc75e3cc8e3715ffada92f09e73","modified":1696042784548},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/markdown.styl","hash":"1e3d3a82721e7c10bcfcecec6d81cf2979039452","modified":1696042784552},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_post/post-tag.styl","hash":"27f70062415ccf66a9b6f4952db124fc1471fda5","modified":1696042784552},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/anchorjs.styl","hash":"e0cebda4a6f499aff75e71417d88caa7ceb13b94","modified":1696042784548},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/code-widget.styl","hash":"b66ab013f0f37d724a149b85b3c7432afcf460ad","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/footnote.styl","hash":"ae9289cc89649af2042907f8a003303b987f3404","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/copyright.styl","hash":"26f71a9cd60d96bb0cb5bbdf58150b8e524d9707","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/ngrogress.styl","hash":"5d225357b4a58d46118e6616377168336ed44cb2","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/footer.styl","hash":"2caaca71dd1ff63d583099ed817677dd267b457e","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/noscript.styl","hash":"0cf2f2bb44f456150d428016675d5876a9d2e2aa","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/pagination.styl","hash":"8bb1b68e5f3552cb48c2ffa31edbc53646a8fb4c","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/search.styl","hash":"10f7e91a91e681fb9fe46f9df7707b9ef78707c8","modified":1696042784550},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/qrcode.styl","hash":"78704a94c0436097abfb0e0a57abeb3429c749b7","modified":1696042784550},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/header.styl","hash":"c4459248c66ea1326feed021179b847ae91d465f","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/modal.styl","hash":"adf6c1e5c8e1fb41c77ce6e2258001df61245aa2","modified":1696042784549},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/scroll-btn.styl","hash":"f0e429a27fa8a7658fcbddbb4d4dbe4afa12499a","modified":1696042784550},{"_id":"node_modules/hexo-theme-fluid/source/css/_pages/_base/_widget/toc.styl","hash":"9e7452aa2372153f25d7a4675c9d36d281a65d24","modified":1696042784550},{"_id":"node_modules/hexo-theme-fluid/source/img/default.png","hash":"167a12978d80371cf578c8a2e45c24a2eb25b6fb","modified":1695973852159}],"Category":[{"name":"hexo","_id":"cln4obyee0007oko00w5f68mk"},{"name":"随笔","_id":"cln4obyei000doko0efws4wkb"},{"name":"推荐","_id":"cln4obyen000ooko00lvlahvt"},{"name":"分享","_id":"cln4obyet0019oko0exle3517"},{"name":"Note","_id":"cln4obyfa0037oko059cu8mmi"}],"Data":[],"Page":[{"title":"分类","type":"categories","comments":0,"date":"2023-04-07T06:24:11.000Z","_content":"","source":"categories/index.md","raw":"---\ntitle: 分类\ntype: \"categories\"\ncomments: false\ndate: 2023-04-07 14:24:11\n---\n","updated":"2023-09-30T02:59:46.524Z","path":"categories/index.html","_id":"cln4obye50000oko010ls9b3b","layout":"page","content":"","site":{"data":{}},"excerpt":"","more":""},{"title":"朋友圈","date":"2022-10-08T16:38:16.000Z","comments":0,"comment":false,"_content":"\n
\n\n\n","source":"fcircle/index.md","raw":"---\ntitle: 朋友圈\ndate: 2022-10-09 00:38:16\ncomments: false\ncomment: false\n---\n\n
\n\n\n","updated":"2023-09-30T02:59:46.525Z","path":"fcircle/index.html","_id":"cln4obyea0002oko010lp6dt9","layout":"page","content":"
\n\n\n","site":{"data":{}},"excerpt":"","more":"
\n\n\n"},{"title":"关于","layout":"about","comments":0,"date":"2023-04-07T06:17:13.000Z","_content":"## 关于本站 \n* 本站框架基于`Hexo`\n* 源代码托管于`github`\n* 托管于`netlify`,自动生成静态页面\n\n## 关于我\n平平无奇 \n中年男性\n资深网民\nDIY爱好者\n\n## 打赏\n![支付宝](/zhifubao.png)\n![微信](/weixin.png)\n\n","source":"about/index.md","raw":"---\ntitle: 关于\nlayout: \"about\"\ncomments: false\ndate: 2023-04-07 14:17:13\n---\n## 关于本站 \n* 本站框架基于`Hexo`\n* 源代码托管于`github`\n* 托管于`netlify`,自动生成静态页面\n\n## 关于我\n平平无奇 \n中年男性\n资深网民\nDIY爱好者\n\n## 打赏\n![支付宝](/zhifubao.png)\n![微信](/weixin.png)\n\n","updated":"2023-09-30T02:59:46.524Z","path":"about/index.html","_id":"cln4obyed0005oko0as8r4ila","content":"

关于本站

    \n
  • 本站框架基于Hexo
  • \n
  • 源代码托管于github
  • \n
  • 托管于netlify,自动生成静态页面
  • \n
\n

关于我

平平无奇
中年男性
资深网民
DIY爱好者

\n

打赏

\"支付宝\"
\"微信\"

\n","site":{"data":{}},"excerpt":"","more":"

关于本站

    \n
  • 本站框架基于Hexo
  • \n
  • 源代码托管于github
  • \n
  • 托管于netlify,自动生成静态页面
  • \n
\n

关于我

平平无奇
中年男性
资深网民
DIY爱好者

\n

打赏

\"支付宝\"
\"微信\"

\n"},{"title":"闲言碎语","comments":0,"date":"2023-06-07T06:17:13.000Z","_content":"\n

\n 随便记录\n

\n
\n\n\n\n\n\n\n\n","source":"memos/index.md","raw":"---\ntitle: 闲言碎语\ncomments: false\ndate: 2023-06-07 14:17:13\n---\n\n

\n 随便记录\n

\n
\n\n\n\n\n\n\n\n","updated":"2023-09-30T02:59:46.525Z","path":"memos/index.html","_id":"cln4obyef0008oko08jqj1gzm","layout":"page","content":"

\n 随便记录\n

\n
\n\n\n\n\n\n\n\n","site":{"data":{}},"excerpt":"","more":"

\n 随便记录\n

\n
\n\n\n\n\n\n\n\n"},{"title":"标签","type":"tags","comments":0,"date":"2023-04-07T06:19:21.000Z","_content":"","source":"tags/index.md","raw":"---\ntitle: 标签\ntype: \"tags\"\ncomments: false\ndate: 2023-04-07 14:19:21\n---\n","updated":"2023-09-30T02:59:46.525Z","path":"tags/index.html","_id":"cln4obyeh000aoko029i22b4x","layout":"page","content":"","site":{"data":{}},"excerpt":"","more":""},{"title":"links","date":"2023-09-25T07:16:54.000Z","_content":"","source":"links/index.md","raw":"---\ntitle: links\ndate: 2023-09-25 15:16:54\n---\n","updated":"2023-09-30T02:59:46.525Z","path":"links/index.html","_id":"cln4obyei000foko09ne3fjqd","comments":1,"layout":"page","content":"","site":{"data":{}},"excerpt":"","more":""}],"Post":[{"abbrlink":"","date":"2023-09-30T02:59:46.510Z","excerpt":"...","title":"Hexo使用指南","updated":"2023-09-30T02:59:46.510Z","_content":"Welcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues).\n\n## Quick Start\n\n### Create a new post\n\n```bash\n$ hexo new \"My New Post\"\n```\n\nMore info: [Writing](https://hexo.io/docs/writing.html)\n\n### Run server\n\n```bash\n$ hexo server\n```\n\nMore info: [Server](https://hexo.io/docs/server.html)\n\n### Generate static files\n\n```bash\n$ hexo generate\n```\n\nMore info: [Generating](https://hexo.io/docs/generating.html)\n\n### Deploy to remote sites\n\n```bash\n$ hexo deploy\n```\n\n```\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}\n{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}\n\n{% label text color %}\n\n```\n\ndemo\n\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}\n{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}\n\n{% label text color %} test {% label test color %}\n\nMore info: [Deployment](https://hexo.io/docs/one-command-deployment.html)\n","source":"_drafts/hello-world.md","raw":"---\nabbrlink: ''\ncategories:\n- - hexo\ndate: ''\nexcerpt: '...'\ntags:\n- hexo\ntitle: Hexo使用指南\nupdated: 2023-6-13T14:24:12.438+8:0\n---\nWelcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues).\n\n## Quick Start\n\n### Create a new post\n\n```bash\n$ hexo new \"My New Post\"\n```\n\nMore info: [Writing](https://hexo.io/docs/writing.html)\n\n### Run server\n\n```bash\n$ hexo server\n```\n\nMore info: [Server](https://hexo.io/docs/server.html)\n\n### Generate static files\n\n```bash\n$ hexo generate\n```\n\nMore info: [Generating](https://hexo.io/docs/generating.html)\n\n### Deploy to remote sites\n\n```bash\n$ hexo deploy\n```\n\n```\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}\n{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}\n\n{% label text color %}\n\n```\n\ndemo\n\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}\nThis is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}\n{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}\n\n{% label text color %} test {% label test color %}\n\nMore info: [Deployment](https://hexo.io/docs/one-command-deployment.html)\n","slug":"hello-world","published":0,"_id":"cln4obye70001oko0bxdi99ti","comments":1,"layout":"post","photos":[],"link":"","content":"

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

\n

Quick Start

Create a new post

1
$ hexo new "My New Post"
\n\n

More info: Writing

\n

Run server

1
$ hexo server
\n\n

More info: Server

\n

Generate static files

1
$ hexo generate
\n\n

More info: Generating

\n

Deploy to remote sites

1
$ hexo deploy
\n\n
1
2
3
4
5
6
This is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}
This is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}
{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}

{% label text color %}

\n\n

demo

\n

This is my website, click the button Butterfly
This is my website, click the button Butterfly

\nButterfly\n\n test \n\n

More info: Deployment

\n","site":{"data":{}},"more":"

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

\n

Quick Start

Create a new post

1
$ hexo new "My New Post"
\n\n

More info: Writing

\n

Run server

1
$ hexo server
\n\n

More info: Server

\n

Generate static files

1
$ hexo generate
\n\n

More info: Generating

\n

Deploy to remote sites

1
$ hexo deploy
\n\n
1
2
3
4
5
6
This is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,,outline %}
This is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,outline %}
{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,green larger %}

{% label text color %}

\n\n

demo

\n

This is my website, click the button Butterfly
This is my website, click the button Butterfly

\nButterfly\n\n test \n\n

More info: Deployment

\n"},{"title":"15级强台风山竹即将登陆广东","excerpt":"","abbrlink":54465,"date":"2018-09-15T11:42:12.000Z","_content":"\n鉴于其带来的巨大危害,2006年12月第39次世界气象组织台风委员会会议决定把台风“榴莲”除名!\n\n但是对水果执着热爱的泰国人民毅然决定用另一种水果给台风“榴莲”补位,补位的台风名称正是——“山竹”。 \n\n作为超强台风“榴莲”的补位者,“山竹”果然不辱前辈之名,早在9月11日08时就完成究极进化,成为超强台风! \n\n来了!超强台风“山竹”即将冲进南海!\n\n9月14日17时其位于距我市1291公里的菲律宾以东洋面,中心风力17级以上(65米/秒,相当于234公里/小时),中心最低气压910百帕,将以30公里/时的速度向西北方向移动。 \n然而超强台风“山竹”虽然强大,也不是没有敌手。\n当它靠近南海的时候,庞大的副热带高压早已在此恭候多日,超强台风“山竹”将不可避免地与华南沿海的霸主副热带高压来一场正面“对抗”! \n预计“山竹”将于14日夜间横穿菲律宾吕宋岛北部山地,15日上午进入南海东北部海面,强度减弱,趋向粤西和海南东部沿海,16日夜间在上述地区以强台风或超强台风登陆,16日中午前后距我市最近200-300公里。\n不排除在阳江至茂名之间登陆、对深圳造成更大风雨影响的可能。 \n\n深圳市气象台已于2018年09月14日12时30分在全市发布台风白色预警,预计“山竹”将可能在48小时内影响我市,全市进入台风注意状态,遵照海事、渔政部门的防风指令或通知,做好避风准备。 \n \n风力预报:台风“山竹”7级大风圈半径将达到700公里左右!受台风“山竹”影响,15日后半夜我市风力逐渐加大,16日白天沿海和高地最大阵风11-13级,内陆8-11级,16日下半夜风力开始减弱。","source":"_posts/15级强台风山竹即将登陆广东.md","raw":"---\ntitle: 15级强台风山竹即将登陆广东\ntags:\n - 台风\n - 山竹\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 54465\ndate: 2018-09-15 19:42:12\n---\n\n鉴于其带来的巨大危害,2006年12月第39次世界气象组织台风委员会会议决定把台风“榴莲”除名!\n\n但是对水果执着热爱的泰国人民毅然决定用另一种水果给台风“榴莲”补位,补位的台风名称正是——“山竹”。 \n\n作为超强台风“榴莲”的补位者,“山竹”果然不辱前辈之名,早在9月11日08时就完成究极进化,成为超强台风! \n\n来了!超强台风“山竹”即将冲进南海!\n\n9月14日17时其位于距我市1291公里的菲律宾以东洋面,中心风力17级以上(65米/秒,相当于234公里/小时),中心最低气压910百帕,将以30公里/时的速度向西北方向移动。 \n然而超强台风“山竹”虽然强大,也不是没有敌手。\n当它靠近南海的时候,庞大的副热带高压早已在此恭候多日,超强台风“山竹”将不可避免地与华南沿海的霸主副热带高压来一场正面“对抗”! \n预计“山竹”将于14日夜间横穿菲律宾吕宋岛北部山地,15日上午进入南海东北部海面,强度减弱,趋向粤西和海南东部沿海,16日夜间在上述地区以强台风或超强台风登陆,16日中午前后距我市最近200-300公里。\n不排除在阳江至茂名之间登陆、对深圳造成更大风雨影响的可能。 \n\n深圳市气象台已于2018年09月14日12时30分在全市发布台风白色预警,预计“山竹”将可能在48小时内影响我市,全市进入台风注意状态,遵照海事、渔政部门的防风指令或通知,做好避风准备。 \n \n风力预报:台风“山竹”7级大风圈半径将达到700公里左右!受台风“山竹”影响,15日后半夜我市风力逐渐加大,16日白天沿海和高地最大阵风11-13级,内陆8-11级,16日下半夜风力开始减弱。","slug":"15级强台风山竹即将登陆广东","published":1,"updated":"2023-09-30T02:59:46.510Z","_id":"cln4obyea0003oko05qum4gg0","comments":1,"layout":"post","photos":[],"link":"","content":"

鉴于其带来的巨大危害,2006年12月第39次世界气象组织台风委员会会议决定把台风“榴莲”除名!

\n

但是对水果执着热爱的泰国人民毅然决定用另一种水果给台风“榴莲”补位,补位的台风名称正是——“山竹”。

\n

作为超强台风“榴莲”的补位者,“山竹”果然不辱前辈之名,早在9月11日08时就完成究极进化,成为超强台风!

\n

来了!超强台风“山竹”即将冲进南海!

\n

9月14日17时其位于距我市1291公里的菲律宾以东洋面,中心风力17级以上(65米/秒,相当于234公里/小时),中心最低气压910百帕,将以30公里/时的速度向西北方向移动。
然而超强台风“山竹”虽然强大,也不是没有敌手。
当它靠近南海的时候,庞大的副热带高压早已在此恭候多日,超强台风“山竹”将不可避免地与华南沿海的霸主副热带高压来一场正面“对抗”!
预计“山竹”将于14日夜间横穿菲律宾吕宋岛北部山地,15日上午进入南海东北部海面,强度减弱,趋向粤西和海南东部沿海,16日夜间在上述地区以强台风或超强台风登陆,16日中午前后距我市最近200-300公里。
不排除在阳江至茂名之间登陆、对深圳造成更大风雨影响的可能。

\n

深圳市气象台已于2018年09月14日12时30分在全市发布台风白色预警,预计“山竹”将可能在48小时内影响我市,全市进入台风注意状态,遵照海事、渔政部门的防风指令或通知,做好避风准备。

\n

风力预报:台风“山竹”7级大风圈半径将达到700公里左右!受台风“山竹”影响,15日后半夜我市风力逐渐加大,16日白天沿海和高地最大阵风11-13级,内陆8-11级,16日下半夜风力开始减弱。

\n","site":{"data":{}},"more":"

鉴于其带来的巨大危害,2006年12月第39次世界气象组织台风委员会会议决定把台风“榴莲”除名!

\n

但是对水果执着热爱的泰国人民毅然决定用另一种水果给台风“榴莲”补位,补位的台风名称正是——“山竹”。

\n

作为超强台风“榴莲”的补位者,“山竹”果然不辱前辈之名,早在9月11日08时就完成究极进化,成为超强台风!

\n

来了!超强台风“山竹”即将冲进南海!

\n

9月14日17时其位于距我市1291公里的菲律宾以东洋面,中心风力17级以上(65米/秒,相当于234公里/小时),中心最低气压910百帕,将以30公里/时的速度向西北方向移动。
然而超强台风“山竹”虽然强大,也不是没有敌手。
当它靠近南海的时候,庞大的副热带高压早已在此恭候多日,超强台风“山竹”将不可避免地与华南沿海的霸主副热带高压来一场正面“对抗”!
预计“山竹”将于14日夜间横穿菲律宾吕宋岛北部山地,15日上午进入南海东北部海面,强度减弱,趋向粤西和海南东部沿海,16日夜间在上述地区以强台风或超强台风登陆,16日中午前后距我市最近200-300公里。
不排除在阳江至茂名之间登陆、对深圳造成更大风雨影响的可能。

\n

深圳市气象台已于2018年09月14日12时30分在全市发布台风白色预警,预计“山竹”将可能在48小时内影响我市,全市进入台风注意状态,遵照海事、渔政部门的防风指令或通知,做好避风准备。

\n

风力预报:台风“山竹”7级大风圈半径将达到700公里左右!受台风“山竹”影响,15日后半夜我市风力逐渐加大,16日白天沿海和高地最大阵风11-13级,内陆8-11级,16日下半夜风力开始减弱。

\n"},{"title":"2006-2016","excerpt":"","abbrlink":55116,"date":"2016-11-02T10:39:10.000Z","_content":"\n今天找phpwind5.3无意中看到了当年用过的那些论坛程序,ofstar,bbsxp,dvbbs,bbsgood,6kbbs,phpbb等等。 \n\n论坛毕竟没落了,SNS也是曾经也是引领过潮流的。\n\n忍不住登进那些曾经提问寻找答案的论坛,大部分ID注册的时间都在2006年。\n\n我上大二那年。 \n\n还有当年的sgcd. 在邮箱的网盘里找出了一份当年的备份,我在想要不要重新开始。 \n\n应该很难了,大部分的人都已经找不到了。 \n\n回想过去十年不胜唏嘘,这十年真的一事无成。\n\n除了还在联系的草莓,不知道谁还记得我。","source":"_posts/2006-2016.md","raw":"---\ntitle: 2006-2016\ntags:\n - 十年\n - 时光沉淀\n - 生活\n - 论坛\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 55116\ndate: 2016-11-02 18:39:10\n---\n\n今天找phpwind5.3无意中看到了当年用过的那些论坛程序,ofstar,bbsxp,dvbbs,bbsgood,6kbbs,phpbb等等。 \n\n论坛毕竟没落了,SNS也是曾经也是引领过潮流的。\n\n忍不住登进那些曾经提问寻找答案的论坛,大部分ID注册的时间都在2006年。\n\n我上大二那年。 \n\n还有当年的sgcd. 在邮箱的网盘里找出了一份当年的备份,我在想要不要重新开始。 \n\n应该很难了,大部分的人都已经找不到了。 \n\n回想过去十年不胜唏嘘,这十年真的一事无成。\n\n除了还在联系的草莓,不知道谁还记得我。","slug":"2006-2016","published":1,"updated":"2023-09-30T02:59:46.510Z","_id":"cln4obyee0006oko07b6qfj4f","comments":1,"layout":"post","photos":[],"link":"","content":"

今天找phpwind5.3无意中看到了当年用过的那些论坛程序,ofstar,bbsxp,dvbbs,bbsgood,6kbbs,phpbb等等。

\n

论坛毕竟没落了,SNS也是曾经也是引领过潮流的。

\n

忍不住登进那些曾经提问寻找答案的论坛,大部分ID注册的时间都在2006年。

\n

我上大二那年。

\n

还有当年的sgcd. 在邮箱的网盘里找出了一份当年的备份,我在想要不要重新开始。

\n

应该很难了,大部分的人都已经找不到了。

\n

回想过去十年不胜唏嘘,这十年真的一事无成。

\n

除了还在联系的草莓,不知道谁还记得我。

\n","site":{"data":{}},"more":"

今天找phpwind5.3无意中看到了当年用过的那些论坛程序,ofstar,bbsxp,dvbbs,bbsgood,6kbbs,phpbb等等。

\n

论坛毕竟没落了,SNS也是曾经也是引领过潮流的。

\n

忍不住登进那些曾经提问寻找答案的论坛,大部分ID注册的时间都在2006年。

\n

我上大二那年。

\n

还有当年的sgcd. 在邮箱的网盘里找出了一份当年的备份,我在想要不要重新开始。

\n

应该很难了,大部分的人都已经找不到了。

\n

回想过去十年不胜唏嘘,这十年真的一事无成。

\n

除了还在联系的草莓,不知道谁还记得我。

\n"},{"title":"求婚大作战","published":1,"hideInList":false,"cover":"https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2391225472.jpg","isTop":false,"abbrlink":"eedcfe1c","date":"2017-06-05T13:57:00.000Z","_content":"\n\n> 《求婚大作战》(プロポーズ大作戦)是日本富士电视台于2007年4月16日至6月25日播出的爱情电视剧。由山下智久、长泽雅美主演。\n> 该剧讲述了主人公岩瀬健一直暗恋青梅竹马吉田礼却没能告白,在参加她婚礼之时,借助妖精之力回到过去来完成他告白之路的故事。\n> 2008年3月25日,推出特别篇《求婚大作战SP》。 2012年2月8日,由韩国TV朝鲜电视台推出翻拍版。\n> 2017年4月24日,由张艺兴、陈都灵等人主演中国大陆翻拍版。\n\n时隔十年,中国也翻拍了当时日本热播的电视剧《求婚大作战》,剧情和台词都神还原原版电视剧,中国版大概就是原版11集加上《求婚大作战SP》,再加上本土化自编的最后三集。\n改编的大概也只有各个角色的名字,以及妖精变成了天使。\n我看这部青春校园爱情题材的电视剧主要是因为很喜欢陈都灵。\n今天看完这最后三集,只能说其是狗尾续貂。男主没有向女主求婚也就罢了,竟然还穿越回了未来,这让整个故事的逻辑全线崩盘。\n我对此剧的解读原本以为是让我们追忆有亲情友情和爱情的青春,珍惜眼前的一切。穿越回过去是为了让自己成长改正自己的错误,\n没想到故事开展到了穿越未来我就懵逼啦,这未来所发生的一切让我对未来完全没有憧憬和希望啊。那穿越回未来的意义何在呢,与求婚完全没有关系。编剧大可直接让他们结婚然后打上大字“四十年后”不更好吗?\n这种开放式的结局设定我是拒绝的。男主和女主结婚,快快乐乐生活在一起不是一个很好的happy ending,又点题又有观众爱看,真无力吐槽后三集。\n![求婚大作战][1]\n![求婚大作战2][2]\nPS,我也看到很多弹幕评论说,男主这样是找不到对象的,等等诸如此类的话。\n其实这也可以算是本剧翻拍的一个BUG,要知道早在十年前可不像如今的风气如此开放,那时的男女谈恋爱连牵手都会感觉到害羞,相信当时像男主角这样的男生不在少数,所以我们这代人看这部剧才特别的代入感,并没有丝毫的违和感。\n相反现在的少男少女看这部剧的时候也就只是看出了男主角的内向胆怯\n![67de513bly1feudbcquv6j20rs0ijk8j.jpg][3]\n![67de513bly1feudbdovpbj20v90kue81.jpg][4]\n![67de513bly1feudbm64a8j21jk112x6p.jpg][5]\n![67de513bly1feudbnd1y6j232e21o1kz.jpg][6]\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/49406005.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2391225472.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1478383849.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2427022229.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1255852638.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/4189057228.jpg","source":"_posts/2017-06-05-marry.md","raw":"---\ntitle: 求婚大作战\ntags:\n - 求婚\n - 狗尾续貂\n - 求婚大作战\n - 张艺兴\n - 陈都灵\npublished: true\nhideInList: false\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2391225472.jpg'\nisTop: false\nabbrlink: eedcfe1c\ndate: 2017-06-05 21:57:00\n---\n\n\n> 《求婚大作战》(プロポーズ大作戦)是日本富士电视台于2007年4月16日至6月25日播出的爱情电视剧。由山下智久、长泽雅美主演。\n> 该剧讲述了主人公岩瀬健一直暗恋青梅竹马吉田礼却没能告白,在参加她婚礼之时,借助妖精之力回到过去来完成他告白之路的故事。\n> 2008年3月25日,推出特别篇《求婚大作战SP》。 2012年2月8日,由韩国TV朝鲜电视台推出翻拍版。\n> 2017年4月24日,由张艺兴、陈都灵等人主演中国大陆翻拍版。\n\n时隔十年,中国也翻拍了当时日本热播的电视剧《求婚大作战》,剧情和台词都神还原原版电视剧,中国版大概就是原版11集加上《求婚大作战SP》,再加上本土化自编的最后三集。\n改编的大概也只有各个角色的名字,以及妖精变成了天使。\n我看这部青春校园爱情题材的电视剧主要是因为很喜欢陈都灵。\n今天看完这最后三集,只能说其是狗尾续貂。男主没有向女主求婚也就罢了,竟然还穿越回了未来,这让整个故事的逻辑全线崩盘。\n我对此剧的解读原本以为是让我们追忆有亲情友情和爱情的青春,珍惜眼前的一切。穿越回过去是为了让自己成长改正自己的错误,\n没想到故事开展到了穿越未来我就懵逼啦,这未来所发生的一切让我对未来完全没有憧憬和希望啊。那穿越回未来的意义何在呢,与求婚完全没有关系。编剧大可直接让他们结婚然后打上大字“四十年后”不更好吗?\n这种开放式的结局设定我是拒绝的。男主和女主结婚,快快乐乐生活在一起不是一个很好的happy ending,又点题又有观众爱看,真无力吐槽后三集。\n![求婚大作战][1]\n![求婚大作战2][2]\nPS,我也看到很多弹幕评论说,男主这样是找不到对象的,等等诸如此类的话。\n其实这也可以算是本剧翻拍的一个BUG,要知道早在十年前可不像如今的风气如此开放,那时的男女谈恋爱连牵手都会感觉到害羞,相信当时像男主角这样的男生不在少数,所以我们这代人看这部剧才特别的代入感,并没有丝毫的违和感。\n相反现在的少男少女看这部剧的时候也就只是看出了男主角的内向胆怯\n![67de513bly1feudbcquv6j20rs0ijk8j.jpg][3]\n![67de513bly1feudbdovpbj20v90kue81.jpg][4]\n![67de513bly1feudbm64a8j21jk112x6p.jpg][5]\n![67de513bly1feudbnd1y6j232e21o1kz.jpg][6]\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/49406005.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2391225472.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1478383849.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2427022229.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1255852638.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2017/06/05/4189057228.jpg","slug":"2017-06-05-marry","updated":"2023-09-30T02:59:46.510Z","_id":"cln4obyeg0009oko0gp7e41ho","comments":1,"layout":"post","photos":[],"link":"","content":"
\n

《求婚大作战》(プロポーズ大作戦)是日本富士电视台于2007年4月16日至6月25日播出的爱情电视剧。由山下智久、长泽雅美主演。
该剧讲述了主人公岩瀬健一直暗恋青梅竹马吉田礼却没能告白,在参加她婚礼之时,借助妖精之力回到过去来完成他告白之路的故事。
2008年3月25日,推出特别篇《求婚大作战SP》。 2012年2月8日,由韩国TV朝鲜电视台推出翻拍版。
2017年4月24日,由张艺兴、陈都灵等人主演中国大陆翻拍版。

\n
\n

时隔十年,中国也翻拍了当时日本热播的电视剧《求婚大作战》,剧情和台词都神还原原版电视剧,中国版大概就是原版11集加上《求婚大作战SP》,再加上本土化自编的最后三集。
改编的大概也只有各个角色的名字,以及妖精变成了天使。
我看这部青春校园爱情题材的电视剧主要是因为很喜欢陈都灵。
今天看完这最后三集,只能说其是狗尾续貂。男主没有向女主求婚也就罢了,竟然还穿越回了未来,这让整个故事的逻辑全线崩盘。
我对此剧的解读原本以为是让我们追忆有亲情友情和爱情的青春,珍惜眼前的一切。穿越回过去是为了让自己成长改正自己的错误,
没想到故事开展到了穿越未来我就懵逼啦,这未来所发生的一切让我对未来完全没有憧憬和希望啊。那穿越回未来的意义何在呢,与求婚完全没有关系。编剧大可直接让他们结婚然后打上大字“四十年后”不更好吗?
这种开放式的结局设定我是拒绝的。男主和女主结婚,快快乐乐生活在一起不是一个很好的happy ending,又点题又有观众爱看,真无力吐槽后三集。
\"求婚大作战\"
\"求婚大作战2\"
PS,我也看到很多弹幕评论说,男主这样是找不到对象的,等等诸如此类的话。
其实这也可以算是本剧翻拍的一个BUG,要知道早在十年前可不像如今的风气如此开放,那时的男女谈恋爱连牵手都会感觉到害羞,相信当时像男主角这样的男生不在少数,所以我们这代人看这部剧才特别的代入感,并没有丝毫的违和感。
相反现在的少男少女看这部剧的时候也就只是看出了男主角的内向胆怯
\"67de513bly1feudbcquv6j20rs0ijk8j.jpg\"
\"67de513bly1feudbdovpbj20v90kue81.jpg\"
\"67de513bly1feudbm64a8j21jk112x6p.jpg\"
\"67de513bly1feudbnd1y6j232e21o1kz.jpg\"

\n","site":{"data":{}},"excerpt":"","more":"
\n

《求婚大作战》(プロポーズ大作戦)是日本富士电视台于2007年4月16日至6月25日播出的爱情电视剧。由山下智久、长泽雅美主演。
该剧讲述了主人公岩瀬健一直暗恋青梅竹马吉田礼却没能告白,在参加她婚礼之时,借助妖精之力回到过去来完成他告白之路的故事。
2008年3月25日,推出特别篇《求婚大作战SP》。 2012年2月8日,由韩国TV朝鲜电视台推出翻拍版。
2017年4月24日,由张艺兴、陈都灵等人主演中国大陆翻拍版。

\n
\n

时隔十年,中国也翻拍了当时日本热播的电视剧《求婚大作战》,剧情和台词都神还原原版电视剧,中国版大概就是原版11集加上《求婚大作战SP》,再加上本土化自编的最后三集。
改编的大概也只有各个角色的名字,以及妖精变成了天使。
我看这部青春校园爱情题材的电视剧主要是因为很喜欢陈都灵。
今天看完这最后三集,只能说其是狗尾续貂。男主没有向女主求婚也就罢了,竟然还穿越回了未来,这让整个故事的逻辑全线崩盘。
我对此剧的解读原本以为是让我们追忆有亲情友情和爱情的青春,珍惜眼前的一切。穿越回过去是为了让自己成长改正自己的错误,
没想到故事开展到了穿越未来我就懵逼啦,这未来所发生的一切让我对未来完全没有憧憬和希望啊。那穿越回未来的意义何在呢,与求婚完全没有关系。编剧大可直接让他们结婚然后打上大字“四十年后”不更好吗?
这种开放式的结局设定我是拒绝的。男主和女主结婚,快快乐乐生活在一起不是一个很好的happy ending,又点题又有观众爱看,真无力吐槽后三集。
\"求婚大作战\"
\"求婚大作战2\"
PS,我也看到很多弹幕评论说,男主这样是找不到对象的,等等诸如此类的话。
其实这也可以算是本剧翻拍的一个BUG,要知道早在十年前可不像如今的风气如此开放,那时的男女谈恋爱连牵手都会感觉到害羞,相信当时像男主角这样的男生不在少数,所以我们这代人看这部剧才特别的代入感,并没有丝毫的违和感。
相反现在的少男少女看这部剧的时候也就只是看出了男主角的内向胆怯
\"67de513bly1feudbcquv6j20rs0ijk8j.jpg\"
\"67de513bly1feudbdovpbj20v90kue81.jpg\"
\"67de513bly1feudbm64a8j21jk112x6p.jpg\"
\"67de513bly1feudbnd1y6j232e21o1kz.jpg\"

\n"},{"title":"杀不死","published":1,"cover":"https://xy07-1251893119.costj.myqcloud.com/2017/08/17/3339139527.jpg","isTop":false,"abbrlink":"cb92d708","date":"2017-08-17T06:14:00.000Z","_content":"\n\n昨天看完了一部网剧<杀不死>.觉得异常精彩.迫不及待要推荐一发.\n\n> 《杀不死》是由河北优映文化传播有限公司、上海见独影视有限公司联合出品的悬疑类网剧,由李洪绸、邢冬冬执导,杨羽、安宁、邵庄等主演。\n\n以上来自百度百科.\n\n虽然这部剧很早就在腾讯开播了.但是由于之前没什么时间.<-因为沉迷网游.>\n昨天突然的就发现了这部剧.据说是豆瓣高分剧<毛骗>的原班人马.\n故事的开头是监控里的金店抢劫案.可镜头一转就画风就转变成了 老实木讷的主角因为喜欢一个女孩被损友教唆偷女孩钱包制造邂逅机会.结果卷入了离奇的事件里.杀人,埋尸,火拼,逃亡.各种翻转剧情让人欲罢不能.\n\n![杀不死剧照][1]\n\n在看这部剧的时候我就在想 ,如果<杀不死>这是部电影, 按目前每集30分钟共12集,大概有3个小时通过各种剪辑,大约也是可以实现的.\n每集的开头都会用另外一个视角来讲述另外一个故事,解开案情的一部分.如果拍成电影应该就不会有这样的效果了.\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/08/17/3339139527.jpg","source":"_posts/2017-08-17-shabusi.md","raw":"---\ntitle: 杀不死\ntags:\n - 网剧\n - 开头\n - 邵庄\npublished: true\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2017/08/17/3339139527.jpg'\nisTop: false\nabbrlink: cb92d708\ndate: 2017-08-17 14:14:00\n---\n\n\n昨天看完了一部网剧<杀不死>.觉得异常精彩.迫不及待要推荐一发.\n\n> 《杀不死》是由河北优映文化传播有限公司、上海见独影视有限公司联合出品的悬疑类网剧,由李洪绸、邢冬冬执导,杨羽、安宁、邵庄等主演。\n\n以上来自百度百科.\n\n虽然这部剧很早就在腾讯开播了.但是由于之前没什么时间.<-因为沉迷网游.>\n昨天突然的就发现了这部剧.据说是豆瓣高分剧<毛骗>的原班人马.\n故事的开头是监控里的金店抢劫案.可镜头一转就画风就转变成了 老实木讷的主角因为喜欢一个女孩被损友教唆偷女孩钱包制造邂逅机会.结果卷入了离奇的事件里.杀人,埋尸,火拼,逃亡.各种翻转剧情让人欲罢不能.\n\n![杀不死剧照][1]\n\n在看这部剧的时候我就在想 ,如果<杀不死>这是部电影, 按目前每集30分钟共12集,大概有3个小时通过各种剪辑,大约也是可以实现的.\n每集的开头都会用另外一个视角来讲述另外一个故事,解开案情的一部分.如果拍成电影应该就不会有这样的效果了.\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/08/17/3339139527.jpg","slug":"2017-08-17-shabusi","updated":"2023-09-30T02:59:46.510Z","_id":"cln4obyeh000boko0az3mcwjb","comments":1,"layout":"post","photos":[],"link":"","content":"

昨天看完了一部网剧<杀不死>.觉得异常精彩.迫不及待要推荐一发.

\n
\n

《杀不死》是由河北优映文化传播有限公司、上海见独影视有限公司联合出品的悬疑类网剧,由李洪绸、邢冬冬执导,杨羽、安宁、邵庄等主演。

\n
\n

以上来自百度百科.

\n

虽然这部剧很早就在腾讯开播了.但是由于之前没什么时间.<-因为沉迷网游.>
昨天突然的就发现了这部剧.据说是豆瓣高分剧<毛骗>的原班人马.
故事的开头是监控里的金店抢劫案.可镜头一转就画风就转变成了 老实木讷的主角因为喜欢一个女孩被损友教唆偷女孩钱包制造邂逅机会.结果卷入了离奇的事件里.杀人,埋尸,火拼,逃亡.各种翻转剧情让人欲罢不能.

\n

\"杀不死剧照\"

\n

在看这部剧的时候我就在想 ,如果<杀不死>这是部电影, 按目前每集30分钟共12集,大概有3个小时通过各种剪辑,大约也是可以实现的.
每集的开头都会用另外一个视角来讲述另外一个故事,解开案情的一部分.如果拍成电影应该就不会有这样的效果了.

\n","site":{"data":{}},"excerpt":"","more":"

昨天看完了一部网剧<杀不死>.觉得异常精彩.迫不及待要推荐一发.

\n
\n

《杀不死》是由河北优映文化传播有限公司、上海见独影视有限公司联合出品的悬疑类网剧,由李洪绸、邢冬冬执导,杨羽、安宁、邵庄等主演。

\n
\n

以上来自百度百科.

\n

虽然这部剧很早就在腾讯开播了.但是由于之前没什么时间.<-因为沉迷网游.>
昨天突然的就发现了这部剧.据说是豆瓣高分剧<毛骗>的原班人马.
故事的开头是监控里的金店抢劫案.可镜头一转就画风就转变成了 老实木讷的主角因为喜欢一个女孩被损友教唆偷女孩钱包制造邂逅机会.结果卷入了离奇的事件里.杀人,埋尸,火拼,逃亡.各种翻转剧情让人欲罢不能.

\n

\"杀不死剧照\"

\n

在看这部剧的时候我就在想 ,如果<杀不死>这是部电影, 按目前每集30分钟共12集,大概有3个小时通过各种剪辑,大约也是可以实现的.
每集的开头都会用另外一个视角来讲述另外一个故事,解开案情的一部分.如果拍成电影应该就不会有这样的效果了.

\n"},{"title":"珠海的早晨","published":1,"cover":"https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1164475938.jpg","isTop":false,"abbrlink":"b93101ab","date":"2017-12-02T02:17:00.000Z","_content":"\n\n![IMG_20171202_080746.jpg][1]\n![IMG_20171202_080736.jpg][2]\n![IMG_20171202_080729.jpg][3]\n![IMG_20171202_080724.jpg][4]\n![IMG_20171202_080715.jpg][5]\n![IMG_20171202_080729.jpg][6]\n拍摄工具 红米note4x\n地点 珠海官塘附近\n时间 早上8点左右\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1164475938.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/3427552576.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/2498459590.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/3992954104.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1177421658.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/2498459590.jpg","source":"_posts/2017-12-02-zhuhai.md","raw":"---\ntitle: 珠海的早晨\ntags:\n - 珠海\n - 官塘\n - note4x\n - 红米\npublished: true\ncategories: 随笔\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1164475938.jpg'\nisTop: false\nabbrlink: b93101ab\ndate: 2017-12-02 10:17:00\n---\n\n\n![IMG_20171202_080746.jpg][1]\n![IMG_20171202_080736.jpg][2]\n![IMG_20171202_080729.jpg][3]\n![IMG_20171202_080724.jpg][4]\n![IMG_20171202_080715.jpg][5]\n![IMG_20171202_080729.jpg][6]\n拍摄工具 红米note4x\n地点 珠海官塘附近\n时间 早上8点左右\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1164475938.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/3427552576.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/2498459590.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/3992954104.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/1177421658.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2017/12/02/2498459590.jpg","slug":"2017-12-02-zhuhai","updated":"2023-09-30T02:59:46.510Z","_id":"cln4obyei000goko09d2y8wcc","comments":1,"layout":"post","photos":[],"link":"","content":"

\"IMG_20171202_080746.jpg\"
\"IMG_20171202_080736.jpg\"
\"IMG_20171202_080729.jpg\"
\"IMG_20171202_080724.jpg\"
\"IMG_20171202_080715.jpg\"
\"IMG_20171202_080729.jpg\"
拍摄工具 红米note4x
地点 珠海官塘附近
时间 早上8点左右

\n","site":{"data":{}},"excerpt":"","more":"

\"IMG_20171202_080746.jpg\"
\"IMG_20171202_080736.jpg\"
\"IMG_20171202_080729.jpg\"
\"IMG_20171202_080724.jpg\"
\"IMG_20171202_080715.jpg\"
\"IMG_20171202_080729.jpg\"
拍摄工具 红米note4x
地点 珠海官塘附近
时间 早上8点左右

\n"},{"title":"神雕侠侣其实是一部伦理小说","published":1,"cover":"https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3504502827.jpg","isTop":false,"abbrlink":"29c199b6","date":"2018-04-17T04:10:00.000Z","_content":"\n\n神雕侠侣是金庸先生最让人耳熟能详的作品\n因为其影视剧作品之多从小说完稿到如今为金庸小说之最\n![1.jpg][1]\n![2.jpg][2]\n![3.jpg][3]\n![4.jpg][4]\n![5.jpg][5]\n![6.jpg][6]\n![7.jpg][7]\n![8.jpg][8]\n![9.jpg][9]\n![10.jpg][10]\n为什么说是一部伦理小说?\n小说里面描写最详细最让人动容的莫过于杨过与小龙女的旷世奇恋。\n其中掺杂了各种推动故事发展的支线情节\n如武三通对养女何沅君有了男女之情并在何沅君与陆展元的婚宴上大闹了一场。\n这养父与养女岂不是乱了伦常?\n相比杨过小龙女的师生恋也不遑多让啊\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3504502827.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1428312911.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/517559975.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/4166098573.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1867717429.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3210080396.jpg\n [7]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1172281141.jpg\n [8]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3540444016.jpg\n [9]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/54048185.jpg\n [10]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1573748691.jpg","source":"_posts/2018-04-17-shendiao.md","raw":"---\ntitle: 神雕侠侣其实是一部伦理小说\ntags:\n - 神雕\n - 金庸\n - 影视剧\n - 作品\n - 完稿\n - 小说\n - 旷世奇恋\n - 养女\n - 何沅君\n - 小龙女\n - 杨过\npublished: true\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3504502827.jpg'\nisTop: false\nabbrlink: 29c199b6\ndate: 2018-04-17 12:10:00\n---\n\n\n神雕侠侣是金庸先生最让人耳熟能详的作品\n因为其影视剧作品之多从小说完稿到如今为金庸小说之最\n![1.jpg][1]\n![2.jpg][2]\n![3.jpg][3]\n![4.jpg][4]\n![5.jpg][5]\n![6.jpg][6]\n![7.jpg][7]\n![8.jpg][8]\n![9.jpg][9]\n![10.jpg][10]\n为什么说是一部伦理小说?\n小说里面描写最详细最让人动容的莫过于杨过与小龙女的旷世奇恋。\n其中掺杂了各种推动故事发展的支线情节\n如武三通对养女何沅君有了男女之情并在何沅君与陆展元的婚宴上大闹了一场。\n这养父与养女岂不是乱了伦常?\n相比杨过小龙女的师生恋也不遑多让啊\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3504502827.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1428312911.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/517559975.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/4166098573.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1867717429.jpg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3210080396.jpg\n [7]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1172281141.jpg\n [8]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/3540444016.jpg\n [9]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/54048185.jpg\n [10]: https://xy07-1251893119.costj.myqcloud.com/2018/04/17/1573748691.jpg","slug":"2018-04-17-shendiao","updated":"2023-09-30T02:59:46.510Z","_id":"cln4obyej000hoko0hi7u43ug","comments":1,"layout":"post","photos":[],"link":"","content":"

神雕侠侣是金庸先生最让人耳熟能详的作品
因为其影视剧作品之多从小说完稿到如今为金庸小说之最
\"1.jpg\"
\"2.jpg\"
\"3.jpg\"
\"4.jpg\"
\"5.jpg\"
\"6.jpg\"
\"7.jpg\"
\"8.jpg\"
\"9.jpg\"
\"10.jpg\"
为什么说是一部伦理小说?
小说里面描写最详细最让人动容的莫过于杨过与小龙女的旷世奇恋。
其中掺杂了各种推动故事发展的支线情节
如武三通对养女何沅君有了男女之情并在何沅君与陆展元的婚宴上大闹了一场。
这养父与养女岂不是乱了伦常?
相比杨过小龙女的师生恋也不遑多让啊

\n","site":{"data":{}},"excerpt":"","more":"

神雕侠侣是金庸先生最让人耳熟能详的作品
因为其影视剧作品之多从小说完稿到如今为金庸小说之最
\"1.jpg\"
\"2.jpg\"
\"3.jpg\"
\"4.jpg\"
\"5.jpg\"
\"6.jpg\"
\"7.jpg\"
\"8.jpg\"
\"9.jpg\"
\"10.jpg\"
为什么说是一部伦理小说?
小说里面描写最详细最让人动容的莫过于杨过与小龙女的旷世奇恋。
其中掺杂了各种推动故事发展的支线情节
如武三通对养女何沅君有了男女之情并在何沅君与陆展元的婚宴上大闹了一场。
这养父与养女岂不是乱了伦常?
相比杨过小龙女的师生恋也不遑多让啊

\n"},{"abbrlink":"317afbc8","date":"2018-05-04T15:28:00.000Z","excerpt":"...","published":1,"title":"linux下一键搭建SS","updated":"2023-09-30T02:59:46.510Z","_content":"事实上Ubuntu centos都可以使用此命令行\n\n```bash\n wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh\n```\n\n```bash\nchmod +x shadowsocks.sh \n```\n\n```bash\n ./shadowsocks.sh 2>&1 | tee shadowsocks.log\n```\n","source":"_posts/2018-05-04-linux-SS.md","raw":"---\nabbrlink: 317afbc8\ncategories: 分享\ndate: '2018-05-04 23:28:00'\nexcerpt: ...\npublished: true\ntags:\n - wget\n - shadowsocks\ntitle: linux下一键搭建SS\nupdated: '2023-6-12T10:13:20.738+8:0'\n---\n事实上Ubuntu centos都可以使用此命令行\n\n```bash\n wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh\n```\n\n```bash\nchmod +x shadowsocks.sh \n```\n\n```bash\n ./shadowsocks.sh 2>&1 | tee shadowsocks.log\n```\n","slug":"2018-05-04-linux-SS","_id":"cln4obyel000koko0dnjgcbcx","comments":1,"layout":"post","photos":[],"link":"","content":"

事实上Ubuntu centos都可以使用此命令行

\n
1
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
\n\n
1
chmod +x shadowsocks.sh 
\n\n
1
./shadowsocks.sh 2>&1 | tee shadowsocks.log
\n","site":{"data":{}},"more":"

事实上Ubuntu centos都可以使用此命令行

\n
1
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
\n\n
1
chmod +x shadowsocks.sh 
\n\n
1
./shadowsocks.sh 2>&1 | tee shadowsocks.log
\n"},{"abbrlink":"341ac1e6","cover":"https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg","date":"2017-06-26T03:18:00.000Z","excerpt":"图片无压缩 生产工具:小米5 拍摄地点:华发商都 ","published":1,"title":"珠海 阴雨天 华发商都","updated":"2023-04-13T02:51:36.000Z","_content":"图片无压缩\n\n![珠海,华发商都][1]\n![珠海,阴雨天][2]\n![IMG_20170620_190831.jpg][3]\n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg\n[2]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/2565782733.jpg\n[3]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg\n生产工具:小米5\n拍摄地点:华发商都\n","source":"_posts/2017-06-26-zhuhai.md","raw":"---\nabbrlink: 341ac1e6\ncategories: 随笔\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg'\ndate: '2017-06-26 11:18:00'\nexcerpt: '图片无压缩 生产工具:小米5 拍摄地点:华发商都 '\npublished: true\ntags:\n - 珠海\n - 阴雨天\ntitle: 珠海 阴雨天 华发商都\nupdated: 'Thu, 13 Apr 2023 02:51:36 GMT'\n---\n图片无压缩\n\n![珠海,华发商都][1]\n![珠海,阴雨天][2]\n![IMG_20170620_190831.jpg][3]\n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg\n[2]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/2565782733.jpg\n[3]: https://xy07-1251893119.costj.myqcloud.com/2017/06/26/3871952792.jpg\n生产工具:小米5\n拍摄地点:华发商都\n","slug":"2017-06-26-zhuhai","_id":"cln4obyem000moko09tf4dkmc","comments":1,"layout":"post","photos":[],"link":"","content":"

图片无压缩

\n

\"珠海,华发商都\"
\"珠海,阴雨天\"
\"IMG_20170620_190831.jpg\"

\n

生产工具:小米5
拍摄地点:华发商都

\n","site":{"data":{}},"more":"

图片无压缩

\n

\"珠海,华发商都\"
\"珠海,阴雨天\"
\"IMG_20170620_190831.jpg\"

\n

生产工具:小米5
拍摄地点:华发商都

\n"},{"title":"小绵羊SNH48许杨玉琢","published":1,"cover":"https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3465507018.jpg","isTop":false,"abbrlink":"314a5df4","date":"2019-01-12T14:37:00.000Z","_content":"\n\n![1be5a3defcfbb3e567770ea0cab752ba.jpg][1]\n\n![6af03caac4266a78f02157930a86deb3.jpg][2]\n\n![100a9aef4058a196185c08936a70f7d1.jpg][3]\n\n![246731d2c6706398a4a90646da269338.jpg][4]\n\n![443599be442e86721aefbac4b1f7fc56.jpg][5]\n\n小绵羊\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3465507018.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3541783328.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1743307606.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/240276552.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3585870581.jpg","source":"_posts/2019-01-12-SNH48-xuyang.md","raw":"---\ntitle: 小绵羊SNH48许杨玉琢\ntags:\n - 绵羊\n - SNH48\npublished: true\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3465507018.jpg'\nisTop: false\nabbrlink: 314a5df4\ndate: 2019-01-12 22:37:00\n---\n\n\n![1be5a3defcfbb3e567770ea0cab752ba.jpg][1]\n\n![6af03caac4266a78f02157930a86deb3.jpg][2]\n\n![100a9aef4058a196185c08936a70f7d1.jpg][3]\n\n![246731d2c6706398a4a90646da269338.jpg][4]\n\n![443599be442e86721aefbac4b1f7fc56.jpg][5]\n\n小绵羊\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3465507018.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3541783328.jpg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1743307606.jpg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/240276552.jpg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3585870581.jpg","slug":"2019-01-12-SNH48-xuyang","updated":"2023-09-30T02:59:46.511Z","_id":"cln4obyen000qoko02wqif5zw","comments":1,"layout":"post","photos":[],"link":"","content":"

\"1be5a3defcfbb3e567770ea0cab752ba.jpg\"

\n

\"6af03caac4266a78f02157930a86deb3.jpg\"

\n

\"100a9aef4058a196185c08936a70f7d1.jpg\"

\n

\"246731d2c6706398a4a90646da269338.jpg\"

\n

\"443599be442e86721aefbac4b1f7fc56.jpg\"

\n

小绵羊

\n","site":{"data":{}},"excerpt":"","more":"

\"1be5a3defcfbb3e567770ea0cab752ba.jpg\"

\n

\"6af03caac4266a78f02157930a86deb3.jpg\"

\n

\"100a9aef4058a196185c08936a70f7d1.jpg\"

\n

\"246731d2c6706398a4a90646da269338.jpg\"

\n

\"443599be442e86721aefbac4b1f7fc56.jpg\"

\n

小绵羊

\n"},{"title":"英雄联盟全球总决赛淘汰赛之后","published":1,"hideInList":false,"isTop":false,"abbrlink":"e73c603a","date":"2018-10-21T12:26:10.000Z","_content":"\n\n昨天一开始,IG便战胜了号称宇宙超级无敌战舰的KT。打破了无敌神话。\n让我对RNG的比赛更加充满信息。\n结果让人大跌眼镜。\nG2以3:2战胜了我心中的夺冠对象RNG。\n虽然我没有完整看完一场比赛。\n但是我仍然关注这场比赛。\n五年了。\n我从S3便一直关注着皇族。期望他夺冠。\n一年又一年。,今年的他们气势如虹拿下了各大赛事的冠军。几乎所有人都认为这是最有希望的一年。结果却差强人意。\n\n我相信会有人指责他们。\n但是我更想鼓励他们。\n既然已经输了。\n就不要把输的借口放在已经无法挽回的假如上去。\n\n今天的比赛EDG输给了FNC。\n经历了昨天的失落反而对今天的结果看淡了许多。\n\n可能我们一直以为LCK很强大。一直引进外援。把LCK当作假想敌。忽视了其他的对手。LCS他们同样强大且一直在成长。今天的结果便是为了告诉我们要尊重对手,谁都不能被轻视。\n\n原本我会见到小组第二干翻小组第一的。结果很遗憾。\n","source":"_posts/2018-10-21-lol-s8.md","raw":"---\ntitle: 英雄联盟全球总决赛淘汰赛之后\ntags:\n - rng\n - LOL\n - S8\n - 英雄联盟\n - 拳头\npublished: true\nhideInList: false\ncategories: 随笔\nisTop: false\nabbrlink: e73c603a\ndate: 2018-10-21 20:26:10\n---\n\n\n昨天一开始,IG便战胜了号称宇宙超级无敌战舰的KT。打破了无敌神话。\n让我对RNG的比赛更加充满信息。\n结果让人大跌眼镜。\nG2以3:2战胜了我心中的夺冠对象RNG。\n虽然我没有完整看完一场比赛。\n但是我仍然关注这场比赛。\n五年了。\n我从S3便一直关注着皇族。期望他夺冠。\n一年又一年。,今年的他们气势如虹拿下了各大赛事的冠军。几乎所有人都认为这是最有希望的一年。结果却差强人意。\n\n我相信会有人指责他们。\n但是我更想鼓励他们。\n既然已经输了。\n就不要把输的借口放在已经无法挽回的假如上去。\n\n今天的比赛EDG输给了FNC。\n经历了昨天的失落反而对今天的结果看淡了许多。\n\n可能我们一直以为LCK很强大。一直引进外援。把LCK当作假想敌。忽视了其他的对手。LCS他们同样强大且一直在成长。今天的结果便是为了告诉我们要尊重对手,谁都不能被轻视。\n\n原本我会见到小组第二干翻小组第一的。结果很遗憾。\n","slug":"2018-10-21-lol-s8","updated":"2023-09-30T02:59:46.511Z","_id":"cln4obyeo000soko05gkyaby7","comments":1,"layout":"post","photos":[],"link":"","content":"

昨天一开始,IG便战胜了号称宇宙超级无敌战舰的KT。打破了无敌神话。
让我对RNG的比赛更加充满信息。
结果让人大跌眼镜。
G2以3:2战胜了我心中的夺冠对象RNG。
虽然我没有完整看完一场比赛。
但是我仍然关注这场比赛。
五年了。
我从S3便一直关注着皇族。期望他夺冠。
一年又一年。,今年的他们气势如虹拿下了各大赛事的冠军。几乎所有人都认为这是最有希望的一年。结果却差强人意。

\n

我相信会有人指责他们。
但是我更想鼓励他们。
既然已经输了。
就不要把输的借口放在已经无法挽回的假如上去。

\n

今天的比赛EDG输给了FNC。
经历了昨天的失落反而对今天的结果看淡了许多。

\n

可能我们一直以为LCK很强大。一直引进外援。把LCK当作假想敌。忽视了其他的对手。LCS他们同样强大且一直在成长。今天的结果便是为了告诉我们要尊重对手,谁都不能被轻视。

\n

原本我会见到小组第二干翻小组第一的。结果很遗憾。

\n","site":{"data":{}},"excerpt":"","more":"

昨天一开始,IG便战胜了号称宇宙超级无敌战舰的KT。打破了无敌神话。
让我对RNG的比赛更加充满信息。
结果让人大跌眼镜。
G2以3:2战胜了我心中的夺冠对象RNG。
虽然我没有完整看完一场比赛。
但是我仍然关注这场比赛。
五年了。
我从S3便一直关注着皇族。期望他夺冠。
一年又一年。,今年的他们气势如虹拿下了各大赛事的冠军。几乎所有人都认为这是最有希望的一年。结果却差强人意。

\n

我相信会有人指责他们。
但是我更想鼓励他们。
既然已经输了。
就不要把输的借口放在已经无法挽回的假如上去。

\n

今天的比赛EDG输给了FNC。
经历了昨天的失落反而对今天的结果看淡了许多。

\n

可能我们一直以为LCK很强大。一直引进外援。把LCK当作假想敌。忽视了其他的对手。LCS他们同样强大且一直在成长。今天的结果便是为了告诉我们要尊重对手,谁都不能被轻视。

\n

原本我会见到小组第二干翻小组第一的。结果很遗憾。

\n"},{"layout":"post","cid":204,"title":"父亲节快乐","slug":"2019-06-17-父亲节快乐","date":"2019-06-17T11:13:04.000Z","updated":"2019-06-17T11:22:06.000Z","status":"publish","author":"老孙","abbrlink":53678,"_content":"\n\n我知道今天来说会有点迟了\n但是今天中午突然看到别人的父亲节有点感慨\n在我读书的时候我很少给家里打电话\n那时每当钱要花完的时候才会想起打电话回去给我的父亲\n现在想想真是不太懂事\n因为那时家里的经济状况并不好\n回想起自己曾经的所作所为甚是惭愧\n此生怕是无以为报\n以后一定要多关心一下日渐老迈的父亲\n从打个电话开始吧\n\n在此祝愿我的老父亲,父亲节快乐","source":"_posts/2019-06-17-父亲节快乐.md","raw":"---\nlayout: post\ncid: 204\ntitle: 父亲节快乐\nslug: happy-fathers-day\ndate: '2019/06/17 19:13:04'\nupdated: '2019/06/17 19:22:06'\nstatus: publish\nauthor: 老孙\ncategories: 随笔\ntags:\n - 父亲节\nabbrlink: 53678\n---\n\n\n我知道今天来说会有点迟了\n但是今天中午突然看到别人的父亲节有点感慨\n在我读书的时候我很少给家里打电话\n那时每当钱要花完的时候才会想起打电话回去给我的父亲\n现在想想真是不太懂事\n因为那时家里的经济状况并不好\n回想起自己曾经的所作所为甚是惭愧\n此生怕是无以为报\n以后一定要多关心一下日渐老迈的父亲\n从打个电话开始吧\n\n在此祝愿我的老父亲,父亲节快乐","published":1,"_id":"cln4obyep000woko07djvfgw8","comments":1,"photos":[],"link":"","content":"

我知道今天来说会有点迟了
但是今天中午突然看到别人的父亲节有点感慨
在我读书的时候我很少给家里打电话
那时每当钱要花完的时候才会想起打电话回去给我的父亲
现在想想真是不太懂事
因为那时家里的经济状况并不好
回想起自己曾经的所作所为甚是惭愧
此生怕是无以为报
以后一定要多关心一下日渐老迈的父亲
从打个电话开始吧

\n

在此祝愿我的老父亲,父亲节快乐

\n","site":{"data":{}},"excerpt":"","more":"

我知道今天来说会有点迟了
但是今天中午突然看到别人的父亲节有点感慨
在我读书的时候我很少给家里打电话
那时每当钱要花完的时候才会想起打电话回去给我的父亲
现在想想真是不太懂事
因为那时家里的经济状况并不好
回想起自己曾经的所作所为甚是惭愧
此生怕是无以为报
以后一定要多关心一下日渐老迈的父亲
从打个电话开始吧

\n

在此祝愿我的老父亲,父亲节快乐

\n"},{"title":"新版《倚天屠龙记》演员颜值在线 深扒众小花旦","published":1,"hideInList":false,"cover":"https://xy07-1251893119.costj.myqcloud.com/2019/03/03/165964777.jpg","abbrlink":"85322f98","date":"2019-03-03T07:34:00.000Z","_content":"\n\n金庸先生的射雕三部曲是至今被翻拍最多的作品了\n其中《倚天屠龙记》自我从小至今看了5个版本\n分别是咆哮教主马景涛版张无忌,李连杰版张无忌,吴启华版,苏有朋版,邓超版。\n新版最让人期待的点就是当年在马景涛版倚天中饰演周芷若的周海媚在新版中饰演了灭绝师太。\n\n> 电视剧新版《倚天屠龙记》开播就遭遇大量吐槽,这并不意外。当初李亚鹏、周迅演的《射雕英雄传》,也被那些“83版射雕”爱好者揶揄很久,但是这两年有很多网友开始怀念李亚鹏版的“射雕”了,这是新的一代人的记忆,而他们也到了怀旧的年纪了。\n> \n> 这并不是说网友的吐槽都是“怀旧病”导致的。新版《倚天屠龙记》也有一些真正的问题,比如被网友推上热搜的“慢动作”就是一例。该剧的武打环节,大量使用慢动作,在空中飞的镜头让人想起纪录片中飞行的鸟类。大量慢镜头的使用,甚至影响到剧情的推进,武打本来是要让人激动,现在却成了难得的休息眼睛的时候。\n![杨逍][1]\n> 新版的杨逍与纪晓芙的感情线相对比较饱满。\n新版《倚天屠龙记》播出后虽然被吐槽“慢动作太多”,影响观赏体验,但戏中演员的演技却颇具看点,而花旦们的颜值更非常抢眼\n\n1.赵敏 扮演者 陈钰琪\n------------\n\n出生日期:1992.7.29\n![赵敏 扮演者 陈钰琪][2]\n陈钰琪是唐嫣旗下力捧的90后花旦,凭借《锦绣未央》中的九公主和《香蜜沉沉烬如霜》里的魔界公主鎏英成名,清新亮丽的外形和可圈可点的演技,令她成为近两年颇具瞩目的小鲜花。\n![陈钰琪][3]\n在《倚天屠龙记》里,她饰演女一号美艳不可方物,且古灵精怪的赵敏,然而由于该剧版本太多,更有黎姿、贾静雯等珠玉在前,导致她很难得到观众的称赞。\n\n2.周芷若 扮演者 祝绪丹\n-------------\n\n出生日期:1992.4.15\n![周芷若 扮演者 祝绪丹][4]\n祝绪丹出道后以《三生三世十里桃花》《谈判官》《一千零一夜》等剧受到关注,修长的身材和甜美的外形,以及细腻的表演圈粉无数。\n![祝绪丹][5]\n她在戏中饰演周芷若,94版《倚天》的“周芷若”周海媚则扮演她的师傅灭绝师太,众所周知,她是杨幂旗下艺人,跟唐嫣旗下扮演赵敏的陈钰琪同龄,两人戏中是对手,戏外也因各自老板的微妙关系带有PK的味道。\n\n3.殷离 扮演者 曹曦月\n------------\n\n出生日期:1994.4.21\n![殷离 扮演者 曹曦月][6]\n曹曦月是明道力捧的新生代花旦,曾诠释了《楚乔传》中泼辣嚣张的反派锦烛,《浪花一朵朵》中程美,和《夜空中最闪亮的星》中的追爱少女夏媛等角色。\n![曹曦月][7]\n《倚天屠龙记》里,曹曦月扮演生性倔强,因练千蛛万毒手毁容的殷离(蛛儿),跟其以往角色反差甚大,而且为了角色“毁容”,也让观众看到她在角色方面的更多可塑性。\n\n4.小昭 扮演者 许雅婷\n------------\n\n出生日期:1994.9.24\n![小昭 扮演者 许雅婷][8]\n秀美绝伦,温柔善良,且深藏不露的小昭由香港90后花旦许雅婷饰演。\n![许雅婷][9]\n许雅婷是“少女标本”演唱组合的成员,出道后音乐和影视双栖发展,参演过《微交少女》 《医护人生》《美人鱼》等20多部影视作品,不仅拥有扎实的表演功力,更拥有明艳的容貌,是一位颜值与演技并存的潜力花旦。\n\n5.殷素素 扮演者 陈欣予\n-------------\n\n出生日期:1990年11月24日\n![殷素素 扮演者 陈欣予][10]\n《倚天屠龙记》首播,#新版殷素素#登上热搜,90后花旦陈欣予获得万千网友点赞打call。\n![陈欣予][11]\n据悉,陈欣予2013年出道,凭借《何以笙箫默》 里暗恋何以琛多年的法律系高冷才女许影和《泡沫之夏》中外表温柔羞怯,内心敏感的姚淑儿成名。\n\n6.邬靖靖 饰 纪晓芙\n-----------\n\n出生日期:1991.6.6\n![邬靖靖 饰 纪晓芙][12]\n美丽聪慧,为爱执着的纪晓芙由90后花旦邬靖靖饰演,熟悉八卦的朋友应该知道,她是知名演员邬倩倩和著名导演尤小刚的侄女。\n![邬靖靖][13]\n据悉,邬靖靖毕业于中国传媒大学,在姑姑和姑父的提携下,大二就开始拍戏,凭《西施秘史》《杨贵妃秘史》《大唐女巡按》《封神英雄榜》等剧成为演技派花旦 ,2014年在于正版《神雕侠侣》里饰演公孙绿萼。\n\n7.杨不悔 扮演者 孙安可\n-------------\n\n出生日期:1998.2.2\n![杨不悔 扮演者 孙安可][14]\n孙安可虽为影视圈新人,但她演戏颇具天分,成功诠释了杨不悔的单纯善良,而且扮相非常清丽。\n![孙安可][15]\n98年出生的孙安可还曾参演过《衰鬼记》《恶魔少爷别吻我》等剧。\n\n8.黄衫女子 扮演者 赵樱子\n--------------\n\n出生日期:1990.12.16\n![黄衫女子 扮演者 赵樱子][16]\n黄衫女子虽然戏份不多,但其绝美的容貌,出尘脱俗气质令人印象深刻,90后花旦赵樱子不仅颜值能打,演技也不俗,堪可与刘诗诗扮演的黄衫女子一拼。\n![赵樱子][17]\n据悉,赵樱子,原名赵韩樱子,中戏校花级人物,2011年入行演戏,以《爱在春天》《因为爱情有多美》等剧成名,2014年在于正版《神雕侠侣》饰演程英,而她参演的《大明皇妃·孙若微传》《长安诺》则未播先热。\n\n9.丁敏君 扮演者 陶珞依\n-------------\n\n出生年月:1991.3.11\n![丁敏君 扮演者 陶珞依][18]\n《倚天屠龙记》里尖酸刻薄,且喜欢耍阴谋诡计的丁敏君师姐由90后花旦陶珞依扮演。\n![陶珞依][19]\n原名苗洛依的她参加世界小姐选美比赛,而且获得全国十强,转战影视圈后参演了《美人心计》《张小五的春天》《大汉情缘云中歌》等30多部影视作品,虽然没有大火,但其出众的外表和精湛的演技受到很多观众的喜爱。\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/165964777.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1350001660.jpeg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1830243572.jpeg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/173079610.jpeg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2692158928.jpeg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1172215275.jpeg\n [7]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3920113436.jpeg\n [8]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1510241126.jpeg\n [9]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/632740546.jpeg\n [10]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/522959024.jpeg\n [11]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1050683161.png\n [12]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1875225909.jpeg\n [13]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3194371837.jpeg\n [14]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1018565258.jpeg\n [15]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1629013396.jpeg\n [16]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2919760031.jpeg\n [17]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2907922160.jpeg\n [18]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2660338200.jpeg\n [19]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3123850066.jpeg","source":"_posts/2019-03-03-yitian.md","raw":"---\ntitle: 新版《倚天屠龙记》演员颜值在线 深扒众小花旦\ntags:\n - 演技\n - 剧情\n - 神雕\n - 金庸\n - 作品\n - 版本\n - 倚天屠龙记\npublished: true\nhideInList: false\ncategories: 推荐\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2019/03/03/165964777.jpg'\nabbrlink: 85322f98\ndate: 2019-03-03 15:34:00\n---\n\n\n金庸先生的射雕三部曲是至今被翻拍最多的作品了\n其中《倚天屠龙记》自我从小至今看了5个版本\n分别是咆哮教主马景涛版张无忌,李连杰版张无忌,吴启华版,苏有朋版,邓超版。\n新版最让人期待的点就是当年在马景涛版倚天中饰演周芷若的周海媚在新版中饰演了灭绝师太。\n\n> 电视剧新版《倚天屠龙记》开播就遭遇大量吐槽,这并不意外。当初李亚鹏、周迅演的《射雕英雄传》,也被那些“83版射雕”爱好者揶揄很久,但是这两年有很多网友开始怀念李亚鹏版的“射雕”了,这是新的一代人的记忆,而他们也到了怀旧的年纪了。\n> \n> 这并不是说网友的吐槽都是“怀旧病”导致的。新版《倚天屠龙记》也有一些真正的问题,比如被网友推上热搜的“慢动作”就是一例。该剧的武打环节,大量使用慢动作,在空中飞的镜头让人想起纪录片中飞行的鸟类。大量慢镜头的使用,甚至影响到剧情的推进,武打本来是要让人激动,现在却成了难得的休息眼睛的时候。\n![杨逍][1]\n> 新版的杨逍与纪晓芙的感情线相对比较饱满。\n新版《倚天屠龙记》播出后虽然被吐槽“慢动作太多”,影响观赏体验,但戏中演员的演技却颇具看点,而花旦们的颜值更非常抢眼\n\n1.赵敏 扮演者 陈钰琪\n------------\n\n出生日期:1992.7.29\n![赵敏 扮演者 陈钰琪][2]\n陈钰琪是唐嫣旗下力捧的90后花旦,凭借《锦绣未央》中的九公主和《香蜜沉沉烬如霜》里的魔界公主鎏英成名,清新亮丽的外形和可圈可点的演技,令她成为近两年颇具瞩目的小鲜花。\n![陈钰琪][3]\n在《倚天屠龙记》里,她饰演女一号美艳不可方物,且古灵精怪的赵敏,然而由于该剧版本太多,更有黎姿、贾静雯等珠玉在前,导致她很难得到观众的称赞。\n\n2.周芷若 扮演者 祝绪丹\n-------------\n\n出生日期:1992.4.15\n![周芷若 扮演者 祝绪丹][4]\n祝绪丹出道后以《三生三世十里桃花》《谈判官》《一千零一夜》等剧受到关注,修长的身材和甜美的外形,以及细腻的表演圈粉无数。\n![祝绪丹][5]\n她在戏中饰演周芷若,94版《倚天》的“周芷若”周海媚则扮演她的师傅灭绝师太,众所周知,她是杨幂旗下艺人,跟唐嫣旗下扮演赵敏的陈钰琪同龄,两人戏中是对手,戏外也因各自老板的微妙关系带有PK的味道。\n\n3.殷离 扮演者 曹曦月\n------------\n\n出生日期:1994.4.21\n![殷离 扮演者 曹曦月][6]\n曹曦月是明道力捧的新生代花旦,曾诠释了《楚乔传》中泼辣嚣张的反派锦烛,《浪花一朵朵》中程美,和《夜空中最闪亮的星》中的追爱少女夏媛等角色。\n![曹曦月][7]\n《倚天屠龙记》里,曹曦月扮演生性倔强,因练千蛛万毒手毁容的殷离(蛛儿),跟其以往角色反差甚大,而且为了角色“毁容”,也让观众看到她在角色方面的更多可塑性。\n\n4.小昭 扮演者 许雅婷\n------------\n\n出生日期:1994.9.24\n![小昭 扮演者 许雅婷][8]\n秀美绝伦,温柔善良,且深藏不露的小昭由香港90后花旦许雅婷饰演。\n![许雅婷][9]\n许雅婷是“少女标本”演唱组合的成员,出道后音乐和影视双栖发展,参演过《微交少女》 《医护人生》《美人鱼》等20多部影视作品,不仅拥有扎实的表演功力,更拥有明艳的容貌,是一位颜值与演技并存的潜力花旦。\n\n5.殷素素 扮演者 陈欣予\n-------------\n\n出生日期:1990年11月24日\n![殷素素 扮演者 陈欣予][10]\n《倚天屠龙记》首播,#新版殷素素#登上热搜,90后花旦陈欣予获得万千网友点赞打call。\n![陈欣予][11]\n据悉,陈欣予2013年出道,凭借《何以笙箫默》 里暗恋何以琛多年的法律系高冷才女许影和《泡沫之夏》中外表温柔羞怯,内心敏感的姚淑儿成名。\n\n6.邬靖靖 饰 纪晓芙\n-----------\n\n出生日期:1991.6.6\n![邬靖靖 饰 纪晓芙][12]\n美丽聪慧,为爱执着的纪晓芙由90后花旦邬靖靖饰演,熟悉八卦的朋友应该知道,她是知名演员邬倩倩和著名导演尤小刚的侄女。\n![邬靖靖][13]\n据悉,邬靖靖毕业于中国传媒大学,在姑姑和姑父的提携下,大二就开始拍戏,凭《西施秘史》《杨贵妃秘史》《大唐女巡按》《封神英雄榜》等剧成为演技派花旦 ,2014年在于正版《神雕侠侣》里饰演公孙绿萼。\n\n7.杨不悔 扮演者 孙安可\n-------------\n\n出生日期:1998.2.2\n![杨不悔 扮演者 孙安可][14]\n孙安可虽为影视圈新人,但她演戏颇具天分,成功诠释了杨不悔的单纯善良,而且扮相非常清丽。\n![孙安可][15]\n98年出生的孙安可还曾参演过《衰鬼记》《恶魔少爷别吻我》等剧。\n\n8.黄衫女子 扮演者 赵樱子\n--------------\n\n出生日期:1990.12.16\n![黄衫女子 扮演者 赵樱子][16]\n黄衫女子虽然戏份不多,但其绝美的容貌,出尘脱俗气质令人印象深刻,90后花旦赵樱子不仅颜值能打,演技也不俗,堪可与刘诗诗扮演的黄衫女子一拼。\n![赵樱子][17]\n据悉,赵樱子,原名赵韩樱子,中戏校花级人物,2011年入行演戏,以《爱在春天》《因为爱情有多美》等剧成名,2014年在于正版《神雕侠侣》饰演程英,而她参演的《大明皇妃·孙若微传》《长安诺》则未播先热。\n\n9.丁敏君 扮演者 陶珞依\n-------------\n\n出生年月:1991.3.11\n![丁敏君 扮演者 陶珞依][18]\n《倚天屠龙记》里尖酸刻薄,且喜欢耍阴谋诡计的丁敏君师姐由90后花旦陶珞依扮演。\n![陶珞依][19]\n原名苗洛依的她参加世界小姐选美比赛,而且获得全国十强,转战影视圈后参演了《美人心计》《张小五的春天》《大汉情缘云中歌》等30多部影视作品,虽然没有大火,但其出众的外表和精湛的演技受到很多观众的喜爱。\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/165964777.jpg\n [2]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1350001660.jpeg\n [3]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1830243572.jpeg\n [4]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/173079610.jpeg\n [5]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2692158928.jpeg\n [6]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1172215275.jpeg\n [7]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3920113436.jpeg\n [8]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1510241126.jpeg\n [9]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/632740546.jpeg\n [10]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/522959024.jpeg\n [11]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1050683161.png\n [12]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1875225909.jpeg\n [13]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3194371837.jpeg\n [14]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1018565258.jpeg\n [15]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/1629013396.jpeg\n [16]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2919760031.jpeg\n [17]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2907922160.jpeg\n [18]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/2660338200.jpeg\n [19]: https://xy07-1251893119.costj.myqcloud.com/2019/03/03/3123850066.jpeg","slug":"2019-03-03-yitian","updated":"2023-09-30T02:59:46.511Z","_id":"cln4obyeq000zoko01d00cfpt","comments":1,"layout":"post","photos":[],"link":"","content":"

金庸先生的射雕三部曲是至今被翻拍最多的作品了
其中《倚天屠龙记》自我从小至今看了5个版本
分别是咆哮教主马景涛版张无忌,李连杰版张无忌,吴启华版,苏有朋版,邓超版。
新版最让人期待的点就是当年在马景涛版倚天中饰演周芷若的周海媚在新版中饰演了灭绝师太。

\n
\n

电视剧新版《倚天屠龙记》开播就遭遇大量吐槽,这并不意外。当初李亚鹏、周迅演的《射雕英雄传》,也被那些“83版射雕”爱好者揶揄很久,但是这两年有很多网友开始怀念李亚鹏版的“射雕”了,这是新的一代人的记忆,而他们也到了怀旧的年纪了。

\n

这并不是说网友的吐槽都是“怀旧病”导致的。新版《倚天屠龙记》也有一些真正的问题,比如被网友推上热搜的“慢动作”就是一例。该剧的武打环节,大量使用慢动作,在空中飞的镜头让人想起纪录片中飞行的鸟类。大量慢镜头的使用,甚至影响到剧情的推进,武打本来是要让人激动,现在却成了难得的休息眼睛的时候。
\"杨逍\"
新版的杨逍与纪晓芙的感情线相对比较饱满。
新版《倚天屠龙记》播出后虽然被吐槽“慢动作太多”,影响观赏体验,但戏中演员的演技却颇具看点,而花旦们的颜值更非常抢眼

\n
\n

1.赵敏 扮演者 陈钰琪

出生日期:1992.7.29
\"赵敏
陈钰琪是唐嫣旗下力捧的90后花旦,凭借《锦绣未央》中的九公主和《香蜜沉沉烬如霜》里的魔界公主鎏英成名,清新亮丽的外形和可圈可点的演技,令她成为近两年颇具瞩目的小鲜花。
\"陈钰琪\"
在《倚天屠龙记》里,她饰演女一号美艳不可方物,且古灵精怪的赵敏,然而由于该剧版本太多,更有黎姿、贾静雯等珠玉在前,导致她很难得到观众的称赞。

\n

2.周芷若 扮演者 祝绪丹

出生日期:1992.4.15
\"周芷若
祝绪丹出道后以《三生三世十里桃花》《谈判官》《一千零一夜》等剧受到关注,修长的身材和甜美的外形,以及细腻的表演圈粉无数。
\"祝绪丹\"
她在戏中饰演周芷若,94版《倚天》的“周芷若”周海媚则扮演她的师傅灭绝师太,众所周知,她是杨幂旗下艺人,跟唐嫣旗下扮演赵敏的陈钰琪同龄,两人戏中是对手,戏外也因各自老板的微妙关系带有PK的味道。

\n

3.殷离 扮演者 曹曦月

出生日期:1994.4.21
\"殷离
曹曦月是明道力捧的新生代花旦,曾诠释了《楚乔传》中泼辣嚣张的反派锦烛,《浪花一朵朵》中程美,和《夜空中最闪亮的星》中的追爱少女夏媛等角色。
\"曹曦月\"
《倚天屠龙记》里,曹曦月扮演生性倔强,因练千蛛万毒手毁容的殷离(蛛儿),跟其以往角色反差甚大,而且为了角色“毁容”,也让观众看到她在角色方面的更多可塑性。

\n

4.小昭 扮演者 许雅婷

出生日期:1994.9.24
\"小昭
秀美绝伦,温柔善良,且深藏不露的小昭由香港90后花旦许雅婷饰演。
\"许雅婷\"
许雅婷是“少女标本”演唱组合的成员,出道后音乐和影视双栖发展,参演过《微交少女》 《医护人生》《美人鱼》等20多部影视作品,不仅拥有扎实的表演功力,更拥有明艳的容貌,是一位颜值与演技并存的潜力花旦。

\n

5.殷素素 扮演者 陈欣予

出生日期:1990年11月24日
\"殷素素
《倚天屠龙记》首播,#新版殷素素#登上热搜,90后花旦陈欣予获得万千网友点赞打call。
\"陈欣予\"
据悉,陈欣予2013年出道,凭借《何以笙箫默》 里暗恋何以琛多年的法律系高冷才女许影和《泡沫之夏》中外表温柔羞怯,内心敏感的姚淑儿成名。

\n

6.邬靖靖 饰 纪晓芙

出生日期:1991.6.6
\"邬靖靖
美丽聪慧,为爱执着的纪晓芙由90后花旦邬靖靖饰演,熟悉八卦的朋友应该知道,她是知名演员邬倩倩和著名导演尤小刚的侄女。
\"邬靖靖\"
据悉,邬靖靖毕业于中国传媒大学,在姑姑和姑父的提携下,大二就开始拍戏,凭《西施秘史》《杨贵妃秘史》《大唐女巡按》《封神英雄榜》等剧成为演技派花旦 ,2014年在于正版《神雕侠侣》里饰演公孙绿萼。

\n

7.杨不悔 扮演者 孙安可

出生日期:1998.2.2
\"杨不悔
孙安可虽为影视圈新人,但她演戏颇具天分,成功诠释了杨不悔的单纯善良,而且扮相非常清丽。
\"孙安可\"
98年出生的孙安可还曾参演过《衰鬼记》《恶魔少爷别吻我》等剧。

\n

8.黄衫女子 扮演者 赵樱子

出生日期:1990.12.16
\"黄衫女子
黄衫女子虽然戏份不多,但其绝美的容貌,出尘脱俗气质令人印象深刻,90后花旦赵樱子不仅颜值能打,演技也不俗,堪可与刘诗诗扮演的黄衫女子一拼。
\"赵樱子\"
据悉,赵樱子,原名赵韩樱子,中戏校花级人物,2011年入行演戏,以《爱在春天》《因为爱情有多美》等剧成名,2014年在于正版《神雕侠侣》饰演程英,而她参演的《大明皇妃·孙若微传》《长安诺》则未播先热。

\n

9.丁敏君 扮演者 陶珞依

出生年月:1991.3.11
\"丁敏君
《倚天屠龙记》里尖酸刻薄,且喜欢耍阴谋诡计的丁敏君师姐由90后花旦陶珞依扮演。
\"陶珞依\"
原名苗洛依的她参加世界小姐选美比赛,而且获得全国十强,转战影视圈后参演了《美人心计》《张小五的春天》《大汉情缘云中歌》等30多部影视作品,虽然没有大火,但其出众的外表和精湛的演技受到很多观众的喜爱。

\n","site":{"data":{}},"excerpt":"","more":"

金庸先生的射雕三部曲是至今被翻拍最多的作品了
其中《倚天屠龙记》自我从小至今看了5个版本
分别是咆哮教主马景涛版张无忌,李连杰版张无忌,吴启华版,苏有朋版,邓超版。
新版最让人期待的点就是当年在马景涛版倚天中饰演周芷若的周海媚在新版中饰演了灭绝师太。

\n
\n

电视剧新版《倚天屠龙记》开播就遭遇大量吐槽,这并不意外。当初李亚鹏、周迅演的《射雕英雄传》,也被那些“83版射雕”爱好者揶揄很久,但是这两年有很多网友开始怀念李亚鹏版的“射雕”了,这是新的一代人的记忆,而他们也到了怀旧的年纪了。

\n

这并不是说网友的吐槽都是“怀旧病”导致的。新版《倚天屠龙记》也有一些真正的问题,比如被网友推上热搜的“慢动作”就是一例。该剧的武打环节,大量使用慢动作,在空中飞的镜头让人想起纪录片中飞行的鸟类。大量慢镜头的使用,甚至影响到剧情的推进,武打本来是要让人激动,现在却成了难得的休息眼睛的时候。
\"杨逍\"
新版的杨逍与纪晓芙的感情线相对比较饱满。
新版《倚天屠龙记》播出后虽然被吐槽“慢动作太多”,影响观赏体验,但戏中演员的演技却颇具看点,而花旦们的颜值更非常抢眼

\n
\n

1.赵敏 扮演者 陈钰琪

出生日期:1992.7.29
\"赵敏
陈钰琪是唐嫣旗下力捧的90后花旦,凭借《锦绣未央》中的九公主和《香蜜沉沉烬如霜》里的魔界公主鎏英成名,清新亮丽的外形和可圈可点的演技,令她成为近两年颇具瞩目的小鲜花。
\"陈钰琪\"
在《倚天屠龙记》里,她饰演女一号美艳不可方物,且古灵精怪的赵敏,然而由于该剧版本太多,更有黎姿、贾静雯等珠玉在前,导致她很难得到观众的称赞。

\n

2.周芷若 扮演者 祝绪丹

出生日期:1992.4.15
\"周芷若
祝绪丹出道后以《三生三世十里桃花》《谈判官》《一千零一夜》等剧受到关注,修长的身材和甜美的外形,以及细腻的表演圈粉无数。
\"祝绪丹\"
她在戏中饰演周芷若,94版《倚天》的“周芷若”周海媚则扮演她的师傅灭绝师太,众所周知,她是杨幂旗下艺人,跟唐嫣旗下扮演赵敏的陈钰琪同龄,两人戏中是对手,戏外也因各自老板的微妙关系带有PK的味道。

\n

3.殷离 扮演者 曹曦月

出生日期:1994.4.21
\"殷离
曹曦月是明道力捧的新生代花旦,曾诠释了《楚乔传》中泼辣嚣张的反派锦烛,《浪花一朵朵》中程美,和《夜空中最闪亮的星》中的追爱少女夏媛等角色。
\"曹曦月\"
《倚天屠龙记》里,曹曦月扮演生性倔强,因练千蛛万毒手毁容的殷离(蛛儿),跟其以往角色反差甚大,而且为了角色“毁容”,也让观众看到她在角色方面的更多可塑性。

\n

4.小昭 扮演者 许雅婷

出生日期:1994.9.24
\"小昭
秀美绝伦,温柔善良,且深藏不露的小昭由香港90后花旦许雅婷饰演。
\"许雅婷\"
许雅婷是“少女标本”演唱组合的成员,出道后音乐和影视双栖发展,参演过《微交少女》 《医护人生》《美人鱼》等20多部影视作品,不仅拥有扎实的表演功力,更拥有明艳的容貌,是一位颜值与演技并存的潜力花旦。

\n

5.殷素素 扮演者 陈欣予

出生日期:1990年11月24日
\"殷素素
《倚天屠龙记》首播,#新版殷素素#登上热搜,90后花旦陈欣予获得万千网友点赞打call。
\"陈欣予\"
据悉,陈欣予2013年出道,凭借《何以笙箫默》 里暗恋何以琛多年的法律系高冷才女许影和《泡沫之夏》中外表温柔羞怯,内心敏感的姚淑儿成名。

\n

6.邬靖靖 饰 纪晓芙

出生日期:1991.6.6
\"邬靖靖
美丽聪慧,为爱执着的纪晓芙由90后花旦邬靖靖饰演,熟悉八卦的朋友应该知道,她是知名演员邬倩倩和著名导演尤小刚的侄女。
\"邬靖靖\"
据悉,邬靖靖毕业于中国传媒大学,在姑姑和姑父的提携下,大二就开始拍戏,凭《西施秘史》《杨贵妃秘史》《大唐女巡按》《封神英雄榜》等剧成为演技派花旦 ,2014年在于正版《神雕侠侣》里饰演公孙绿萼。

\n

7.杨不悔 扮演者 孙安可

出生日期:1998.2.2
\"杨不悔
孙安可虽为影视圈新人,但她演戏颇具天分,成功诠释了杨不悔的单纯善良,而且扮相非常清丽。
\"孙安可\"
98年出生的孙安可还曾参演过《衰鬼记》《恶魔少爷别吻我》等剧。

\n

8.黄衫女子 扮演者 赵樱子

出生日期:1990.12.16
\"黄衫女子
黄衫女子虽然戏份不多,但其绝美的容貌,出尘脱俗气质令人印象深刻,90后花旦赵樱子不仅颜值能打,演技也不俗,堪可与刘诗诗扮演的黄衫女子一拼。
\"赵樱子\"
据悉,赵樱子,原名赵韩樱子,中戏校花级人物,2011年入行演戏,以《爱在春天》《因为爱情有多美》等剧成名,2014年在于正版《神雕侠侣》饰演程英,而她参演的《大明皇妃·孙若微传》《长安诺》则未播先热。

\n

9.丁敏君 扮演者 陶珞依

出生年月:1991.3.11
\"丁敏君
《倚天屠龙记》里尖酸刻薄,且喜欢耍阴谋诡计的丁敏君师姐由90后花旦陶珞依扮演。
\"陶珞依\"
原名苗洛依的她参加世界小姐选美比赛,而且获得全国十强,转战影视圈后参演了《美人心计》《张小五的春天》《大汉情缘云中歌》等30多部影视作品,虽然没有大火,但其出众的外表和精湛的演技受到很多观众的喜爱。

\n"},{"title":"CentOS一键安装ShadowsocksR服务(附单/多端口管理)","published":1,"hideInList":false,"cover":"https://xy07-1251893119.costj.myqcloud.com/2019/04/03/4001117836.png","abbrlink":"8a82280f","date":"2019-04-03T11:02:00.000Z","_content":"\n\n```bash\nwget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh\n```\n\n使用wget命令下载文件,-N代表不重新下载文件除非比本地文件更新,--no-check-certificate代表不检查证书。\n\n下载完成后可以看到以下界面,按提示操作输入端口/密码/加密方式/ 协议/混淆等参数即可完成安装。\n![20190211153929924.png][1]\n安装完成后,如需要进入服务界面输入以下命令。\n\n bash ssr.sh\n安装完成后,自动设置为系统服务,所以支持使用服务来启动/停止等操作,同时支持开机启动。\n\n> service ssr start //启动 \n> service ssr stop //停止 \n> service ssr restart //重启 \n> service ssr status\n\nShadowsocksR 默认支持UDP转发,服务端无需任何设置。\n\n本脚本已经集成了 安装/卸载 锐速(ServerSpeeder),但是是否支持请查看 Linux支持内核列表 。\n \n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2019/04/03/4001117836.png\n\n","source":"_posts/2019-04-03-CentOS-ShadowsocksR.md","raw":"---\ntitle: CentOS一键安装ShadowsocksR服务(附单/多端口管理)\ntags:\n - wget\n - 列表\n - 文件\n - 命令\n - 安装\n - ssr\n - service\npublished: true\nhideInList: false\ncategories: 分享\ncover: 'https://xy07-1251893119.costj.myqcloud.com/2019/04/03/4001117836.png'\nabbrlink: 8a82280f\ndate: 2019-04-03 19:02:00\n---\n\n\n```bash\nwget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh\n```\n\n使用wget命令下载文件,-N代表不重新下载文件除非比本地文件更新,--no-check-certificate代表不检查证书。\n\n下载完成后可以看到以下界面,按提示操作输入端口/密码/加密方式/ 协议/混淆等参数即可完成安装。\n![20190211153929924.png][1]\n安装完成后,如需要进入服务界面输入以下命令。\n\n bash ssr.sh\n安装完成后,自动设置为系统服务,所以支持使用服务来启动/停止等操作,同时支持开机启动。\n\n> service ssr start //启动 \n> service ssr stop //停止 \n> service ssr restart //重启 \n> service ssr status\n\nShadowsocksR 默认支持UDP转发,服务端无需任何设置。\n\n本脚本已经集成了 安装/卸载 锐速(ServerSpeeder),但是是否支持请查看 Linux支持内核列表 。\n \n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2019/04/03/4001117836.png\n\n","slug":"2019-04-03-CentOS-ShadowsocksR","updated":"2023-09-30T02:59:46.511Z","_id":"cln4obyer0013oko0257idpe3","comments":1,"layout":"post","photos":[],"link":"","content":"
1
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh
\n\n

使用wget命令下载文件,-N代表不重新下载文件除非比本地文件更新,–no-check-certificate代表不检查证书。

\n

下载完成后可以看到以下界面,按提示操作输入端口/密码/加密方式/ 协议/混淆等参数即可完成安装。
\"20190211153929924.png\"
安装完成后,如需要进入服务界面输入以下命令。

\n
bash ssr.sh\n
\n

安装完成后,自动设置为系统服务,所以支持使用服务来启动/停止等操作,同时支持开机启动。

\n
\n

service ssr start //启动
service ssr stop //停止
service ssr restart //重启
service ssr status

\n
\n

ShadowsocksR 默认支持UDP转发,服务端无需任何设置。

\n

本脚本已经集成了 安装/卸载 锐速(ServerSpeeder),但是是否支持请查看 Linux支持内核列表 。

\n","site":{"data":{}},"excerpt":"","more":"
1
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh
\n\n

使用wget命令下载文件,-N代表不重新下载文件除非比本地文件更新,–no-check-certificate代表不检查证书。

\n

下载完成后可以看到以下界面,按提示操作输入端口/密码/加密方式/ 协议/混淆等参数即可完成安装。
\"20190211153929924.png\"
安装完成后,如需要进入服务界面输入以下命令。

\n
bash ssr.sh\n
\n

安装完成后,自动设置为系统服务,所以支持使用服务来启动/停止等操作,同时支持开机启动。

\n
\n

service ssr start //启动
service ssr stop //停止
service ssr restart //重启
service ssr status

\n
\n

ShadowsocksR 默认支持UDP转发,服务端无需任何设置。

\n

本脚本已经集成了 安装/卸载 锐速(ServerSpeeder),但是是否支持请查看 Linux支持内核列表 。

\n"},{"abbrlink":"8327832e","date":"2021-03-24T04:00:00.000Z","excerpt":"配置 主板 精粤h97m-vh CPU i5 5575r魔改 内存 amd专用条 32g 硬盘 fanxiang nvme 256gb 无线网卡 bcm943224pciebt白果拆机 EFI 使用opencore引导。 声卡内建 集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛 无线网卡正常投送 有线网卡内建 下载地址 打赏后联系博主 ","published":1,"title":"精粤h97m-vh+i5 5575r oc0.6.7引导big sur11.1","updated":"2023-04-13T07:33:17.000Z","_content":"# 配置\n\n- 主板 精粤h97m-vh\n- CPU i5 5575r魔改\n- 内存 amd专用条 32g\n- 硬盘 fanxiang nvme 256gb\n- 无线网卡 bcm943224pciebt白果拆机\n\n# EFI\n\n使用opencore引导。\n声卡内建\n集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛\n无线网卡正常投送\n有线网卡内建\n\n# 下载地址\n\n打赏后联系博主\n","source":"_posts/2021-03-24-h97m-vh+i5_5575r_oc0.6.7-big_sur_.md","raw":"---\nabbrlink: 8327832e\ncategories:\n - 分享\ndate: '2021-03-24 12:00:00'\nexcerpt: >-\n 配置 主板 精粤h97m-vh CPU i5 5575r魔改 内存 amd专用条 32g 硬盘 fanxiang nvme 256gb 无线网卡\n bcm943224pciebt白果拆机 EFI 使用opencore引导。 声卡内建 集显iris\n 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛 无线网卡正常投送 有线网卡内建 下载地址 打赏后联系博主 \npublished: true\ntags:\n - 硬盘\n - opencore\n - 网卡\n - i5\n - 主板\n - nvme\n - 精粤\n - 黑苹果\ntitle: 精粤h97m-vh+i5 5575r oc0.6.7引导big sur11.1\nupdated: 'Thu, 13 Apr 2023 07:33:17 GMT'\n---\n# 配置\n\n- 主板 精粤h97m-vh\n- CPU i5 5575r魔改\n- 内存 amd专用条 32g\n- 硬盘 fanxiang nvme 256gb\n- 无线网卡 bcm943224pciebt白果拆机\n\n# EFI\n\n使用opencore引导。\n声卡内建\n集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛\n无线网卡正常投送\n有线网卡内建\n\n# 下载地址\n\n打赏后联系博主\n","slug":"2021-03-24-h97m-vh+i5_5575r_oc0.6.7-big_sur_","_id":"cln4obyes0017oko03vhpgdbl","comments":1,"layout":"post","photos":[],"link":"","content":"

配置

    \n
  • 主板 精粤h97m-vh
  • \n
  • CPU i5 5575r魔改
  • \n
  • 内存 amd专用条 32g
  • \n
  • 硬盘 fanxiang nvme 256gb
  • \n
  • 无线网卡 bcm943224pciebt白果拆机
  • \n
\n

EFI

使用opencore引导。
声卡内建
集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛
无线网卡正常投送
有线网卡内建

\n

下载地址

打赏后联系博主

\n","site":{"data":{}},"more":"

配置

    \n
  • 主板 精粤h97m-vh
  • \n
  • CPU i5 5575r魔改
  • \n
  • 内存 amd专用条 32g
  • \n
  • 硬盘 fanxiang nvme 256gb
  • \n
  • 无线网卡 bcm943224pciebt白果拆机
  • \n
\n

EFI

使用opencore引导。
声卡内建
集显iris 6200成功驱动,hdmi只能输出4k30hz,没有dp接口的痛
无线网卡正常投送
有线网卡内建

\n

下载地址

打赏后联系博主

\n"},{"title":"NEC VK22 黑苹果opencore引导","published":1,"hideInList":false,"isTop":false,"abbrlink":"89f51950","date":"2021-10-10T07:42:00.000Z","_content":"\n\n \n\n## 关于解锁\n\n安装之前要解锁cfglock\n\n## 关于nvme固态的使用\n\n思路就是用一个U盘格式化成FAT32格式\n\n把oc引导复制在U盘中。\n\n在BIOS中把U盘启动设为第一启动项\n\n这样做得好处是不用修改BIOS直接使用nvme的固态提升读写速度\n\n坏处就是占用一个USB口\n\n## 其他\n\n笔记本黑苹果的难点就在于注入edid。\n\n我的做法是在clover下安装好macos之后再用hackintool注入EDID,然后再转为opencore引导。\n\n其他都很简单我就不多说了。\n\n附上EFI文件,三码自己改\n\n## 已驱动\n\n显卡\n声卡\n网卡 (已更换DW1820A)\n读卡器\nUSB\n触摸板\n \n ## 下载\n\n[请打赏后下载][2]\n\n\n \n [2]: https://blogcdn.asbid.cn/2021/12/03/1638521042.zip","source":"_posts/2021-10-10-NEC_VK22_opencore.md","raw":"---\ntitle: NEC VK22 黑苹果opencore引导\ntags:\n - macos\n - 黑苹果\n - opencore\n - 笔记本\n - clover\n - edid\n - hackintool\npublished: true\nhideInList: false\ncategories: 分享\nisTop: false\nabbrlink: 89f51950\ndate: 2021-10-10 15:42:00\n---\n\n\n \n\n## 关于解锁\n\n安装之前要解锁cfglock\n\n## 关于nvme固态的使用\n\n思路就是用一个U盘格式化成FAT32格式\n\n把oc引导复制在U盘中。\n\n在BIOS中把U盘启动设为第一启动项\n\n这样做得好处是不用修改BIOS直接使用nvme的固态提升读写速度\n\n坏处就是占用一个USB口\n\n## 其他\n\n笔记本黑苹果的难点就在于注入edid。\n\n我的做法是在clover下安装好macos之后再用hackintool注入EDID,然后再转为opencore引导。\n\n其他都很简单我就不多说了。\n\n附上EFI文件,三码自己改\n\n## 已驱动\n\n显卡\n声卡\n网卡 (已更换DW1820A)\n读卡器\nUSB\n触摸板\n \n ## 下载\n\n[请打赏后下载][2]\n\n\n \n [2]: https://blogcdn.asbid.cn/2021/12/03/1638521042.zip","slug":"2021-10-10-NEC_VK22_opencore","updated":"2023-09-30T02:59:46.511Z","_id":"cln4obyet001aoko088smaz6z","comments":1,"layout":"post","photos":[],"link":"","content":"

关于解锁

安装之前要解锁cfglock

\n

关于nvme固态的使用

思路就是用一个U盘格式化成FAT32格式

\n

把oc引导复制在U盘中。

\n

在BIOS中把U盘启动设为第一启动项

\n

这样做得好处是不用修改BIOS直接使用nvme的固态提升读写速度

\n

坏处就是占用一个USB口

\n

其他

笔记本黑苹果的难点就在于注入edid。

\n

我的做法是在clover下安装好macos之后再用hackintool注入EDID,然后再转为opencore引导。

\n

其他都很简单我就不多说了。

\n

附上EFI文件,三码自己改

\n

已驱动

显卡
声卡
网卡 (已更换DW1820A)
读卡器
USB
触摸板

\n

下载

请打赏后下载

\n","site":{"data":{}},"excerpt":"","more":"

关于解锁

安装之前要解锁cfglock

\n

关于nvme固态的使用

思路就是用一个U盘格式化成FAT32格式

\n

把oc引导复制在U盘中。

\n

在BIOS中把U盘启动设为第一启动项

\n

这样做得好处是不用修改BIOS直接使用nvme的固态提升读写速度

\n

坏处就是占用一个USB口

\n

其他

笔记本黑苹果的难点就在于注入edid。

\n

我的做法是在clover下安装好macos之后再用hackintool注入EDID,然后再转为opencore引导。

\n

其他都很简单我就不多说了。

\n

附上EFI文件,三码自己改

\n

已驱动

显卡
声卡
网卡 (已更换DW1820A)
读卡器
USB
触摸板

\n

下载

请打赏后下载

\n"},{"title":"NEC VK22t 测评","published":1,"hideInList":false,"cover":"https://blog.asbid.cn/usr/uploads/2021/10/1718321267.jpg","abbrlink":"7e0d420b","date":"2021-10-10T07:52:00.000Z","_content":"\n\n年前就在海鲜市场入手了一台号称最轻量的笔记本电脑,只有800g。\n我看重的是它2k分辨率的夏普屏。忽略了只有4g lpddr3这个残疾的事情。\n无所谓了只是用来上网或者处理文档的话4g内存还是能凑合用的\n笔记本原装的是一块三星的m.2sata接口的硬盘。\n当时我用一块m.2 nvme的固态硬盘没有进入系统,当时便以为不支持nvme,便没有在意。\n近日因为笔记本D壳脱漆。不知道是因为这个不是原装的D壳还是烤漆工艺的问题,大概率是因为奸商重新喷漆翻新的。\n我拆开换了一条m2 nvme用pe系统一看。竟然是可以识别的。就是无法引导。\n目前我用一个u盘装了CLOVER引导。\n后续会尝试修改BIOS来支持nvme启动\nhttps://blog.asbid.cn/vk22t-add-nvme-module-bios.html\n作为一款洋垃圾只有900的价格,用来上网写文字,看视频还是相当ok的。\n本文就是在nec vk22上完成。\n上一张鲁大师看看\n![ludashi.jpg][1]\n![ludashi2.jpg][2]\n 黑苹果引导\nhttps://blog.asbid.cn/nec-vk22-black-apple-opencore-boot.html\n\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/1718321267.jpg\n [2]: https://blog.asbid.cn/usr/uploads/2021/10/2198726438.jpg","source":"_posts/2021-10-10-NEC_VK22t.md","raw":"---\ntitle: NEC VK22t 测评\ntags:\n - 固态\n - 硬盘\n - nvme\n - 笔记本\n - 夏普屏\n - clover\npublished: true\nhideInList: false\ncategories: 分享\ncover: 'https://blog.asbid.cn/usr/uploads/2021/10/1718321267.jpg'\nabbrlink: 7e0d420b\ndate: 2021-10-10 15:52:00\n---\n\n\n年前就在海鲜市场入手了一台号称最轻量的笔记本电脑,只有800g。\n我看重的是它2k分辨率的夏普屏。忽略了只有4g lpddr3这个残疾的事情。\n无所谓了只是用来上网或者处理文档的话4g内存还是能凑合用的\n笔记本原装的是一块三星的m.2sata接口的硬盘。\n当时我用一块m.2 nvme的固态硬盘没有进入系统,当时便以为不支持nvme,便没有在意。\n近日因为笔记本D壳脱漆。不知道是因为这个不是原装的D壳还是烤漆工艺的问题,大概率是因为奸商重新喷漆翻新的。\n我拆开换了一条m2 nvme用pe系统一看。竟然是可以识别的。就是无法引导。\n目前我用一个u盘装了CLOVER引导。\n后续会尝试修改BIOS来支持nvme启动\nhttps://blog.asbid.cn/vk22t-add-nvme-module-bios.html\n作为一款洋垃圾只有900的价格,用来上网写文字,看视频还是相当ok的。\n本文就是在nec vk22上完成。\n上一张鲁大师看看\n![ludashi.jpg][1]\n![ludashi2.jpg][2]\n 黑苹果引导\nhttps://blog.asbid.cn/nec-vk22-black-apple-opencore-boot.html\n\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/1718321267.jpg\n [2]: https://blog.asbid.cn/usr/uploads/2021/10/2198726438.jpg","slug":"2021-10-10-NEC_VK22t","updated":"2023-09-30T02:59:46.512Z","_id":"cln4obyeu001doko0e993e7bg","comments":1,"layout":"post","photos":[],"link":"","content":"

年前就在海鲜市场入手了一台号称最轻量的笔记本电脑,只有800g。
我看重的是它2k分辨率的夏普屏。忽略了只有4g lpddr3这个残疾的事情。
无所谓了只是用来上网或者处理文档的话4g内存还是能凑合用的
笔记本原装的是一块三星的m.2sata接口的硬盘。
当时我用一块m.2 nvme的固态硬盘没有进入系统,当时便以为不支持nvme,便没有在意。
近日因为笔记本D壳脱漆。不知道是因为这个不是原装的D壳还是烤漆工艺的问题,大概率是因为奸商重新喷漆翻新的。
我拆开换了一条m2 nvme用pe系统一看。竟然是可以识别的。就是无法引导。
目前我用一个u盘装了CLOVER引导。
后续会尝试修改BIOS来支持nvme启动
https://blog.asbid.cn/vk22t-add-nvme-module-bios.html
作为一款洋垃圾只有900的价格,用来上网写文字,看视频还是相当ok的。
本文就是在nec vk22上完成。
上一张鲁大师看看
\"ludashi.jpg\"
\"ludashi2.jpg\"
黑苹果引导
https://blog.asbid.cn/nec-vk22-black-apple-opencore-boot.html

\n","site":{"data":{}},"excerpt":"","more":"

年前就在海鲜市场入手了一台号称最轻量的笔记本电脑,只有800g。
我看重的是它2k分辨率的夏普屏。忽略了只有4g lpddr3这个残疾的事情。
无所谓了只是用来上网或者处理文档的话4g内存还是能凑合用的
笔记本原装的是一块三星的m.2sata接口的硬盘。
当时我用一块m.2 nvme的固态硬盘没有进入系统,当时便以为不支持nvme,便没有在意。
近日因为笔记本D壳脱漆。不知道是因为这个不是原装的D壳还是烤漆工艺的问题,大概率是因为奸商重新喷漆翻新的。
我拆开换了一条m2 nvme用pe系统一看。竟然是可以识别的。就是无法引导。
目前我用一个u盘装了CLOVER引导。
后续会尝试修改BIOS来支持nvme启动
https://blog.asbid.cn/vk22t-add-nvme-module-bios.html
作为一款洋垃圾只有900的价格,用来上网写文字,看视频还是相当ok的。
本文就是在nec vk22上完成。
上一张鲁大师看看
\"ludashi.jpg\"
\"ludashi2.jpg\"
黑苹果引导
https://blog.asbid.cn/nec-vk22-black-apple-opencore-boot.html

\n"},{"abbrlink":"90206356","date":"2019-08-01T04:52:00.000Z","excerpt":"老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。 刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。 笔记本没有息屏就上班去了。 下班回来一看界面卡死。于是只有强行关机重启。 这下问题来了,识别不了硬盘了。 百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。 有教程说30分钟拯救固态。试了一晚上不行。 看了第二种方法就是去开卡量产。 ...","isTop":false,"published":1,"title":"记一次亿储SSD固态掉盘修复(重新开卡)","updated":"2023-04-13T07:30:32.000Z","_content":"老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。\n刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。\n笔记本没有息屏就上班去了。\n下班回来一看界面卡死。于是只有强行关机重启。\n这下问题来了,识别不了硬盘了。\n百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。\n有教程说30分钟拯救固态。试了一晚上不行。\n看了第二种方法就是去开卡量产。\n摸索了一晚上终于成功了!!!\n\n## 所需物料\n\n---\n\n硬盘盒(USB转接卡) 螺丝刀(拆硬盘用) 开卡软件(文章末尾下载)\n1 首先把硬盘拆开 拆开硬盘发现主控是慧荣sm 2246XT(其实百度也可以百度到,如果是正品的话……)\n![103_2877224_9e544a870ce08b2.jpg][1]\n图是网上找的,主控型号一般会印在主控芯片上,也就是那个小的。\n2 短接JP1,PCB上一般会有标注,如果和我的硬盘一样的话就短接最上面两个(懒 没有作图 网图)\n3 接上硬盘盒 打开开卡软件sm2246XT_MPTool_O1224H\n4 识别到port1之后 不用短接\n![QQ浏览器截图20190801131230.png][2]\n5 此时应该在Parameter里面选择一个合适的flash型号,直接开卡就会成功\n![103_2877224_bd107f5920c8e54.png][3]\n\n参考教程链接\n\n> http://www.upantool.com/jiaocheng/ssd/2017/10569.html\n> http://bbs.mydigit.cn/read.php?tid=2367269\n\n## 开卡工具下载\n\n[sm2246XT_MPTool_O1224H.zip][4]\n\n![bg.jpg][5]\n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/868332940.jpg\n[2]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/3281558957.png\n[3]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/252432522.png\n[4]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/2111427864.zip\n[5]: https://xy07-1251893119.costj.myqcloud.com/2020/12/21/3940912839.jpg\n","source":"_posts/2019-08-01-SSD.md","raw":"---\nabbrlink: '90206356'\ncategories:\n - - 分享\ndate: '2019-08-01 12:52:00'\nexcerpt: >-\n 老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。 刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。\n 笔记本没有息屏就上班去了。 下班回来一看界面卡死。于是只有强行关机重启。 这下问题来了,识别不了硬盘了。\n 百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。 有教程说30分钟拯救固态。试了一晚上不行。\n 看了第二种方法就是去开卡量产。 ...\nisTop: false\npublished: true\ntags:\n - 厂商\n - 固态\n - 主控\n - 开卡\n - 硬盘盒\ntitle: 记一次亿储SSD固态掉盘修复(重新开卡)\nupdated: 'Thu, 13 Apr 2023 07:30:32 GMT'\n---\n老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。\n刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。\n笔记本没有息屏就上班去了。\n下班回来一看界面卡死。于是只有强行关机重启。\n这下问题来了,识别不了硬盘了。\n百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。\n有教程说30分钟拯救固态。试了一晚上不行。\n看了第二种方法就是去开卡量产。\n摸索了一晚上终于成功了!!!\n\n## 所需物料\n\n---\n\n硬盘盒(USB转接卡) 螺丝刀(拆硬盘用) 开卡软件(文章末尾下载)\n1 首先把硬盘拆开 拆开硬盘发现主控是慧荣sm 2246XT(其实百度也可以百度到,如果是正品的话……)\n![103_2877224_9e544a870ce08b2.jpg][1]\n图是网上找的,主控型号一般会印在主控芯片上,也就是那个小的。\n2 短接JP1,PCB上一般会有标注,如果和我的硬盘一样的话就短接最上面两个(懒 没有作图 网图)\n3 接上硬盘盒 打开开卡软件sm2246XT_MPTool_O1224H\n4 识别到port1之后 不用短接\n![QQ浏览器截图20190801131230.png][2]\n5 此时应该在Parameter里面选择一个合适的flash型号,直接开卡就会成功\n![103_2877224_bd107f5920c8e54.png][3]\n\n参考教程链接\n\n> http://www.upantool.com/jiaocheng/ssd/2017/10569.html\n> http://bbs.mydigit.cn/read.php?tid=2367269\n\n## 开卡工具下载\n\n[sm2246XT_MPTool_O1224H.zip][4]\n\n![bg.jpg][5]\n\n[1]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/868332940.jpg\n[2]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/3281558957.png\n[3]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/252432522.png\n[4]: https://xy07-1251893119.costj.myqcloud.com/2019/08/01/2111427864.zip\n[5]: https://xy07-1251893119.costj.myqcloud.com/2020/12/21/3940912839.jpg\n","slug":"2019-08-01-SSD","_id":"cln4obyev001foko0ccn1cieg","comments":1,"layout":"post","photos":[],"link":"","content":"

老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。
刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。
笔记本没有息屏就上班去了。
下班回来一看界面卡死。于是只有强行关机重启。
这下问题来了,识别不了硬盘了。
百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。
有教程说30分钟拯救固态。试了一晚上不行。
看了第二种方法就是去开卡量产。
摸索了一晚上终于成功了!!!

\n

所需物料


\n

硬盘盒(USB转接卡) 螺丝刀(拆硬盘用) 开卡软件(文章末尾下载)
1 首先把硬盘拆开 拆开硬盘发现主控是慧荣sm 2246XT(其实百度也可以百度到,如果是正品的话……)
\"103_2877224_9e544a870ce08b2.jpg\"
图是网上找的,主控型号一般会印在主控芯片上,也就是那个小的。
2 短接JP1,PCB上一般会有标注,如果和我的硬盘一样的话就短接最上面两个(懒 没有作图 网图)
3 接上硬盘盒 打开开卡软件sm2246XT_MPTool_O1224H
4 识别到port1之后 不用短接
\"QQ浏览器截图20190801131230.png\"
5 此时应该在Parameter里面选择一个合适的flash型号,直接开卡就会成功
\"103_2877224_bd107f5920c8e54.png\"

\n

参考教程链接

\n
\n

http://www.upantool.com/jiaocheng/ssd/2017/10569.html
http://bbs.mydigit.cn/read.php?tid=2367269

\n
\n

开卡工具下载

sm2246XT_MPTool_O1224H.zip

\n

\"bg.jpg\"

\n","site":{"data":{}},"more":"

老孙在闲鱼淘了一块二手的SSD,本来准备用来安装黑苹果使用。
刚开始安装挺顺利,安装的是OSX 12.13.6,分区格式APFS。
笔记本没有息屏就上班去了。
下班回来一看界面卡死。于是只有强行关机重启。
这下问题来了,识别不了硬盘了。
百度出的原因就是固态硬盘掉盘。是二三线固态厂商的通病。再次建议大家还是买大厂的产品。
有教程说30分钟拯救固态。试了一晚上不行。
看了第二种方法就是去开卡量产。
摸索了一晚上终于成功了!!!

\n

所需物料


\n

硬盘盒(USB转接卡) 螺丝刀(拆硬盘用) 开卡软件(文章末尾下载)
1 首先把硬盘拆开 拆开硬盘发现主控是慧荣sm 2246XT(其实百度也可以百度到,如果是正品的话……)
\"103_2877224_9e544a870ce08b2.jpg\"
图是网上找的,主控型号一般会印在主控芯片上,也就是那个小的。
2 短接JP1,PCB上一般会有标注,如果和我的硬盘一样的话就短接最上面两个(懒 没有作图 网图)
3 接上硬盘盒 打开开卡软件sm2246XT_MPTool_O1224H
4 识别到port1之后 不用短接
\"QQ浏览器截图20190801131230.png\"
5 此时应该在Parameter里面选择一个合适的flash型号,直接开卡就会成功
\"103_2877224_bd107f5920c8e54.png\"

\n

参考教程链接

\n
\n

http://www.upantool.com/jiaocheng/ssd/2017/10569.html
http://bbs.mydigit.cn/read.php?tid=2367269

\n
\n

开卡工具下载

sm2246XT_MPTool_O1224H.zip

\n

\"bg.jpg\"

\n"},{"abbrlink":"156c3684","date":"2021-10-11T02:21:00.000Z","excerpt":"昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios 用编程器写入之后发现无法开机。 用编程器备份的bios是8m,用amibios工具备份下来的只有6m。 后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。 bios尝试计划至此被动完结。 笔记本目前已经被我肢解。 对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点 少折腾还能省钱-_- 在外网找到了一个...","published":1,"title":"关于nec vk22t添加nvme驱动","updated":"2023-04-13T07:29:39.000Z","_content":"昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios\n用编程器写入之后发现无法开机。\n用编程器备份的bios是8m,用amibios工具备份下来的只有6m。\n后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。\nbios尝试计划至此被动完结。\n笔记本目前已经被我肢解。\n对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点\n少折腾还能省钱-_-\n\n在外网找到了一个small版的模块或许有用\nhttps://blog.asbid.cn/nvme-module-small.html\n","source":"_posts/2021-10-11-nec_vk22t-nvme.md","raw":"---\nabbrlink: 156c3684\ncategories:\n - - 分享\ndate: '2021-10-11 10:21:00'\nexcerpt: >-\n 昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios 用编程器写入之后发现无法开机。\n 用编程器备份的bios是8m,用amibios工具备份下来的只有6m。 后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。\n bios尝试计划至此被动完结。 笔记本目前已经被我肢解。 对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点 少折腾还能省钱-_-\n 在外网找到了一个...\npublished: true\ntags:\n - 驱动\n - 主板\n - nvme\n - 笔记本\n - bios\n - 编程器\n - 焊盘\ntitle: 关于nec vk22t添加nvme驱动\nupdated: 'Thu, 13 Apr 2023 07:29:39 GMT'\n---\n昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios\n用编程器写入之后发现无法开机。\n用编程器备份的bios是8m,用amibios工具备份下来的只有6m。\n后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。\nbios尝试计划至此被动完结。\n笔记本目前已经被我肢解。\n对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点\n少折腾还能省钱-_-\n\n在外网找到了一个small版的模块或许有用\nhttps://blog.asbid.cn/nvme-module-small.html\n","slug":"2021-10-11-nec_vk22t-nvme","_id":"cln4obyew001joko0et1hdhch","comments":1,"layout":"post","photos":[],"link":"","content":"

昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios
用编程器写入之后发现无法开机。
用编程器备份的bios是8m,用amibios工具备份下来的只有6m。
后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。
bios尝试计划至此被动完结。
笔记本目前已经被我肢解。
对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点
少折腾还能省钱-_-

\n

在外网找到了一个small版的模块或许有用
https://blog.asbid.cn/nvme-module-small.html

\n","site":{"data":{}},"more":"

昨天尝试把bios芯片焊下来然后用uefitool把nvme驱动添加进bios
用编程器写入之后发现无法开机。
用编程器备份的bios是8m,用amibios工具备份下来的只有6m。
后来没有继续尝试的原因是我把主板上的焊盘搞坏了。算了。
bios尝试计划至此被动完结。
笔记本目前已经被我肢解。
对于nvme我能给的建议就是直接用u盘来引导吧 这样至少安全点
少折腾还能省钱-_-

\n

在外网找到了一个small版的模块或许有用
https://blog.asbid.cn/nvme-module-small.html

\n"},{"title":"nvme模块small","published":1,"hideInList":false,"isTop":false,"abbrlink":"e3e6b5d8","date":"2021-10-13T06:38:00.000Z","feature":null,"_content":"\n\nNvmExpressDxe_Small_Compressed.ffs \n\n##下载地址\n\n[NvmExpressDxe_Small_Compressed.ffs .zip][1]\n\n资源来自外网没本人有测试,请自行测试\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/3465048984.zip","source":"_posts/2021-10-13-nvme-mod-small.md","raw":"---\ntitle: nvme模块small\ntags:\n - zip\npublished: true\nhideInList: false\nisTop: false\nabbrlink: e3e6b5d8\ndate: 2021-10-13 14:38:00\nfeature:\n---\n\n\nNvmExpressDxe_Small_Compressed.ffs \n\n##下载地址\n\n[NvmExpressDxe_Small_Compressed.ffs .zip][1]\n\n资源来自外网没本人有测试,请自行测试\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/3465048984.zip","slug":"2021-10-13-nvme-mod-small","updated":"2023-09-30T02:59:46.512Z","_id":"cln4obyez001loko06bsidojx","comments":1,"layout":"post","photos":[],"link":"","content":"

NvmExpressDxe_Small_Compressed.ffs

\n

##下载地址

\n

[NvmExpressDxe_Small_Compressed.ffs .zip][1]

\n

资源来自外网没本人有测试,请自行测试
[1]: https://blog.asbid.cn/usr/uploads/2021/10/3465048984.zip

\n","site":{"data":{}},"excerpt":"","more":"

NvmExpressDxe_Small_Compressed.ffs

\n

##下载地址

\n

[NvmExpressDxe_Small_Compressed.ffs .zip][1]

\n

资源来自外网没本人有测试,请自行测试
[1]: https://blog.asbid.cn/usr/uploads/2021/10/3465048984.zip

\n"},{"title":"nec vk22t bios 备份","published":1,"hideInList":false,"isTop":false,"abbrlink":"6857bb45","date":"2021-10-13T03:40:00.000Z","feature":null,"_content":"\n\n本人通过编程器从BIOS芯片中读出的原厂bios\n\n##下载地址\n\n\n[vk22.zip][1]\n\n不保证有错误。\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/2626273821.zip","source":"_posts/2021-10-13-nec_vk22t_bios.md","raw":"---\ntitle: nec vk22t bios 备份\ntags:\n - 下载\n - 地址\npublished: true\nhideInList: false\nisTop: false\nabbrlink: 6857bb45\ncategories: 分享\ndate: 2021-10-13 11:40:00\nfeature:\n---\n\n\n本人通过编程器从BIOS芯片中读出的原厂bios\n\n##下载地址\n\n\n[vk22.zip][1]\n\n不保证有错误。\n [1]: https://blog.asbid.cn/usr/uploads/2021/10/2626273821.zip","slug":"2021-10-13-nec_vk22t_bios","updated":"2023-09-30T02:59:46.512Z","_id":"cln4obyf0001poko0gmyr00wf","comments":1,"layout":"post","photos":[],"link":"","content":"

本人通过编程器从BIOS芯片中读出的原厂bios

\n

##下载地址

\n

[vk22.zip][1]

\n

不保证有错误。
[1]: https://blog.asbid.cn/usr/uploads/2021/10/2626273821.zip

\n","site":{"data":{}},"excerpt":"","more":"

本人通过编程器从BIOS芯片中读出的原厂bios

\n

##下载地址

\n

[vk22.zip][1]

\n

不保证有错误。
[1]: https://blog.asbid.cn/usr/uploads/2021/10/2626273821.zip

\n"},{"abbrlink":"244f7c76","date":"2021-10-19T07:32:28.000Z","excerpt":"用来修复黑苹果扬声器无声的情况 下载地址 归档.zip ","published":1,"title":"onda h410ipc codec提取","updated":"2023-04-13T07:30:57.000Z","_content":"用来修复黑苹果扬声器无声的情况\n\n## 下载地址\n\n[归档.zip][1]\n\n[1]: https://blogcdn.asbid.cn/2021/10/19/1634628706.zip\n","source":"_posts/2021-10-19-onda_h410ipc_codec.md","raw":"---\nabbrlink: 244f7c76\ncategories:\n - - 分享\ndate: '2021-10-19 15:32:28'\nexcerpt: '用来修复黑苹果扬声器无声的情况 下载地址 归档.zip '\npublished: true\ntags:\n - 苹果\n - 情况\n - 地址\n - zip\n - 归档\n - 无声\n - 扬声器\n - 修复\ntitle: onda h410ipc codec提取\nupdated: 'Thu, 13 Apr 2023 07:30:57 GMT'\n---\n用来修复黑苹果扬声器无声的情况\n\n## 下载地址\n\n[归档.zip][1]\n\n[1]: https://blogcdn.asbid.cn/2021/10/19/1634628706.zip\n","slug":"2021-10-19-onda_h410ipc_codec","_id":"cln4obyf1001soko01igb6ki8","comments":1,"layout":"post","photos":[],"link":"","content":"

用来修复黑苹果扬声器无声的情况

\n

下载地址

归档.zip

\n","site":{"data":{}},"more":"

用来修复黑苹果扬声器无声的情况

\n

下载地址

归档.zip

\n"},{"title":"NEC vk22t bios 添加nvme模块支持","published":1,"hideInList":false,"abbrlink":"de19f54c","date":"2021-10-19T03:08:00.000Z","feature":null,"_content":"\n\n## 关于\n偶然发现NEC vk22t的m2是可以识别出nvme协议的固态硬盘,但是不支持nvme的引导。\n所以添加了nvme模块\n需要编程器刷入\n由于手头没有本子测试,有问题可以留言\n\n\n## 下载地址\n\n\n[vk22t.zip][1]\n\n\n\n\n\n\n [1]: https://blogcdn.asbid.cn/2021/10/19/1634612890.zip","source":"_posts/2021-10-19-NEC_vk22t_bios_nvme.md","raw":"---\ntitle: NEC vk22t bios 添加nvme模块支持\ntags:\n - 下载\n - 地址\n - zip\n - vk22t\npublished: true\nhideInList: false\ncategories: 分享\nabbrlink: de19f54c\ndate: 2021-10-19 11:08:00\nfeature:\n---\n\n\n## 关于\n偶然发现NEC vk22t的m2是可以识别出nvme协议的固态硬盘,但是不支持nvme的引导。\n所以添加了nvme模块\n需要编程器刷入\n由于手头没有本子测试,有问题可以留言\n\n\n## 下载地址\n\n\n[vk22t.zip][1]\n\n\n\n\n\n\n [1]: https://blogcdn.asbid.cn/2021/10/19/1634612890.zip","slug":"2021-10-19-NEC_vk22t_bios_nvme","updated":"2023-09-30T02:59:46.512Z","_id":"cln4obyf1001xoko08uo5ghw4","comments":1,"layout":"post","photos":[],"link":"","content":"

关于

偶然发现NEC vk22t的m2是可以识别出nvme协议的固态硬盘,但是不支持nvme的引导。
所以添加了nvme模块
需要编程器刷入
由于手头没有本子测试,有问题可以留言

\n

下载地址

vk22t.zip

\n","site":{"data":{}},"excerpt":"","more":"

关于

偶然发现NEC vk22t的m2是可以识别出nvme协议的固态硬盘,但是不支持nvme的引导。
所以添加了nvme模块
需要编程器刷入
由于手头没有本子测试,有问题可以留言

\n

下载地址

vk22t.zip

\n"},{"title":"肥猫家rx560 4g vbios备份","published":1,"hideInList":false,"feature":"https://blogcdn.asbid.cn/2021/10/15/1634282558.png","isTop":false,"abbrlink":"882b6242","date":"2021-12-14T07:38:00.000Z","_content":"\n\n原来是海力士颗粒后来返厂维修成了三星颗粒且已经开核为1024sp\n三星颗粒的可以尝试刷此BIOS\n## 下载地址\n![请输入图片描述][1]\n[请打赏后下载][2]\n\n\n [1]: https://blogcdn.asbid.cn/2021/10/15/1634282558.png\n [2]: https://blogcdn.asbid.cn/2021/12/14/1639467491.zip","source":"_posts/2021-12-14-rx560_4g_vbios.md","raw":"---\ntitle: 肥猫家rx560 4g vbios备份\ntags:\n - 下载\n - bios\n - 地址\n - 颗粒\n - 打赏\n - 海力士\npublished: true\nhideInList: false\nfeature: 'https://blogcdn.asbid.cn/2021/10/15/1634282558.png'\nisTop: false\nabbrlink: 882b6242\ndate: 2021-12-14 15:38:00\n---\n\n\n原来是海力士颗粒后来返厂维修成了三星颗粒且已经开核为1024sp\n三星颗粒的可以尝试刷此BIOS\n## 下载地址\n![请输入图片描述][1]\n[请打赏后下载][2]\n\n\n [1]: https://blogcdn.asbid.cn/2021/10/15/1634282558.png\n [2]: https://blogcdn.asbid.cn/2021/12/14/1639467491.zip","slug":"2021-12-14-rx560_4g_vbios","updated":"2023-09-30T02:59:46.512Z","_id":"cln4obyf20020oko00eev0xhh","comments":1,"layout":"post","photos":[],"link":"","content":"

原来是海力士颗粒后来返厂维修成了三星颗粒且已经开核为1024sp
三星颗粒的可以尝试刷此BIOS

\n

下载地址

\"请输入图片描述\"
请打赏后下载

\n","site":{"data":{}},"excerpt":"","more":"

原来是海力士颗粒后来返厂维修成了三星颗粒且已经开核为1024sp
三星颗粒的可以尝试刷此BIOS

\n

下载地址

\"请输入图片描述\"
请打赏后下载

\n"},{"title":"2023年黑苹果amd免驱显卡购买推荐","published":1,"hideInList":false,"isTop":true,"abbrlink":"82e8a6ff","date":"2022-01-21T08:50:00.000Z","feature":null,"_content":"\n\n## Navi 20系列 从bigsur开始支持\nRX 6600\nRX 6600 XT\nRX 6800\nRX 6800 XT\nRX 6900 XT \n## Navi 10系列 从Catalina开始支持\nRX 5500\nRX 5500 XT\nRX 5600\nRX 5600 XT\nRX 5700\nRX 5700 XT\nRX 5700 XT 50周年纪念版\n如遇到黑屏,需要boot参数agdpmod=pikera才能正确显示\n## Vega 20系列 从Mojave开始支持\nRadeon VII\n## Vega 10系列 从High Sierra开始支持\nVega 64 Liquid\nVega 64\nVega 56\nVega Frontier Edition\nRadeon Pro WX 9100\nRadeon Pro WX 7100\n## Polaris架构10和20系列 从Sierra开始支持\n400系列:\n\nRX 480\nRX 470D\nRX 470\nRX 460\nRX 590\nRX 580X\nRX 580\nRX 570X\nRX 570\nRX 560X\nRX 560\nWX 5100\nWX 4100\nE9550\n\n还有些同Polaris核心的\nrx550\n## R7 / R9系列 从Yosemite开始支持\nR9 Fury X\nR9 Fury\nR9 Nano\nR9 390(需要FakeID)\nR9 290X / 390X\nR9 290/390(需提供FakeID)\nR9 280x / 380x(不一定成功)\nR9 280/380(需要FakeID)\nR9 270X / 370X\nR7 270/370(需提供FakeID)\nR7 265\nR7 260x / 360x\nR9 260/360(根据型号可能需要FakeID)\nR9 255\nR7 250X\nR7 250(需提供FakeID)\nR7 240(需要FakeID)\n## HD 8000系列 从Mountain Lion开始支持\nHD 8740\nHD 8760\nHD 8770\nHD 8850\nHD 8870\nHD 8890\nHD 8950\nHD 8970\n## HD 7000系列 从Mountain Lion开始支持\nDual AMD FirePro D300\nDual AMD FirePro D500\nDual AMD FirePro D700\nFirePro W5100(FakeID needed)\nFirePro W7000\nFirePro W9000\nHD 7700\nHD 7730\nHD 7750\nHD 7770\nHD 7790\nHD 7850\nHD 7870\nHD 7870 XT\nHD 7950\nHD 7970\nHD 7990","source":"_posts/2022-01-21-2023-amd-gpu.md","raw":"---\ntitle: 2023年黑苹果amd免驱显卡购买推荐\ntags:\n - 黑苹果\n - 显卡\n - 免驱\n - amd\npublished: true\nhideInList: false\nisTop: true\nabbrlink: 82e8a6ff\ndate: 2022-01-21 16:50:00\nfeature:\n---\n\n\n## Navi 20系列 从bigsur开始支持\nRX 6600\nRX 6600 XT\nRX 6800\nRX 6800 XT\nRX 6900 XT \n## Navi 10系列 从Catalina开始支持\nRX 5500\nRX 5500 XT\nRX 5600\nRX 5600 XT\nRX 5700\nRX 5700 XT\nRX 5700 XT 50周年纪念版\n如遇到黑屏,需要boot参数agdpmod=pikera才能正确显示\n## Vega 20系列 从Mojave开始支持\nRadeon VII\n## Vega 10系列 从High Sierra开始支持\nVega 64 Liquid\nVega 64\nVega 56\nVega Frontier Edition\nRadeon Pro WX 9100\nRadeon Pro WX 7100\n## Polaris架构10和20系列 从Sierra开始支持\n400系列:\n\nRX 480\nRX 470D\nRX 470\nRX 460\nRX 590\nRX 580X\nRX 580\nRX 570X\nRX 570\nRX 560X\nRX 560\nWX 5100\nWX 4100\nE9550\n\n还有些同Polaris核心的\nrx550\n## R7 / R9系列 从Yosemite开始支持\nR9 Fury X\nR9 Fury\nR9 Nano\nR9 390(需要FakeID)\nR9 290X / 390X\nR9 290/390(需提供FakeID)\nR9 280x / 380x(不一定成功)\nR9 280/380(需要FakeID)\nR9 270X / 370X\nR7 270/370(需提供FakeID)\nR7 265\nR7 260x / 360x\nR9 260/360(根据型号可能需要FakeID)\nR9 255\nR7 250X\nR7 250(需提供FakeID)\nR7 240(需要FakeID)\n## HD 8000系列 从Mountain Lion开始支持\nHD 8740\nHD 8760\nHD 8770\nHD 8850\nHD 8870\nHD 8890\nHD 8950\nHD 8970\n## HD 7000系列 从Mountain Lion开始支持\nDual AMD FirePro D300\nDual AMD FirePro D500\nDual AMD FirePro D700\nFirePro W5100(FakeID needed)\nFirePro W7000\nFirePro W9000\nHD 7700\nHD 7730\nHD 7750\nHD 7770\nHD 7790\nHD 7850\nHD 7870\nHD 7870 XT\nHD 7950\nHD 7970\nHD 7990","slug":"2022-01-21-2023-amd-gpu","updated":"2023-09-30T02:59:46.512Z","_id":"cln4obyf20023oko0hxdl1nde","comments":1,"layout":"post","photos":[],"link":"","content":"

Navi 20系列 从bigsur开始支持

RX 6600
RX 6600 XT
RX 6800
RX 6800 XT
RX 6900 XT

\n

Navi 10系列 从Catalina开始支持

RX 5500
RX 5500 XT
RX 5600
RX 5600 XT
RX 5700
RX 5700 XT
RX 5700 XT 50周年纪念版
如遇到黑屏,需要boot参数agdpmod=pikera才能正确显示

\n

Vega 20系列 从Mojave开始支持

Radeon VII

\n

Vega 10系列 从High Sierra开始支持

Vega 64 Liquid
Vega 64
Vega 56
Vega Frontier Edition
Radeon Pro WX 9100
Radeon Pro WX 7100
## Polaris架构10和20系列 从Sierra开始支持
400系列:

\n

RX 480
RX 470D
RX 470
RX 460
RX 590
RX 580X
RX 580
RX 570X
RX 570
RX 560X
RX 560
WX 5100
WX 4100
E9550

\n

还有些同Polaris核心的
rx550

\n

R7 / R9系列 从Yosemite开始支持

R9 Fury X
R9 Fury
R9 Nano
R9 390(需要FakeID)
R9 290X / 390X
R9 290/390(需提供FakeID)
R9 280x / 380x(不一定成功)
R9 280/380(需要FakeID)
R9 270X / 370X
R7 270/370(需提供FakeID)
R7 265
R7 260x / 360x
R9 260/360(根据型号可能需要FakeID)
R9 255
R7 250X
R7 250(需提供FakeID)
R7 240(需要FakeID)

\n

HD 8000系列 从Mountain Lion开始支持

HD 8740
HD 8760
HD 8770
HD 8850
HD 8870
HD 8890
HD 8950
HD 8970

\n

HD 7000系列 从Mountain Lion开始支持

Dual AMD FirePro D300
Dual AMD FirePro D500
Dual AMD FirePro D700
FirePro W5100(FakeID needed)
FirePro W7000
FirePro W9000
HD 7700
HD 7730
HD 7750
HD 7770
HD 7790
HD 7850
HD 7870
HD 7870 XT
HD 7950
HD 7970
HD 7990

\n","site":{"data":{}},"excerpt":"","more":"

Navi 20系列 从bigsur开始支持

RX 6600
RX 6600 XT
RX 6800
RX 6800 XT
RX 6900 XT

\n

Navi 10系列 从Catalina开始支持

RX 5500
RX 5500 XT
RX 5600
RX 5600 XT
RX 5700
RX 5700 XT
RX 5700 XT 50周年纪念版
如遇到黑屏,需要boot参数agdpmod=pikera才能正确显示

\n

Vega 20系列 从Mojave开始支持

Radeon VII

\n

Vega 10系列 从High Sierra开始支持

Vega 64 Liquid
Vega 64
Vega 56
Vega Frontier Edition
Radeon Pro WX 9100
Radeon Pro WX 7100
## Polaris架构10和20系列 从Sierra开始支持
400系列:

\n

RX 480
RX 470D
RX 470
RX 460
RX 590
RX 580X
RX 580
RX 570X
RX 570
RX 560X
RX 560
WX 5100
WX 4100
E9550

\n

还有些同Polaris核心的
rx550

\n

R7 / R9系列 从Yosemite开始支持

R9 Fury X
R9 Fury
R9 Nano
R9 390(需要FakeID)
R9 290X / 390X
R9 290/390(需提供FakeID)
R9 280x / 380x(不一定成功)
R9 280/380(需要FakeID)
R9 270X / 370X
R7 270/370(需提供FakeID)
R7 265
R7 260x / 360x
R9 260/360(根据型号可能需要FakeID)
R9 255
R7 250X
R7 250(需提供FakeID)
R7 240(需要FakeID)

\n

HD 8000系列 从Mountain Lion开始支持

HD 8740
HD 8760
HD 8770
HD 8850
HD 8870
HD 8890
HD 8950
HD 8970

\n

HD 7000系列 从Mountain Lion开始支持

Dual AMD FirePro D300
Dual AMD FirePro D500
Dual AMD FirePro D700
FirePro W5100(FakeID needed)
FirePro W7000
FirePro W9000
HD 7700
HD 7730
HD 7750
HD 7770
HD 7790
HD 7850
HD 7870
HD 7870 XT
HD 7950
HD 7970
HD 7990

\n"},{"title":"黑苹果固态避坑指南","published":1,"hideInList":false,"isTop":true,"abbrlink":"36a001e5","date":"2022-04-12T07:51:00.000Z","feature":null,"_content":"\n\n`三星 PM961 / PM981 / PM981a / PM991` 会导致 macOS 无法安装或正常运行\n`三星 983ZET`无法安装 macOS;\n\n2019 年 5 月以前出厂的 `三星 970 EVO Plus` 可能存在和 PM9x1 系列类似的问题,但可以通过在Windows环境升级官方固件解决 macOS 兼容问题;\n\n`镁光 2200S `无法安装或稳定运行 macOS;\n`爱国者 P2000 256GB `无法通过 10.15、11.x、12.x 任何一个版本的正常安装流程,但不排除个例的可能;\nmacOS 不支持使用 Intel 傲腾(Optane Memory)或镁光 3D XPoint 进行加速的笔记本电脑;\n下面的型号是与 macOS IONVMeFamily 兼容性不佳的型号(可能无故卡住或运行不正常)\n`英特尔 600P/660P/760P 系列`\n`金士顿 A2000`:配置 S5Z42105 控制器的版本必须搭配 NVMeFix.kext 1.0.8 及以上,也可能完全无法安装;\n`海力士 PC601/PC611/PC711/BC501`:主要见于联想和戴尔笔记本,部分批次正常部分会卡住;\n`技嘉 GIGABYTE M.2 PCIe SSD(比如 GP-GSM2NE8512GNTD)`\n`威刚剑鱼 ADATA Swordfish 2 TB M.2-2280`\n`海力士 SK Hynix HFS001TD9TNG-L5B0B`\n`海力士 SK Hynix P31`\n`镁光 Micron 2200V MTFDHBA512TCK` -`移速的256G`同样使用的镁光颗粒无法安装;\n`阿斯加特 Asgard AN3+ (STAR1000P)`\n`朗科 Netac NVME SSD 480`\n`西部数据 SN550/570/730/750/850 `都能正常安装和运行 macOS;\n`三星 970EVO/Pro/Plus(升级固件后)`和 `980/980 Pro` 都能正常安装和运行 macOS,但是此系列存在 TRIM 支持问题;\n`海盗船 MP400/MP600 `系列均能正常安装运行 macOS;\n绝大部分常见的 SATA 接口固态盘都能正常安装和运行 macOS;\n不完全支持``` TRIM```(主要影响特定条件下的写入速度,什么是 TRIM?),但安装运行正常的型号:\n`三星 Samsung 950 Pro`\n`三星 Samsung 960 Evo/Pro`\n`三星 Samsung 970 Evo/Pro`\n「重要提示」在 macOS 12.0 及以上版本中,OpenCore 无法再修改 APFS 文件系统的 TRIM 超时数值,部分执行 TRIM 相对较慢的固态硬盘(主要是三星的控制器)将没有足够的时间执行 TRIM 操作。不正确的设置可能导致进入系统缓慢,因此对 macOS TRIM 支持度不佳的硬盘建议将 `SetApfsTrimTimeout `值改成 0 以关闭 TRIM,或 -1 以关闭该功能。此现象在 12.3 及以上的版本中尤其明显。\n完整支持 macOS TRIM 的型号:\n`西部数据 SN5xx/7xx `系列(未完全测试)\n`英睿达 Crucial P1 1TB NVME`(SM2263EN,未完全测试)\n`金典 KingDian S280(SATA)`\n`浦科特 PLEXTOR M5Pro(SATA)`\n`三星 Samsung 850 PRO`(SATA,未完全测试)\n`三星 Samsung 870 EVO`(SATA,未完全测试)","source":"_posts/2022-04-12-ssd.md","raw":"---\ntitle: 黑苹果固态避坑指南\ntags:\n - macos\n - 固态\n - 硬盘\n - samsung\npublished: true\ncategories: 分享\nhideInList: false\nisTop: true\nabbrlink: 36a001e5\ndate: 2022-04-12 15:51:00\nfeature:\n---\n\n\n`三星 PM961 / PM981 / PM981a / PM991` 会导致 macOS 无法安装或正常运行\n`三星 983ZET`无法安装 macOS;\n\n2019 年 5 月以前出厂的 `三星 970 EVO Plus` 可能存在和 PM9x1 系列类似的问题,但可以通过在Windows环境升级官方固件解决 macOS 兼容问题;\n\n`镁光 2200S `无法安装或稳定运行 macOS;\n`爱国者 P2000 256GB `无法通过 10.15、11.x、12.x 任何一个版本的正常安装流程,但不排除个例的可能;\nmacOS 不支持使用 Intel 傲腾(Optane Memory)或镁光 3D XPoint 进行加速的笔记本电脑;\n下面的型号是与 macOS IONVMeFamily 兼容性不佳的型号(可能无故卡住或运行不正常)\n`英特尔 600P/660P/760P 系列`\n`金士顿 A2000`:配置 S5Z42105 控制器的版本必须搭配 NVMeFix.kext 1.0.8 及以上,也可能完全无法安装;\n`海力士 PC601/PC611/PC711/BC501`:主要见于联想和戴尔笔记本,部分批次正常部分会卡住;\n`技嘉 GIGABYTE M.2 PCIe SSD(比如 GP-GSM2NE8512GNTD)`\n`威刚剑鱼 ADATA Swordfish 2 TB M.2-2280`\n`海力士 SK Hynix HFS001TD9TNG-L5B0B`\n`海力士 SK Hynix P31`\n`镁光 Micron 2200V MTFDHBA512TCK` -`移速的256G`同样使用的镁光颗粒无法安装;\n`阿斯加特 Asgard AN3+ (STAR1000P)`\n`朗科 Netac NVME SSD 480`\n`西部数据 SN550/570/730/750/850 `都能正常安装和运行 macOS;\n`三星 970EVO/Pro/Plus(升级固件后)`和 `980/980 Pro` 都能正常安装和运行 macOS,但是此系列存在 TRIM 支持问题;\n`海盗船 MP400/MP600 `系列均能正常安装运行 macOS;\n绝大部分常见的 SATA 接口固态盘都能正常安装和运行 macOS;\n不完全支持``` TRIM```(主要影响特定条件下的写入速度,什么是 TRIM?),但安装运行正常的型号:\n`三星 Samsung 950 Pro`\n`三星 Samsung 960 Evo/Pro`\n`三星 Samsung 970 Evo/Pro`\n「重要提示」在 macOS 12.0 及以上版本中,OpenCore 无法再修改 APFS 文件系统的 TRIM 超时数值,部分执行 TRIM 相对较慢的固态硬盘(主要是三星的控制器)将没有足够的时间执行 TRIM 操作。不正确的设置可能导致进入系统缓慢,因此对 macOS TRIM 支持度不佳的硬盘建议将 `SetApfsTrimTimeout `值改成 0 以关闭 TRIM,或 -1 以关闭该功能。此现象在 12.3 及以上的版本中尤其明显。\n完整支持 macOS TRIM 的型号:\n`西部数据 SN5xx/7xx `系列(未完全测试)\n`英睿达 Crucial P1 1TB NVME`(SM2263EN,未完全测试)\n`金典 KingDian S280(SATA)`\n`浦科特 PLEXTOR M5Pro(SATA)`\n`三星 Samsung 850 PRO`(SATA,未完全测试)\n`三星 Samsung 870 EVO`(SATA,未完全测试)","slug":"2022-04-12-ssd","updated":"2023-09-30T02:59:46.512Z","_id":"cln4obyf30026oko0a5a07rta","comments":1,"layout":"post","photos":[],"link":"","content":"

三星 PM961 / PM981 / PM981a / PM991 会导致 macOS 无法安装或正常运行
三星 983ZET无法安装 macOS;

\n

2019 年 5 月以前出厂的 三星 970 EVO Plus 可能存在和 PM9x1 系列类似的问题,但可以通过在Windows环境升级官方固件解决 macOS 兼容问题;

\n

镁光 2200S 无法安装或稳定运行 macOS;
爱国者 P2000 256GB 无法通过 10.15、11.x、12.x 任何一个版本的正常安装流程,但不排除个例的可能;
macOS 不支持使用 Intel 傲腾(Optane Memory)或镁光 3D XPoint 进行加速的笔记本电脑;
下面的型号是与 macOS IONVMeFamily 兼容性不佳的型号(可能无故卡住或运行不正常)
英特尔 600P/660P/760P 系列
金士顿 A2000:配置 S5Z42105 控制器的版本必须搭配 NVMeFix.kext 1.0.8 及以上,也可能完全无法安装;
海力士 PC601/PC611/PC711/BC501:主要见于联想和戴尔笔记本,部分批次正常部分会卡住;
技嘉 GIGABYTE M.2 PCIe SSD(比如 GP-GSM2NE8512GNTD)
威刚剑鱼 ADATA Swordfish 2 TB M.2-2280
海力士 SK Hynix HFS001TD9TNG-L5B0B
海力士 SK Hynix P31
镁光 Micron 2200V MTFDHBA512TCK -移速的256G同样使用的镁光颗粒无法安装;
阿斯加特 Asgard AN3+ (STAR1000P)
朗科 Netac NVME SSD 480
西部数据 SN550/570/730/750/850 都能正常安装和运行 macOS;
三星 970EVO/Pro/Plus(升级固件后)980/980 Pro 都能正常安装和运行 macOS,但是此系列存在 TRIM 支持问题;
海盗船 MP400/MP600 系列均能正常安装运行 macOS;
绝大部分常见的 SATA 接口固态盘都能正常安装和运行 macOS;
不完全支持 TRIM(主要影响特定条件下的写入速度,什么是 TRIM?),但安装运行正常的型号:
三星 Samsung 950 Pro
三星 Samsung 960 Evo/Pro
三星 Samsung 970 Evo/Pro
「重要提示」在 macOS 12.0 及以上版本中,OpenCore 无法再修改 APFS 文件系统的 TRIM 超时数值,部分执行 TRIM 相对较慢的固态硬盘(主要是三星的控制器)将没有足够的时间执行 TRIM 操作。不正确的设置可能导致进入系统缓慢,因此对 macOS TRIM 支持度不佳的硬盘建议将 SetApfsTrimTimeout 值改成 0 以关闭 TRIM,或 -1 以关闭该功能。此现象在 12.3 及以上的版本中尤其明显。
完整支持 macOS TRIM 的型号:
西部数据 SN5xx/7xx 系列(未完全测试)
英睿达 Crucial P1 1TB NVME(SM2263EN,未完全测试)
金典 KingDian S280(SATA)
浦科特 PLEXTOR M5Pro(SATA)
三星 Samsung 850 PRO(SATA,未完全测试)
三星 Samsung 870 EVO(SATA,未完全测试)

\n","site":{"data":{}},"excerpt":"","more":"

三星 PM961 / PM981 / PM981a / PM991 会导致 macOS 无法安装或正常运行
三星 983ZET无法安装 macOS;

\n

2019 年 5 月以前出厂的 三星 970 EVO Plus 可能存在和 PM9x1 系列类似的问题,但可以通过在Windows环境升级官方固件解决 macOS 兼容问题;

\n

镁光 2200S 无法安装或稳定运行 macOS;
爱国者 P2000 256GB 无法通过 10.15、11.x、12.x 任何一个版本的正常安装流程,但不排除个例的可能;
macOS 不支持使用 Intel 傲腾(Optane Memory)或镁光 3D XPoint 进行加速的笔记本电脑;
下面的型号是与 macOS IONVMeFamily 兼容性不佳的型号(可能无故卡住或运行不正常)
英特尔 600P/660P/760P 系列
金士顿 A2000:配置 S5Z42105 控制器的版本必须搭配 NVMeFix.kext 1.0.8 及以上,也可能完全无法安装;
海力士 PC601/PC611/PC711/BC501:主要见于联想和戴尔笔记本,部分批次正常部分会卡住;
技嘉 GIGABYTE M.2 PCIe SSD(比如 GP-GSM2NE8512GNTD)
威刚剑鱼 ADATA Swordfish 2 TB M.2-2280
海力士 SK Hynix HFS001TD9TNG-L5B0B
海力士 SK Hynix P31
镁光 Micron 2200V MTFDHBA512TCK -移速的256G同样使用的镁光颗粒无法安装;
阿斯加特 Asgard AN3+ (STAR1000P)
朗科 Netac NVME SSD 480
西部数据 SN550/570/730/750/850 都能正常安装和运行 macOS;
三星 970EVO/Pro/Plus(升级固件后)980/980 Pro 都能正常安装和运行 macOS,但是此系列存在 TRIM 支持问题;
海盗船 MP400/MP600 系列均能正常安装运行 macOS;
绝大部分常见的 SATA 接口固态盘都能正常安装和运行 macOS;
不完全支持 TRIM(主要影响特定条件下的写入速度,什么是 TRIM?),但安装运行正常的型号:
三星 Samsung 950 Pro
三星 Samsung 960 Evo/Pro
三星 Samsung 970 Evo/Pro
「重要提示」在 macOS 12.0 及以上版本中,OpenCore 无法再修改 APFS 文件系统的 TRIM 超时数值,部分执行 TRIM 相对较慢的固态硬盘(主要是三星的控制器)将没有足够的时间执行 TRIM 操作。不正确的设置可能导致进入系统缓慢,因此对 macOS TRIM 支持度不佳的硬盘建议将 SetApfsTrimTimeout 值改成 0 以关闭 TRIM,或 -1 以关闭该功能。此现象在 12.3 及以上的版本中尤其明显。
完整支持 macOS TRIM 的型号:
西部数据 SN5xx/7xx 系列(未完全测试)
英睿达 Crucial P1 1TB NVME(SM2263EN,未完全测试)
金典 KingDian S280(SATA)
浦科特 PLEXTOR M5Pro(SATA)
三星 Samsung 850 PRO(SATA,未完全测试)
三星 Samsung 870 EVO(SATA,未完全测试)

\n"},{"title":"NEC VK22T黑苹果OC0.8.0引导macOS12.4","published":1,"hideInList":false,"isTop":false,"abbrlink":"d0290d4f","date":"2022-06-01T00:33:00.000Z","feature":null,"_content":"\n\n# NEC VK22评测\n\n地址请参阅\n\n\nhttps://jkjoy.cn/2021/89f51950.html\n\n\n## OPENCORE引导下载\n\n[nec vk22.zip](https://blogcdn.asbid.cn/2022/06/01/1654043604.zip)\n","source":"_posts/2022-06-01-NEC_VK22T-OC0.8.0-macOS12.4.md","raw":"---\ntitle: NEC VK22T黑苹果OC0.8.0引导macOS12.4\ntags:\n - 黑苹果\n - opencore\n - vk22\n - nec\npublished: true\nhideInList: false\nisTop: false\nabbrlink: d0290d4f\ndate: 2022-06-01 08:33:00\nfeature:\ncategories: 分享\n---\n\n\n# NEC VK22评测\n\n地址请参阅\n\n\nhttps://jkjoy.cn/2021/89f51950.html\n\n\n## OPENCORE引导下载\n\n[nec vk22.zip](https://blogcdn.asbid.cn/2022/06/01/1654043604.zip)\n","slug":"2022-06-01-NEC_VK22T-OC0.8.0-macOS12.4","updated":"2023-09-30T02:59:46.512Z","_id":"cln4obyf30028oko09ts6ekbs","comments":1,"layout":"post","photos":[],"link":"","content":"

NEC VK22评测

地址请参阅

\n

https://jkjoy.cn/2021/89f51950.html

\n

OPENCORE引导下载

nec vk22.zip

\n","site":{"data":{}},"excerpt":"","more":"

NEC VK22评测

地址请参阅

\n

https://jkjoy.cn/2021/89f51950.html

\n

OPENCORE引导下载

nec vk22.zip

\n"},{"abbrlink":"68647b75","date":"2022-07-27T02:39:00.000Z","excerpt":"centos下安装RPM安装包 bash sudo yum localinstall file.rpm ubuntu下安装deb安装包 bash sudo dpkg -i 安装包名称.deb ","published":1,"title":"Linux下本地安装包命令","updated":"2023-04-13T07:32:16.000Z","_content":"## centos下安装RPM安装包\n\n```bash\nsudo yum localinstall file.rpm\n```\n\n## ubuntu下安装deb安装包\n\n```bash\n sudo dpkg -i 安装包名称.deb\n```\n","source":"_posts/2022-07-27-Linux-cms.md","raw":"---\nabbrlink: 68647b75\ncategories: 分享\ndate: '2022-07-27 10:39:00'\nexcerpt: >-\n centos下安装RPM安装包 bash sudo yum localinstall file.rpm ubuntu下安装deb安装包 bash sudo\n dpkg -i 安装包名称.deb \npublished: true\ntags:\n - 命令\n - linux\ntitle: Linux下本地安装包命令\nupdated: 'Thu, 13 Apr 2023 07:32:16 GMT'\n---\n## centos下安装RPM安装包\n\n```bash\nsudo yum localinstall file.rpm\n```\n\n## ubuntu下安装deb安装包\n\n```bash\n sudo dpkg -i 安装包名称.deb\n```\n","slug":"2022-07-27-Linux-cms","_id":"cln4obyf4002boko0c90100qh","comments":1,"layout":"post","photos":[],"link":"","content":"

centos下安装RPM安装包

1
sudo yum localinstall file.rpm
\n\n

ubuntu下安装deb安装包

1
sudo dpkg -i 安装包名称.deb
\n","site":{"data":{}},"more":"

centos下安装RPM安装包

1
sudo yum localinstall file.rpm
\n\n

ubuntu下安装deb安装包

1
sudo dpkg -i 安装包名称.deb
\n"},{"title":"精粤H97i gmaing黑苹果引导","published":1,"hideInList":false,"isTop":false,"abbrlink":"df7a6812","date":"2022-07-22T01:32:00.000Z","feature":null,"_content":"\n\n# 配置\n| 配置 | 型号 |\n| ------------ | ------------ |\n| CPU | I5 5575r |\n| 主板| 精粤H97i| \n| 内存|AMD专用条|\n|硬盘|SATA固态256GB|\n|网卡|bcm943224|\n\n# 引导\n下载地址\n!(论坛)https://bbs.asbid.cn\n","source":"_posts/2022-07-22-H97i_gmaing.md","raw":"---\ntitle: 精粤H97i gmaing黑苹果引导\ntags:\n - 黑苹果\n - 精粤\n - h97i\n - bcm943224\npublished: true\ncategories: 分享\nhideInList: false\nisTop: false\nabbrlink: df7a6812\ndate: 2022-07-22 09:32:00\nfeature:\n---\n\n\n# 配置\n| 配置 | 型号 |\n| ------------ | ------------ |\n| CPU | I5 5575r |\n| 主板| 精粤H97i| \n| 内存|AMD专用条|\n|硬盘|SATA固态256GB|\n|网卡|bcm943224|\n\n# 引导\n下载地址\n!(论坛)https://bbs.asbid.cn\n","slug":"2022-07-22-H97i_gmaing","updated":"2023-09-30T02:59:46.513Z","_id":"cln4obyf4002doko081pe6hp0","comments":1,"layout":"post","photos":[],"link":"","content":"

配置

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
配置型号
CPUI5 5575r
主板精粤H97i
内存AMD专用条
硬盘SATA固态256GB
网卡bcm943224
\n

引导

下载地址
!(论坛)https://bbs.asbid.cn

\n","site":{"data":{}},"excerpt":"","more":"

配置

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
配置型号
CPUI5 5575r
主板精粤H97i
内存AMD专用条
硬盘SATA固态256GB
网卡bcm943224
\n

引导

下载地址
!(论坛)https://bbs.asbid.cn

\n"},{"title":"macOS锁屏时钟fliqlo","published":1,"hideInList":false,"feature":"https://blogcdn.asbid.cn/2022/08/08/1659921276.png","isTop":false,"abbrlink":"342aa622","date":"2022-08-08T01:14:00.000Z","_content":"\n\n一款好看的锁屏时钟\n同时也有Windows版本可以下载\n## 截图\n\n![QQ20220808-091421@2x.png][1]\n## 下载地址\n\n\n \nhttps://pan.asbid.cn/d/123%E7%BD%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/fliqlo171.dmg\n \n\n\n [1]: https://blogcdn.asbid.cn/2022/08/08/1659921276.png","source":"_posts/2022-08-08-macOS-fliqlo.md","raw":"---\ntitle: macOS锁屏时钟fliqlo\ntags:\n - 下载\n - macos\n - fliqlo\npublished: true\ncategories: 分享\nhideInList: false\nfeature: 'https://blogcdn.asbid.cn/2022/08/08/1659921276.png'\nisTop: false\nabbrlink: 342aa622\ndate: 2022-08-08 09:14:00\n---\n\n\n一款好看的锁屏时钟\n同时也有Windows版本可以下载\n## 截图\n\n![QQ20220808-091421@2x.png][1]\n## 下载地址\n\n\n \nhttps://pan.asbid.cn/d/123%E7%BD%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/fliqlo171.dmg\n \n\n\n [1]: https://blogcdn.asbid.cn/2022/08/08/1659921276.png","slug":"2022-08-08-macOS-fliqlo","updated":"2023-09-30T02:59:46.513Z","_id":"cln4obyf5002goko06uq18aps","comments":1,"layout":"post","photos":[],"link":"","content":"

一款好看的锁屏时钟
同时也有Windows版本可以下载

\n

截图

\"QQ20220808-091421@2x.png\"

\n

下载地址

https://pan.asbid.cn/d/123%E7%BD%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/fliqlo171.dmg

\n","site":{"data":{}},"excerpt":"","more":"

一款好看的锁屏时钟
同时也有Windows版本可以下载

\n

截图

\"QQ20220808-091421@2x.png\"

\n

下载地址

https://pan.asbid.cn/d/123%E7%BD%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/fliqlo171.dmg

\n"},{"title":"Typecho插件CommentsByQQ修改版","published":1,"hideInList":false,"isTop":false,"abbrlink":"93a53ee","date":"2022-09-19T06:25:00.000Z","feature":null,"_content":"\n\n## 简介\n\n基于Typecho插件CommentsByQQ修改\n一直想让qq来通知评论消息。毕竟邮箱之类的还是不太方便。\n原作者的插件QQ机器人已经挂了。所以我自己搭建了一个基于go-http的QQ机器人\n由于本人也是菜鸟,没有后续\n\n## 使用\n\n添加qq机器人153985848为好友\n在后台设置中填写接收消息的qq号即可\n\n## 下载地址\n[CommentsByQQ.zip][1]\n\n\n [1]: https://blogcdn.asbid.cn/2022/09/28/1664332031.zip","source":"_posts/2022-09-19-Typecho-CommentsByQQ.md","raw":"---\ntitle: Typecho插件CommentsByQQ修改版\ntags:\n - typecho\n - chajian\n - CommentsByQQ\npublished: true\ncategories: 分享\nhideInList: false\nisTop: false\nabbrlink: 93a53ee\ndate: 2022-09-19 14:25:00\nfeature:\n---\n\n\n## 简介\n\n基于Typecho插件CommentsByQQ修改\n一直想让qq来通知评论消息。毕竟邮箱之类的还是不太方便。\n原作者的插件QQ机器人已经挂了。所以我自己搭建了一个基于go-http的QQ机器人\n由于本人也是菜鸟,没有后续\n\n## 使用\n\n添加qq机器人153985848为好友\n在后台设置中填写接收消息的qq号即可\n\n## 下载地址\n[CommentsByQQ.zip][1]\n\n\n [1]: https://blogcdn.asbid.cn/2022/09/28/1664332031.zip","slug":"2022-09-19-Typecho-CommentsByQQ","updated":"2023-09-30T02:59:46.513Z","_id":"cln4obyf5002ioko0au7d42v6","comments":1,"layout":"post","photos":[],"link":"","content":"

简介

基于Typecho插件CommentsByQQ修改
一直想让qq来通知评论消息。毕竟邮箱之类的还是不太方便。
原作者的插件QQ机器人已经挂了。所以我自己搭建了一个基于go-http的QQ机器人
由于本人也是菜鸟,没有后续

\n

使用

添加qq机器人153985848为好友
在后台设置中填写接收消息的qq号即可

\n

下载地址

CommentsByQQ.zip

\n","site":{"data":{}},"excerpt":"","more":"

简介

基于Typecho插件CommentsByQQ修改
一直想让qq来通知评论消息。毕竟邮箱之类的还是不太方便。
原作者的插件QQ机器人已经挂了。所以我自己搭建了一个基于go-http的QQ机器人
由于本人也是菜鸟,没有后续

\n

使用

添加qq机器人153985848为好友
在后台设置中填写接收消息的qq号即可

\n

下载地址

CommentsByQQ.zip

\n"},{"title":"macOS一键安装homebrew国内镜像","published":1,"hideInList":false,"isTop":false,"abbrlink":"d701f25","date":"2022-07-29T07:33:00.000Z","feature":null,"_content":"\n\n官方给出的一键安装由于墙的原因可能无法安装成功。\n所以找到了一个国内镜像的一键安装脚本\n\n```bash\n/bin/zsh -c \"$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)\"\n```","source":"_posts/2022-07-29-macOS-homebrew.md","raw":"---\ntitle: macOS一键安装homebrew国内镜像\ntags:\n - macos\n - homebrew\npublished: true\nhideInList: false\nisTop: false\nabbrlink: d701f25\ncategories: 分享\ndate: 2022-07-29 15:33:00\nfeature:\n---\n\n\n官方给出的一键安装由于墙的原因可能无法安装成功。\n所以找到了一个国内镜像的一键安装脚本\n\n```bash\n/bin/zsh -c \"$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)\"\n```","slug":"2022-07-29-macOS-homebrew","updated":"2023-09-30T02:59:46.513Z","_id":"cln4obyf6002loko07qa636nw","comments":1,"layout":"post","photos":[],"link":"","content":"

官方给出的一键安装由于墙的原因可能无法安装成功。
所以找到了一个国内镜像的一键安装脚本

\n
1
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
","site":{"data":{}},"excerpt":"","more":"

官方给出的一键安装由于墙的原因可能无法安装成功。
所以找到了一个国内镜像的一键安装脚本

\n
1
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
"},{"title":"华硕b150m-et m2+rx560黑苹果oc0.8.5引导","published":1,"hideInList":false,"feature":"https://blogcdn.asbid.cn/2022/10/21/1666335477.jpg","isTop":false,"abbrlink":"f4d722c5","date":"2022-10-21T06:58:00.000Z","_content":"\n\n## 配置如下\n\ncpu:魔改qhpw 2.2g hz\n主板:华硕b150m-et m2\n内存:8g ddr4 2133mhz\n硬盘:nvme 256gb ssd\n显卡:肥猫家rx560 4gb\n网卡:bcm94360cd\n电源:长城额定300w\n机箱:乔思伯c2黑色\n\n乔思伯这个机箱是个大闷罐,但是显卡功耗低,双烤温度最高75摄氏度\n\n## 截图\n\n![Jietu20221020-144354.jpg][1]\n![Jietu20221021-145738.jpg][2]\n\n## bios设置\n\n关闭 CSM兼容性 \n关闭 VT-D\n关闭 串口\n打开 USB handoff\n关闭 CFG LOCK\n\n## 已驱动\n\n声卡\n网卡\n显卡\n电源管理\n显卡加速\n![Jietu20221021-152807.jpg][3]\n## 引导下载\n [下载地址][4]\n\n\n [1]: https://blogcdn.asbid.cn/2022/10/21/1666335477.jpg\n [2]: https://blogcdn.asbid.cn/2022/10/21/1666335487.jpg\n [3]: https://blogcdn.asbid.cn/2022/10/21/1666337330.jpg\n [4]: https://bbs.dasbid.com/thread/22","source":"_posts/2022-10-21-b150m-et_m2+rx560.md","raw":"---\ntitle: 华硕b150m-et m2+rx560黑苹果oc0.8.5引导\ntags: []\ncategories: 分享\npublished: true\nhideInList: false\nfeature: 'https://blogcdn.asbid.cn/2022/10/21/1666335477.jpg'\nisTop: false\nabbrlink: f4d722c5\ndate: 2022-10-21 14:58:00\n---\n\n\n## 配置如下\n\ncpu:魔改qhpw 2.2g hz\n主板:华硕b150m-et m2\n内存:8g ddr4 2133mhz\n硬盘:nvme 256gb ssd\n显卡:肥猫家rx560 4gb\n网卡:bcm94360cd\n电源:长城额定300w\n机箱:乔思伯c2黑色\n\n乔思伯这个机箱是个大闷罐,但是显卡功耗低,双烤温度最高75摄氏度\n\n## 截图\n\n![Jietu20221020-144354.jpg][1]\n![Jietu20221021-145738.jpg][2]\n\n## bios设置\n\n关闭 CSM兼容性 \n关闭 VT-D\n关闭 串口\n打开 USB handoff\n关闭 CFG LOCK\n\n## 已驱动\n\n声卡\n网卡\n显卡\n电源管理\n显卡加速\n![Jietu20221021-152807.jpg][3]\n## 引导下载\n [下载地址][4]\n\n\n [1]: https://blogcdn.asbid.cn/2022/10/21/1666335477.jpg\n [2]: https://blogcdn.asbid.cn/2022/10/21/1666335487.jpg\n [3]: https://blogcdn.asbid.cn/2022/10/21/1666337330.jpg\n [4]: https://bbs.dasbid.com/thread/22","slug":"2022-10-21-b150m-et_m2+rx560","updated":"2023-09-30T02:59:46.514Z","_id":"cln4obyf6002ooko07fxmbgky","comments":1,"layout":"post","photos":[],"link":"","content":"

配置如下

cpu:魔改qhpw 2.2g hz
主板:华硕b150m-et m2
内存:8g ddr4 2133mhz
硬盘:nvme 256gb ssd
显卡:肥猫家rx560 4gb
网卡:bcm94360cd
电源:长城额定300w
机箱:乔思伯c2黑色

\n

乔思伯这个机箱是个大闷罐,但是显卡功耗低,双烤温度最高75摄氏度

\n

截图

\"Jietu20221020-144354.jpg\"
\"Jietu20221021-145738.jpg\"

\n

bios设置

关闭 CSM兼容性
关闭 VT-D
关闭 串口
打开 USB handoff
关闭 CFG LOCK

\n

已驱动

声卡
网卡
显卡
电源管理
显卡加速
\"Jietu20221021-152807.jpg\"

\n

引导下载

下载地址

\n","site":{"data":{}},"excerpt":"","more":"

配置如下

cpu:魔改qhpw 2.2g hz
主板:华硕b150m-et m2
内存:8g ddr4 2133mhz
硬盘:nvme 256gb ssd
显卡:肥猫家rx560 4gb
网卡:bcm94360cd
电源:长城额定300w
机箱:乔思伯c2黑色

\n

乔思伯这个机箱是个大闷罐,但是显卡功耗低,双烤温度最高75摄氏度

\n

截图

\"Jietu20221020-144354.jpg\"
\"Jietu20221021-145738.jpg\"

\n

bios设置

关闭 CSM兼容性
关闭 VT-D
关闭 串口
打开 USB handoff
关闭 CFG LOCK

\n

已驱动

声卡
网卡
显卡
电源管理
显卡加速
\"Jietu20221021-152807.jpg\"

\n

引导下载

下载地址

\n"},{"title":"office2016 Mac 版本下载安装及破解激活","published":1,"hideInList":false,"abbrlink":"1387fd73","date":"2022-10-14T00:25:18.000Z","feature":null,"_content":"\n\n一、安装包下载地址\n\nhttp://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft_Office_2016_15.29.16120900_Installer.pkg\n\n二、激活工具\n\n\n\n链接: https://pan.baidu.com/s/1ragcr1M\n\n密码: rcb2\n\n","source":"_posts/2022-10-14-office2016_Mac_.md","raw":"---\ntitle: office2016 Mac 版本下载安装及破解激活\ntags:\n - office\npublished: true\nhideInList: false\ncategories: 分享\nabbrlink: 1387fd73\ndate: 2022-10-14 08:25:18\nfeature:\n---\n\n\n一、安装包下载地址\n\nhttp://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft_Office_2016_15.29.16120900_Installer.pkg\n\n二、激活工具\n\n\n\n链接: https://pan.baidu.com/s/1ragcr1M\n\n密码: rcb2\n\n","slug":"2022-10-14-office2016_Mac_","updated":"2023-09-30T02:59:46.513Z","_id":"cln4obyf7002roko0gjnt49x5","comments":1,"layout":"post","photos":[],"link":"","content":"

一、安装包下载地址

\n

http://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft_Office_2016_15.29.16120900_Installer.pkg

\n

二、激活工具

\n

链接: https://pan.baidu.com/s/1ragcr1M

\n

密码: rcb2

\n","site":{"data":{}},"excerpt":"","more":"

一、安装包下载地址

\n

http://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft_Office_2016_15.29.16120900_Installer.pkg

\n

二、激活工具

\n

链接: https://pan.baidu.com/s/1ragcr1M

\n

密码: rcb2

\n"},{"title":"NEC VK23T对比体验VK22T","published":1,"hideInList":false,"isTop":false,"abbrlink":"ee234ca2","date":"2022-11-08T06:02:00.000Z","feature":null,"_content":"\n\n由于之前的nec vk22被我折腾坏了。剩下了个充电器,于是在闲鱼上又转悠了半年。买了这台vk23。属实是为了一颗蒜,做了一顿饺子。\n一样的是日本走私货。\n相同点a面贴了贴纸。c面日本文键盘。\n不同点体现在屏幕,vk23是一块分辨率为720p的TN屏。比VK22的2KIPS差远了。\nVK23的内存是可以更换的,但是只有一个内存插槽。这点比vk22稍微好那么一点。有3个usb一个HDMI一个minidp一个读卡器。而且有一个摄像头。重量比vk22重一丢丢。尺寸也只有12.5英寸。用来打字上网办公还是绰绰有余的。\n我买的这款是i3 6100U低压U比i5的主频少了一点,且不能睿频。\n但是相比5200U来说已经很不错了。这个miniDP可以输出4K60HZ也是相当不错的。\n笔记本内部有一个m2插槽,支持2242的nvme协议固态硬盘,且只能支持2个缺口的半速m2硬盘。还有一个2.5寸硬盘位。相对来说也是够用了。无线网卡是intel的8260.可以更换,所以我换了更适合黑苹果的dw1560.\n没错,拿到笔记本还是要黑苹果的。\n关于黑苹果就下文再写了。\n\n ","source":"_posts/2022-11-08-NEC_VK23T-vs-VK22T.md","raw":"---\ntitle: NEC VK23T对比体验VK22T\ntags:\n - nec\n - vk23\n - 测评\ncategories: 分享 \npublished: true\nhideInList: false\nisTop: false\nabbrlink: ee234ca2\ndate: 2022-11-08 14:02:00\nfeature:\n---\n\n\n由于之前的nec vk22被我折腾坏了。剩下了个充电器,于是在闲鱼上又转悠了半年。买了这台vk23。属实是为了一颗蒜,做了一顿饺子。\n一样的是日本走私货。\n相同点a面贴了贴纸。c面日本文键盘。\n不同点体现在屏幕,vk23是一块分辨率为720p的TN屏。比VK22的2KIPS差远了。\nVK23的内存是可以更换的,但是只有一个内存插槽。这点比vk22稍微好那么一点。有3个usb一个HDMI一个minidp一个读卡器。而且有一个摄像头。重量比vk22重一丢丢。尺寸也只有12.5英寸。用来打字上网办公还是绰绰有余的。\n我买的这款是i3 6100U低压U比i5的主频少了一点,且不能睿频。\n但是相比5200U来说已经很不错了。这个miniDP可以输出4K60HZ也是相当不错的。\n笔记本内部有一个m2插槽,支持2242的nvme协议固态硬盘,且只能支持2个缺口的半速m2硬盘。还有一个2.5寸硬盘位。相对来说也是够用了。无线网卡是intel的8260.可以更换,所以我换了更适合黑苹果的dw1560.\n没错,拿到笔记本还是要黑苹果的。\n关于黑苹果就下文再写了。\n\n ","slug":"2022-11-08-NEC_VK23T-vs-VK22T","updated":"2023-09-30T02:59:46.514Z","_id":"cln4obyf7002voko07ln09w8r","comments":1,"layout":"post","photos":[],"link":"","content":"

由于之前的nec vk22被我折腾坏了。剩下了个充电器,于是在闲鱼上又转悠了半年。买了这台vk23。属实是为了一颗蒜,做了一顿饺子。
一样的是日本走私货。
相同点a面贴了贴纸。c面日本文键盘。
不同点体现在屏幕,vk23是一块分辨率为720p的TN屏。比VK22的2KIPS差远了。
VK23的内存是可以更换的,但是只有一个内存插槽。这点比vk22稍微好那么一点。有3个usb一个HDMI一个minidp一个读卡器。而且有一个摄像头。重量比vk22重一丢丢。尺寸也只有12.5英寸。用来打字上网办公还是绰绰有余的。
我买的这款是i3 6100U低压U比i5的主频少了一点,且不能睿频。
但是相比5200U来说已经很不错了。这个miniDP可以输出4K60HZ也是相当不错的。
笔记本内部有一个m2插槽,支持2242的nvme协议固态硬盘,且只能支持2个缺口的半速m2硬盘。还有一个2.5寸硬盘位。相对来说也是够用了。无线网卡是intel的8260.可以更换,所以我换了更适合黑苹果的dw1560.
没错,拿到笔记本还是要黑苹果的。
关于黑苹果就下文再写了。

\n","site":{"data":{}},"excerpt":"","more":"

由于之前的nec vk22被我折腾坏了。剩下了个充电器,于是在闲鱼上又转悠了半年。买了这台vk23。属实是为了一颗蒜,做了一顿饺子。
一样的是日本走私货。
相同点a面贴了贴纸。c面日本文键盘。
不同点体现在屏幕,vk23是一块分辨率为720p的TN屏。比VK22的2KIPS差远了。
VK23的内存是可以更换的,但是只有一个内存插槽。这点比vk22稍微好那么一点。有3个usb一个HDMI一个minidp一个读卡器。而且有一个摄像头。重量比vk22重一丢丢。尺寸也只有12.5英寸。用来打字上网办公还是绰绰有余的。
我买的这款是i3 6100U低压U比i5的主频少了一点,且不能睿频。
但是相比5200U来说已经很不错了。这个miniDP可以输出4K60HZ也是相当不错的。
笔记本内部有一个m2插槽,支持2242的nvme协议固态硬盘,且只能支持2个缺口的半速m2硬盘。还有一个2.5寸硬盘位。相对来说也是够用了。无线网卡是intel的8260.可以更换,所以我换了更适合黑苹果的dw1560.
没错,拿到笔记本还是要黑苹果的。
关于黑苹果就下文再写了。

\n"},{"title":"VK23黑苹果OpenCore0.8.5引导macOS12.6.1","published":1,"hideInList":false,"feature":"https://blogcdn.asbid.cn/2022/11/08/1667888431.png","isTop":false,"abbrlink":"e61e410b","date":"2022-11-08T06:23:36.000Z","_content":"\n\n## 配置\n网卡更换为DW1560\n\n## 截图\n![1.png][1]\n![QQ20221108-141421.png][2]\n![QQ20221108-141440.png][3]\n![QQ20221108-141449.png][4]\n![QQ20221108-141458.png][5]\n![QQ20221108-141507.png][6]\n![QQ20221108-141517.png][7]\n##\n正常工作\n1.显卡\n2.声卡\n3.有线网卡\n4.无线网卡\n5.摄像头\n6.读卡器\n7.蓝牙\n8.隔空投送\n\n [1]: https://blogcdn.asbid.cn/2022/11/08/1667888431.png\n [2]: https://blogcdn.asbid.cn/2022/11/08/1667888431.png\n [3]: https://blogcdn.asbid.cn/2022/11/08/1667888432.png\n [4]: https://blogcdn.asbid.cn/2022/11/08/1667888433.png\n [5]: https://blogcdn.asbid.cn/2022/11/08/1667888433.png\n [6]: https://blogcdn.asbid.cn/2022/11/08/1667888434.png\n [7]: https://blogcdn.asbid.cn/2022/11/08/1667888434.png","source":"_posts/2022-11-08-VK23-OpenCore0.8.5.md","raw":"---\ntitle: VK23黑苹果OpenCore0.8.5引导macOS12.6.1\ntags: []\npublished: true\nhideInList: false\nfeature: 'https://blogcdn.asbid.cn/2022/11/08/1667888431.png'\nisTop: false\nabbrlink: e61e410b\ndate: 2022-11-08 14:23:36\ncategories: 分享\n---\n\n\n## 配置\n网卡更换为DW1560\n\n## 截图\n![1.png][1]\n![QQ20221108-141421.png][2]\n![QQ20221108-141440.png][3]\n![QQ20221108-141449.png][4]\n![QQ20221108-141458.png][5]\n![QQ20221108-141507.png][6]\n![QQ20221108-141517.png][7]\n##\n正常工作\n1.显卡\n2.声卡\n3.有线网卡\n4.无线网卡\n5.摄像头\n6.读卡器\n7.蓝牙\n8.隔空投送\n\n [1]: https://blogcdn.asbid.cn/2022/11/08/1667888431.png\n [2]: https://blogcdn.asbid.cn/2022/11/08/1667888431.png\n [3]: https://blogcdn.asbid.cn/2022/11/08/1667888432.png\n [4]: https://blogcdn.asbid.cn/2022/11/08/1667888433.png\n [5]: https://blogcdn.asbid.cn/2022/11/08/1667888433.png\n [6]: https://blogcdn.asbid.cn/2022/11/08/1667888434.png\n [7]: https://blogcdn.asbid.cn/2022/11/08/1667888434.png","slug":"2022-11-08-VK23-OpenCore0.8.5","updated":"2023-09-30T02:59:46.514Z","_id":"cln4obyf8002yoko0h5w9fg2u","comments":1,"layout":"post","photos":[],"link":"","content":"

配置

网卡更换为DW1560

\n

截图

\"1.png\"
\"QQ20221108-141421.png\"
\"QQ20221108-141440.png\"
\"QQ20221108-141449.png\"
\"QQ20221108-141458.png\"
\"QQ20221108-141507.png\"
\"QQ20221108-141517.png\"
##
正常工作
1.显卡
2.声卡
3.有线网卡
4.无线网卡
5.摄像头
6.读卡器
7.蓝牙
8.隔空投送

\n","site":{"data":{}},"excerpt":"","more":"

配置

网卡更换为DW1560

\n

截图

\"1.png\"
\"QQ20221108-141421.png\"
\"QQ20221108-141440.png\"
\"QQ20221108-141449.png\"
\"QQ20221108-141458.png\"
\"QQ20221108-141507.png\"
\"QQ20221108-141517.png\"
##
正常工作
1.显卡
2.声卡
3.有线网卡
4.无线网卡
5.摄像头
6.读卡器
7.蓝牙
8.隔空投送

\n"},{"title":"2022年12月8日终于全国防疫放开管控了","excerpt":"","abbrlink":2091,"date":"2022-12-08T02:23:38.000Z","_content":"\n坚持了三年的疫情,终于在昨天放开管控了。 这意味着疫情的危害已然不如爆发之初的恐怖杀伤力了。 但是这一切不能不防。 很多阳过的朋友在网络上分享自己的心得。 各种囤积的必备药物。 还有被阳性包围保持阴性的必胜法宝。那就是口罩。 如果不想被阳,带口罩还是非常有必要的。\n\n这一次终于我可以到处溜达了。","source":"_posts/2022年12月8日终于全国防疫放开管控了.md","raw":"---\ntitle: 2022年12月8日终于全国防疫放开管控了\ntags:\n - 生活\n - 疫情\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 2091\ndate: 2022-12-08 10:23:38\n---\n\n坚持了三年的疫情,终于在昨天放开管控了。 这意味着疫情的危害已然不如爆发之初的恐怖杀伤力了。 但是这一切不能不防。 很多阳过的朋友在网络上分享自己的心得。 各种囤积的必备药物。 还有被阳性包围保持阴性的必胜法宝。那就是口罩。 如果不想被阳,带口罩还是非常有必要的。\n\n这一次终于我可以到处溜达了。","slug":"2022年12月8日终于全国防疫放开管控了","published":1,"updated":"2023-09-30T02:59:46.514Z","_id":"cln4obyf90032oko03ow66itc","comments":1,"layout":"post","photos":[],"link":"","content":"

坚持了三年的疫情,终于在昨天放开管控了。 这意味着疫情的危害已然不如爆发之初的恐怖杀伤力了。 但是这一切不能不防。 很多阳过的朋友在网络上分享自己的心得。 各种囤积的必备药物。 还有被阳性包围保持阴性的必胜法宝。那就是口罩。 如果不想被阳,带口罩还是非常有必要的。

\n\n

这一次终于我可以到处溜达了。

\n","site":{"data":{}},"more":"

坚持了三年的疫情,终于在昨天放开管控了。 这意味着疫情的危害已然不如爆发之初的恐怖杀伤力了。 但是这一切不能不防。 很多阳过的朋友在网络上分享自己的心得。 各种囤积的必备药物。 还有被阳性包围保持阴性的必胜法宝。那就是口罩。 如果不想被阳,带口罩还是非常有必要的。

\n\n

这一次终于我可以到处溜达了。

\n"},{"title":"macOS与Windows双系统时间不同步的解决办法","published":1,"hideInList":false,"isTop":false,"abbrlink":"88405098","date":"2022-11-15T05:07:00.000Z","feature":null,"_content":"\n\n在windows下\n右键点击开始菜单,选择终端(管理员)\n\n \n Reg add HKLM\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1\n\n回车搞定!重启试试!\n","source":"_posts/2022-11-15-macOS-Windows-time.md","raw":"---\ntitle: macOS与Windows双系统时间不同步的解决办法\ntags:\n - macos\n - 时间同步\n - windows\npublished: true\nhideInList: false\nisTop: false\nabbrlink: '88405098'\ndate: 2022-11-15 13:07:00\nfeature:\ncategories: 分享\n---\n\n\n在windows下\n右键点击开始菜单,选择终端(管理员)\n\n \n Reg add HKLM\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1\n\n回车搞定!重启试试!\n","slug":"2022-11-15-macOS-Windows-time","updated":"2023-09-30T02:59:46.514Z","_id":"cln4obyfa0034oko0b2okccuw","comments":1,"layout":"post","photos":[],"link":"","content":"

在windows下
右键点击开始菜单,选择终端(管理员)

\n
Reg add HKLM\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1\n
\n

回车搞定!重启试试!

\n","site":{"data":{}},"excerpt":"","more":"

在windows下
右键点击开始菜单,选择终端(管理员)

\n
Reg add HKLM\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1\n
\n

回车搞定!重启试试!

\n"},{"title":"2023国内注册ChatGPT的方法","published":1,"hideInList":false,"feature":"https://www.pythonthree.com/wp-content/uploads/2023/02/1676440083-%E4%BD%BF%E7%94%A8ChatGPT%E7%A4%BA%E4%BE%8B.png","isTop":false,"abbrlink":"156e4c13","date":"2023-04-07T00:34:41.000Z","_content":"#### 国内注册ChatGPT的方法\n\n \n`ChatGPT` 是由 `OpenAI `开发的一个人工智能聊天机器人程序,于 2022 年 11 月推出,基于 GPT-3.5 架构的大型语言模型并通过强化学习进行训练,在这款软件中用户们可以与 AI 人工智能进行多种的对话工作,目前,有部分地区(例如`中国大陆`、`香港`)无法使用此项服务 \n\n\n``ChatGPT``技术开发商``OpenAI``斥巨资买下``AI.com``域名,现在访问[AI.com](https://ai.com)直接跳转到ChatGPT官网。 \n\n\n\n#### ChatGPT功能\n\n- ChatGPT 在搜索和写作上非常强大。\n- ChatGPT 可以根据用户提供的信息,给出合理而有效的搜索结果,\n- ChatGPT 写的短篇小说,\n- ChatGPT 写的信件,内容通畅,用词准确。\n- ChatGPT 撰写专业的电子邮件回复\n- ChatGPT 为营销活动产生新的内容创意\n- ChatGPT 解决任何编码问题或为获取代码\n\n\n\n#### 国内用户注册ChatGPT的方法\n\n 国内用户想要注册 ChatGPT,首先需要有一个**网络环境**,例如``美国``;然后,需要一个可以接收短信验证码的手机号码,之后就可以打开 ChatGPT 的网站**注册 ,邮件验证,电话号码验证**等等。\n\n **如果出现如下的界面,则证明你的网络所在地区无法注册访问ChatGPT。**\n\n``注意:``如果无法搞定上述必要条件的话,可以尝试\n搭建一个梯子 [x-ui:支持多协议多用户的 xray 面板](https://www.sunpeiwen.com/archives/396.html) \n\n##### 注册 OpenAI 账号\n\n 1、点击打开 [https://chat.openai.com/auth/login](https://chat.openai.com/auth/login) 页面中的 ``` Sign up ```进行相应的账号注册(注意网络环境不能是``香港``,``澳门``等地区,不然会提示不能在当前国家服务)。\n\n![注册](https://www.pythonthree.com/wp-content/uploads/2023/02/1676427587-%E6%B3%A8%E5%86%8COpenAI%E8%B4%A6%E5%8F%B7.png) \n2、在新的页面可选择注册 `ChatGPT` 账号的方式,可以使用邮箱(国内邮箱也可以,建议使用国外邮箱),,或者有谷歌账号的邮箱,或者用 Microsoft Account 注册也可以。\n\n![选择创建ChatGPT账号的方式](https://www.pythonthree.com/wp-content/uploads/2023/02/1676427844-%E9%80%89%E6%8B%A9%E5%88%9B%E5%BB%BAChatGPT%E8%B4%A6%E5%8F%B7%E7%9A%84%E6%96%B9%E5%BC%8F.png)\n**使用邮箱注册ChatGPT时**,输入邮箱地址,点击``` Continue ```,之后输入密码,进入下一步骤。\n\n![使用邮箱注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428115-%E4%BD%BF%E7%94%A8%E9%82%AE%E7%AE%B1%E6%B3%A8%E5%86%8CChatGPT.png )\n**使用 Microsoft Account 注册ChatGPT时**,可以使用Microsoft账号登录,如果有Github账号的话,可点击`登录选项`,然后选择使用Github账号 注册。\n\n![使用Microsoft-Account注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428134-%E4%BD%BF%E7%94%A8Microsoft-Account%E6%B3%A8%E5%86%8CChatGPT.png)\n**使用 Google 账号注册ChatGPT时**,输入Google账号地址及密码,然后进入下一步骤。\n\n![使用Google账号注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428153-%E4%BD%BF%E7%94%A8Google%E8%B4%A6%E5%8F%B7%E6%B3%A8%E5%86%8CChatGPT.png)\n3、以**使用邮箱注册ChatGPT**为例,输入邮箱需要在邮箱收到的邮件内点击验证,\n\n![验证ChatGPT邮箱](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431622-%E9%AA%8C%E8%AF%81ChatGPT%E9%82%AE%E7%AE%B1.png )\n4、然后继续在ChatGPT注册页面填入信息\n\n![在ChatGPT注册页面填入信息](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431710-%E5%9C%A8ChatGPT%E6%B3%A8%E5%86%8C%E9%A1%B5%E9%9D%A2%E5%A1%AB%E5%85%A5%E4%BF%A1%E6%81%AF.png) \n5、填写ChatGPT手机短信验证码\n\n![填写ChatGPT手机短信验证码](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431788-%E5%A1%AB%E5%86%99ChatGPT%E6%89%8B%E6%9C%BA%E7%9F%AD%E4%BF%A1%E9%AA%8C%E8%AF%81%E7%A0%81.png)\n\n\n##### 接收手机短信验证码\n\n 需要使用中国以外的手机号码进行验证,例如美国、印度等,可以在俄罗斯的接码平台```sms-activate```来完成,该网站支持中文/英文显示界面,支持支付宝,使用俄罗斯卢布计费。\n\n 1、现在就需要用到注册的第三方接码平台了,访问[ ](https://sms-activate.org/?ref=5366293)[https://sms-activate.org/](https://sms-activate.org/?ref=5366293)。\n\n![注册的第三方接码平台了](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432063-%E6%B3%A8%E5%86%8C%E7%9A%84%E7%AC%AC%E4%B8%89%E6%96%B9%E6%8E%A5%E7%A0%81%E5%B9%B3%E5%8F%B0%E4%BA%86.png) \n\n2、注册完成后需要充值(按照 1 美元兑换 73 卢布),点击右上角**“ 余额充值 ”**,使用支付宝充值 1 美元即可**(sms-activate.org平台规则发生变化,少于10美元充值,需最低充值2美元<2023.3.22>)**。\n\n![注册完成后需要充值](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432200-%E6%B3%A8%E5%86%8C%E5%AE%8C%E6%88%90%E5%90%8E%E9%9C%80%E8%A6%81%E5%85%85%E5%80%BC.png )\n3、在平台左侧搜索 OpenAI ,然后在国家那里找到Indonesia(印度尼西亚),点击选择国家后面的加入购物车即可。\n\n![选择国家](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432316-1676429348918.png) \n4、然后等一会出现如下界面,这里的手机号拷贝出来,输入到上一步中注册OpenAI的界面上,然后点击 Send code按钮,**在下图的界面中等待验证码短信发送**。\n\n![接收输入验证码](https://www.pythonthree.com/wp-content/uploads/2023/02/1676433066-%E6%8E%A5%E6%94%B6%E8%BE%93%E5%85%A5%E9%AA%8C%E8%AF%81%E7%A0%81.jpg) \n```注意:```有效期是20分钟,需要快速操作,若两三分钟没有收到短信验证码,可点击旁边的删除按钮,然后再次选择别的手机号码,未收到验证不扣费。\n\n \n \n\n#### 使用ChatGPT\n\n 账号注册完成了,就可以尽情的使用ChatGPT来玩耍了,重新登录ChatGPT官网,然后[访问Chat](https://chat.openai.com),这时你就可以开始尽情和机器人聊天了。\n\n![使用ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676433542-%E4%BD%BF%E7%94%A8ChatGPT.png)\n\n使用ChatGPT示例,如何写一个吸引人的 标题\n\n![使用ChatGPT示例](https://www.pythonthree.com/wp-content/uploads/2023/02/1676440083-%E4%BD%BF%E7%94%A8ChatGPT%E7%A4%BA%E4%BE%8B.png)\n\n#### 总结\n\n 以上是为你介绍的国内注册 ChatGPT 的方法,希望对你了解 ChatGPT 有所帮助,如有问题,欢迎联系我们。\n\n\n","source":"_posts/2023-guo-nei-zhu-ce-chatgpt-de-fang-fa.md","raw":"---\ntitle: 2023国内注册ChatGPT的方法\ntags:\n - chatgpt\n - 注册\n - 教程\npublished: true\nhideInList: false\nfeature: >-\n https://www.pythonthree.com/wp-content/uploads/2023/02/1676440083-%E4%BD%BF%E7%94%A8ChatGPT%E7%A4%BA%E4%BE%8B.png\nisTop: false\nabbrlink: 156e4c13\ndate: 2023-04-07 08:34:41\ncategories: 分享\n---\n#### 国内注册ChatGPT的方法\n\n \n`ChatGPT` 是由 `OpenAI `开发的一个人工智能聊天机器人程序,于 2022 年 11 月推出,基于 GPT-3.5 架构的大型语言模型并通过强化学习进行训练,在这款软件中用户们可以与 AI 人工智能进行多种的对话工作,目前,有部分地区(例如`中国大陆`、`香港`)无法使用此项服务 \n\n\n``ChatGPT``技术开发商``OpenAI``斥巨资买下``AI.com``域名,现在访问[AI.com](https://ai.com)直接跳转到ChatGPT官网。 \n\n\n\n#### ChatGPT功能\n\n- ChatGPT 在搜索和写作上非常强大。\n- ChatGPT 可以根据用户提供的信息,给出合理而有效的搜索结果,\n- ChatGPT 写的短篇小说,\n- ChatGPT 写的信件,内容通畅,用词准确。\n- ChatGPT 撰写专业的电子邮件回复\n- ChatGPT 为营销活动产生新的内容创意\n- ChatGPT 解决任何编码问题或为获取代码\n\n\n\n#### 国内用户注册ChatGPT的方法\n\n 国内用户想要注册 ChatGPT,首先需要有一个**网络环境**,例如``美国``;然后,需要一个可以接收短信验证码的手机号码,之后就可以打开 ChatGPT 的网站**注册 ,邮件验证,电话号码验证**等等。\n\n **如果出现如下的界面,则证明你的网络所在地区无法注册访问ChatGPT。**\n\n``注意:``如果无法搞定上述必要条件的话,可以尝试\n搭建一个梯子 [x-ui:支持多协议多用户的 xray 面板](https://www.sunpeiwen.com/archives/396.html) \n\n##### 注册 OpenAI 账号\n\n 1、点击打开 [https://chat.openai.com/auth/login](https://chat.openai.com/auth/login) 页面中的 ``` Sign up ```进行相应的账号注册(注意网络环境不能是``香港``,``澳门``等地区,不然会提示不能在当前国家服务)。\n\n![注册](https://www.pythonthree.com/wp-content/uploads/2023/02/1676427587-%E6%B3%A8%E5%86%8COpenAI%E8%B4%A6%E5%8F%B7.png) \n2、在新的页面可选择注册 `ChatGPT` 账号的方式,可以使用邮箱(国内邮箱也可以,建议使用国外邮箱),,或者有谷歌账号的邮箱,或者用 Microsoft Account 注册也可以。\n\n![选择创建ChatGPT账号的方式](https://www.pythonthree.com/wp-content/uploads/2023/02/1676427844-%E9%80%89%E6%8B%A9%E5%88%9B%E5%BB%BAChatGPT%E8%B4%A6%E5%8F%B7%E7%9A%84%E6%96%B9%E5%BC%8F.png)\n**使用邮箱注册ChatGPT时**,输入邮箱地址,点击``` Continue ```,之后输入密码,进入下一步骤。\n\n![使用邮箱注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428115-%E4%BD%BF%E7%94%A8%E9%82%AE%E7%AE%B1%E6%B3%A8%E5%86%8CChatGPT.png )\n**使用 Microsoft Account 注册ChatGPT时**,可以使用Microsoft账号登录,如果有Github账号的话,可点击`登录选项`,然后选择使用Github账号 注册。\n\n![使用Microsoft-Account注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428134-%E4%BD%BF%E7%94%A8Microsoft-Account%E6%B3%A8%E5%86%8CChatGPT.png)\n**使用 Google 账号注册ChatGPT时**,输入Google账号地址及密码,然后进入下一步骤。\n\n![使用Google账号注册ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676428153-%E4%BD%BF%E7%94%A8Google%E8%B4%A6%E5%8F%B7%E6%B3%A8%E5%86%8CChatGPT.png)\n3、以**使用邮箱注册ChatGPT**为例,输入邮箱需要在邮箱收到的邮件内点击验证,\n\n![验证ChatGPT邮箱](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431622-%E9%AA%8C%E8%AF%81ChatGPT%E9%82%AE%E7%AE%B1.png )\n4、然后继续在ChatGPT注册页面填入信息\n\n![在ChatGPT注册页面填入信息](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431710-%E5%9C%A8ChatGPT%E6%B3%A8%E5%86%8C%E9%A1%B5%E9%9D%A2%E5%A1%AB%E5%85%A5%E4%BF%A1%E6%81%AF.png) \n5、填写ChatGPT手机短信验证码\n\n![填写ChatGPT手机短信验证码](https://www.pythonthree.com/wp-content/uploads/2023/02/1676431788-%E5%A1%AB%E5%86%99ChatGPT%E6%89%8B%E6%9C%BA%E7%9F%AD%E4%BF%A1%E9%AA%8C%E8%AF%81%E7%A0%81.png)\n\n\n##### 接收手机短信验证码\n\n 需要使用中国以外的手机号码进行验证,例如美国、印度等,可以在俄罗斯的接码平台```sms-activate```来完成,该网站支持中文/英文显示界面,支持支付宝,使用俄罗斯卢布计费。\n\n 1、现在就需要用到注册的第三方接码平台了,访问[ ](https://sms-activate.org/?ref=5366293)[https://sms-activate.org/](https://sms-activate.org/?ref=5366293)。\n\n![注册的第三方接码平台了](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432063-%E6%B3%A8%E5%86%8C%E7%9A%84%E7%AC%AC%E4%B8%89%E6%96%B9%E6%8E%A5%E7%A0%81%E5%B9%B3%E5%8F%B0%E4%BA%86.png) \n\n2、注册完成后需要充值(按照 1 美元兑换 73 卢布),点击右上角**“ 余额充值 ”**,使用支付宝充值 1 美元即可**(sms-activate.org平台规则发生变化,少于10美元充值,需最低充值2美元<2023.3.22>)**。\n\n![注册完成后需要充值](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432200-%E6%B3%A8%E5%86%8C%E5%AE%8C%E6%88%90%E5%90%8E%E9%9C%80%E8%A6%81%E5%85%85%E5%80%BC.png )\n3、在平台左侧搜索 OpenAI ,然后在国家那里找到Indonesia(印度尼西亚),点击选择国家后面的加入购物车即可。\n\n![选择国家](https://www.pythonthree.com/wp-content/uploads/2023/02/1676432316-1676429348918.png) \n4、然后等一会出现如下界面,这里的手机号拷贝出来,输入到上一步中注册OpenAI的界面上,然后点击 Send code按钮,**在下图的界面中等待验证码短信发送**。\n\n![接收输入验证码](https://www.pythonthree.com/wp-content/uploads/2023/02/1676433066-%E6%8E%A5%E6%94%B6%E8%BE%93%E5%85%A5%E9%AA%8C%E8%AF%81%E7%A0%81.jpg) \n```注意:```有效期是20分钟,需要快速操作,若两三分钟没有收到短信验证码,可点击旁边的删除按钮,然后再次选择别的手机号码,未收到验证不扣费。\n\n \n \n\n#### 使用ChatGPT\n\n 账号注册完成了,就可以尽情的使用ChatGPT来玩耍了,重新登录ChatGPT官网,然后[访问Chat](https://chat.openai.com),这时你就可以开始尽情和机器人聊天了。\n\n![使用ChatGPT](https://www.pythonthree.com/wp-content/uploads/2023/02/1676433542-%E4%BD%BF%E7%94%A8ChatGPT.png)\n\n使用ChatGPT示例,如何写一个吸引人的 标题\n\n![使用ChatGPT示例](https://www.pythonthree.com/wp-content/uploads/2023/02/1676440083-%E4%BD%BF%E7%94%A8ChatGPT%E7%A4%BA%E4%BE%8B.png)\n\n#### 总结\n\n 以上是为你介绍的国内注册 ChatGPT 的方法,希望对你了解 ChatGPT 有所帮助,如有问题,欢迎联系我们。\n\n\n","slug":"2023-guo-nei-zhu-ce-chatgpt-de-fang-fa","updated":"2023-09-30T02:59:46.515Z","_id":"cln4obygg00aloko092hr1ozm","comments":1,"layout":"post","photos":[],"link":"","content":"

国内注册ChatGPT的方法

ChatGPT 是由 OpenAI 开发的一个人工智能聊天机器人程序,于 2022 年 11 月推出,基于 GPT-3.5 架构的大型语言模型并通过强化学习进行训练,在这款软件中用户们可以与 AI 人工智能进行多种的对话工作,目前,有部分地区(例如中国大陆香港)无法使用此项服务

\n

ChatGPT技术开发商OpenAI斥巨资买下AI.com域名,现在访问AI.com直接跳转到ChatGPT官网。

\n

ChatGPT功能

    \n
  • ChatGPT 在搜索和写作上非常强大。
  • \n
  • ChatGPT 可以根据用户提供的信息,给出合理而有效的搜索结果,
  • \n
  • ChatGPT 写的短篇小说,
  • \n
  • ChatGPT 写的信件,内容通畅,用词准确。
  • \n
  • ChatGPT 撰写专业的电子邮件回复
  • \n
  • ChatGPT 为营销活动产生新的内容创意
  • \n
  • ChatGPT 解决任何编码问题或为获取代码
  • \n
\n

国内用户注册ChatGPT的方法

国内用户想要注册 ChatGPT,首先需要有一个网络环境,例如美国;然后,需要一个可以接收短信验证码的手机号码,之后就可以打开 ChatGPT 的网站注册 ,邮件验证,电话号码验证等等。

\n

如果出现如下的界面,则证明你的网络所在地区无法注册访问ChatGPT。

\n

注意:如果无法搞定上述必要条件的话,可以尝试
搭建一个梯子 x-ui:支持多协议多用户的 xray 面板

\n
注册 OpenAI 账号

1、点击打开 https://chat.openai.com/auth/login 页面中的 Sign up 进行相应的账号注册(注意网络环境不能是香港澳门等地区,不然会提示不能在当前国家服务)。

\n

\"注册\"
2、在新的页面可选择注册 ChatGPT 账号的方式,可以使用邮箱(国内邮箱也可以,建议使用国外邮箱),,或者有谷歌账号的邮箱,或者用 Microsoft Account 注册也可以。

\n

\"选择创建ChatGPT账号的方式\"
使用邮箱注册ChatGPT时,输入邮箱地址,点击Continue,之后输入密码,进入下一步骤。

\n

\"使用邮箱注册ChatGPT\"
使用 Microsoft Account 注册ChatGPT时,可以使用Microsoft账号登录,如果有Github账号的话,可点击登录选项,然后选择使用Github账号 注册。

\n

\"使用Microsoft-Account注册ChatGPT\"
使用 Google 账号注册ChatGPT时,输入Google账号地址及密码,然后进入下一步骤。

\n

\"使用Google账号注册ChatGPT\"
3、以使用邮箱注册ChatGPT为例,输入邮箱需要在邮箱收到的邮件内点击验证,

\n

\"验证ChatGPT邮箱\"
4、然后继续在ChatGPT注册页面填入信息

\n

\"在ChatGPT注册页面填入信息\"
5、填写ChatGPT手机短信验证码

\n

\"填写ChatGPT手机短信验证码\"

\n
接收手机短信验证码

需要使用中国以外的手机号码进行验证,例如美国、印度等,可以在俄罗斯的接码平台sms-activate来完成,该网站支持中文/英文显示界面,支持支付宝,使用俄罗斯卢布计费。

\n

1、现在就需要用到注册的第三方接码平台了,访问 https://sms-activate.org/

\n

\"注册的第三方接码平台了\"

\n

2、注册完成后需要充值(按照 1 美元兑换 73 卢布),点击右上角“ 余额充值 ”,使用支付宝充值 1 美元即可(sms-activate.org平台规则发生变化,少于10美元充值,需最低充值2美元<2023.3.22>)

\n

\"注册完成后需要充值\"
3、在平台左侧搜索 OpenAI ,然后在国家那里找到Indonesia(印度尼西亚),点击选择国家后面的加入购物车即可。

\n

\"选择国家\"
4、然后等一会出现如下界面,这里的手机号拷贝出来,输入到上一步中注册OpenAI的界面上,然后点击 Send code按钮,在下图的界面中等待验证码短信发送

\n

\"接收输入验证码\"
注意:有效期是20分钟,需要快速操作,若两三分钟没有收到短信验证码,可点击旁边的删除按钮,然后再次选择别的手机号码,未收到验证不扣费。

\n

使用ChatGPT

账号注册完成了,就可以尽情的使用ChatGPT来玩耍了,重新登录ChatGPT官网,然后访问Chat,这时你就可以开始尽情和机器人聊天了。

\n

\"使用ChatGPT\"

\n

使用ChatGPT示例,如何写一个吸引人的 标题

\n

\"使用ChatGPT示例\"

\n

总结

以上是为你介绍的国内注册 ChatGPT 的方法,希望对你了解 ChatGPT 有所帮助,如有问题,欢迎联系我们。

\n","site":{"data":{}},"excerpt":"","more":"

国内注册ChatGPT的方法

ChatGPT 是由 OpenAI 开发的一个人工智能聊天机器人程序,于 2022 年 11 月推出,基于 GPT-3.5 架构的大型语言模型并通过强化学习进行训练,在这款软件中用户们可以与 AI 人工智能进行多种的对话工作,目前,有部分地区(例如中国大陆香港)无法使用此项服务

\n

ChatGPT技术开发商OpenAI斥巨资买下AI.com域名,现在访问AI.com直接跳转到ChatGPT官网。

\n

ChatGPT功能

    \n
  • ChatGPT 在搜索和写作上非常强大。
  • \n
  • ChatGPT 可以根据用户提供的信息,给出合理而有效的搜索结果,
  • \n
  • ChatGPT 写的短篇小说,
  • \n
  • ChatGPT 写的信件,内容通畅,用词准确。
  • \n
  • ChatGPT 撰写专业的电子邮件回复
  • \n
  • ChatGPT 为营销活动产生新的内容创意
  • \n
  • ChatGPT 解决任何编码问题或为获取代码
  • \n
\n

国内用户注册ChatGPT的方法

国内用户想要注册 ChatGPT,首先需要有一个网络环境,例如美国;然后,需要一个可以接收短信验证码的手机号码,之后就可以打开 ChatGPT 的网站注册 ,邮件验证,电话号码验证等等。

\n

如果出现如下的界面,则证明你的网络所在地区无法注册访问ChatGPT。

\n

注意:如果无法搞定上述必要条件的话,可以尝试
搭建一个梯子 x-ui:支持多协议多用户的 xray 面板

\n
注册 OpenAI 账号

1、点击打开 https://chat.openai.com/auth/login 页面中的 Sign up 进行相应的账号注册(注意网络环境不能是香港澳门等地区,不然会提示不能在当前国家服务)。

\n

\"注册\"
2、在新的页面可选择注册 ChatGPT 账号的方式,可以使用邮箱(国内邮箱也可以,建议使用国外邮箱),,或者有谷歌账号的邮箱,或者用 Microsoft Account 注册也可以。

\n

\"选择创建ChatGPT账号的方式\"
使用邮箱注册ChatGPT时,输入邮箱地址,点击Continue,之后输入密码,进入下一步骤。

\n

\"使用邮箱注册ChatGPT\"
使用 Microsoft Account 注册ChatGPT时,可以使用Microsoft账号登录,如果有Github账号的话,可点击登录选项,然后选择使用Github账号 注册。

\n

\"使用Microsoft-Account注册ChatGPT\"
使用 Google 账号注册ChatGPT时,输入Google账号地址及密码,然后进入下一步骤。

\n

\"使用Google账号注册ChatGPT\"
3、以使用邮箱注册ChatGPT为例,输入邮箱需要在邮箱收到的邮件内点击验证,

\n

\"验证ChatGPT邮箱\"
4、然后继续在ChatGPT注册页面填入信息

\n

\"在ChatGPT注册页面填入信息\"
5、填写ChatGPT手机短信验证码

\n

\"填写ChatGPT手机短信验证码\"

\n
接收手机短信验证码

需要使用中国以外的手机号码进行验证,例如美国、印度等,可以在俄罗斯的接码平台sms-activate来完成,该网站支持中文/英文显示界面,支持支付宝,使用俄罗斯卢布计费。

\n

1、现在就需要用到注册的第三方接码平台了,访问 https://sms-activate.org/

\n

\"注册的第三方接码平台了\"

\n

2、注册完成后需要充值(按照 1 美元兑换 73 卢布),点击右上角“ 余额充值 ”,使用支付宝充值 1 美元即可(sms-activate.org平台规则发生变化,少于10美元充值,需最低充值2美元<2023.3.22>)

\n

\"注册完成后需要充值\"
3、在平台左侧搜索 OpenAI ,然后在国家那里找到Indonesia(印度尼西亚),点击选择国家后面的加入购物车即可。

\n

\"选择国家\"
4、然后等一会出现如下界面,这里的手机号拷贝出来,输入到上一步中注册OpenAI的界面上,然后点击 Send code按钮,在下图的界面中等待验证码短信发送

\n

\"接收输入验证码\"
注意:有效期是20分钟,需要快速操作,若两三分钟没有收到短信验证码,可点击旁边的删除按钮,然后再次选择别的手机号码,未收到验证不扣费。

\n

使用ChatGPT

账号注册完成了,就可以尽情的使用ChatGPT来玩耍了,重新登录ChatGPT官网,然后访问Chat,这时你就可以开始尽情和机器人聊天了。

\n

\"使用ChatGPT\"

\n

使用ChatGPT示例,如何写一个吸引人的 标题

\n

\"使用ChatGPT示例\"

\n

总结

以上是为你介绍的国内注册 ChatGPT 的方法,希望对你了解 ChatGPT 有所帮助,如有问题,欢迎联系我们。

\n"},{"title":"8月27.","excerpt":"","abbrlink":39523,"date":"2013-08-27T11:44:21.000Z","_content":"\n额,今天不是什么特别的日子.\n\n就是突然心血来潮,点开自己久未访问的博客,上次更新是在半年前. \n\n又是半年过去了, 一事无成啊. 聊作纪念吧.","source":"_posts/8月27.md","raw":"---\ntitle: 8月27.\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 39523\ndate: 2013-08-27 19:44:21\n---\n\n额,今天不是什么特别的日子.\n\n就是突然心血来潮,点开自己久未访问的博客,上次更新是在半年前. \n\n又是半年过去了, 一事无成啊. 聊作纪念吧.","slug":"8月27","published":1,"updated":"2023-09-30T02:59:46.515Z","_id":"cln4obygh00amoko02r8ia768","comments":1,"layout":"post","photos":[],"link":"","content":"

额,今天不是什么特别的日子.

\n

就是突然心血来潮,点开自己久未访问的博客,上次更新是在半年前.

\n

又是半年过去了, 一事无成啊. 聊作纪念吧.

\n","site":{"data":{}},"more":"

额,今天不是什么特别的日子.

\n

就是突然心血来潮,点开自己久未访问的博客,上次更新是在半年前.

\n

又是半年过去了, 一事无成啊. 聊作纪念吧.

\n"},{"layout":"post","cid":373,"title":"42个虚拟信用卡开卡渠道","slug":"42个虚拟信用卡开卡渠道","date":"2022-11-29T00:47:15.000Z","updated":"2022-11-29T00:47:15.000Z","status":"publish","author":"老孙","articleCopyright":"show","Pictype":0,"abbrlink":22526,"banner":null,"postgjc":null,"postjj":null,"_content":"\n\n1. 全球付\nhttp://www.globalcash.hk/\n在线申请,可充值,微信支付,开卡简单。\n\n2. 爱汇旅之卡\nhttp://www.ihui.com/\n此卡是目前最方便容易获得,并大量获得的实体mastercard实体卡,可以直接联系客服大量拿卡,一次上百张甚至是数百张,该卡支持paypal、amazon、google等网站。\n\n3. Tap&go 拍住赏\nhttp://tapngo.com.hk/\n可以支持微信,amazon、applepay 国际阿里云 GCE aws paypal等大部分网站,需要认证,买卡可以去香港总部或者某宝,最低100余额 充值可在香港便利店充值或者网上找人代充!\n\n4. 三三金融:\nhttps://cards.33finance.com\n需要到香港公司进行开卡,也可以找某宝,开出来的卡适用于大部分网站,包括欧贝通/amazon/阿里云/paypal/等等等等,充值也需要到香港便利店或者是到公司充,也可以找人代充。\n\n5. Tierrapay\nwww.tierrapay.com卡段4665\n注册要用欧洲地址,比如英国,需要用pm或者是wmz充值,无需认证即可成功开卡。\n\n6. 通汇香港\nhttps://www.transforex.hk/\n此卡要携带护照和身份证前往香港开通,该公司有礼品卡,固定金额每天限购买3张,经测试,此卡适用于paypal amazon ebay等平台\n\n7. Uphold www.uphold.com\n需要护照和地址证明申请,支持银行 比特币进行充值\n\n8. Payeer\nhttp://www.zhesui.com/payeer/\n目前需要用欧洲国家的资料注册,\n\n9. Advcash\n目前需要用欧洲国家的资料注册\n\n10. Moneypolo\nhttp://www.zhesui.com/moneypolo/需要完成实名认证,以及收费购买。\n\n11. Wirexapp\nhttp://www.zhesui.com/wirex-app-visa/\n4665卡段,目前需要用欧洲国家地址注册申请。没认证只能比特币充值。\n\n12. Payoneer派安盈\n附带美国 日本 英国和欧洲银行账户\nhttp://www.payoneer.com/\n\n13. okpay\n需要用护照通过实名认证才能开卡。\n\n14. Qiwi\nhttps://qiwi.com/\n需要俄罗斯电话卡注册成功才能开卡 (俄罗斯卡可以去淘宝买一个)\n\n15. ecoPayz\nhttp://www.zhesui.com/ecopayz-card/\n目前需要认证,该卡支持大部分网站,可以无限移除替换卡片。\n\n16. 浦发E-GO卡(需要有浦发实体卡)\nhttp://www.zhesui.com/e-go/\n该卡可以开出银联 mastercard visa AME 四种卡片\n\n17. Yandexmoney\nmoney.yandex.ru\n以上虚拟卡渠道基本都是国外电子钱包发行的,类似于国内的支付宝,不同的是除开少数几个支持人民币和国内银行充值的之外,其他基本都需要使用国外银行卡或者是电子钱包、信用卡充值,如果没有的话我们可以通过兑换的方式为该网站充值,具体兑换商可参照电子货币兑换网中国上面所说的兑换网站以及方法:电子货币兑换网中国:http://currencyexchange.net.cn/\n\n18. VirtualCards(支持支付宝充值)\nhttps://VirtualCards.us\n50美元起充,注册成功无需充值既可出卡号\n\n19. payweb\nhttp://payweb.com\n(需要付费、只有实体卡)可以用银联进行充值!\n\n20. Solid Trust Pay\nhttp://SolidTrustPay.com\n\n21. Skrill(需要注册国外账户)\nhttp://www.skrill.com\n要注册欧洲国家的资料才有开卡选项。\n\n22. Neteller(需要注册国外账户)\nwww.neteller.com\n\n23. v-preca(需要日本ip注册 少数中国卡能够充值)\nhttp://vpc.lifecard.co.jp\n\n24. mun-prepaid(需要日本ip注册)\n日元卡或者日本便利店充值\nwww.mun-prepaid.com\n\n25. Giftcardmall\nwww.giftcardmall.com\n此网站要美国信用卡或者是借记卡进行购买\n\n26. netspend(需翻墙 国外身份认证)\nwww.Netspend.com\n\n27. vanilla(实体卡、需要国外身份或者是便利店购买)\n也可以找我们进行购买。\nwww.vanilla.com\n\n28. 通汇香港\nhttps://www.transforex.hk/\n此卡支持amazon googleplay paypal 等网站需要携带护照和身份证到香港总公司进行开卡!用身份证就能通过认证,可以开实体卡和虚拟卡\n\n29. Entropay 欧贝通\nwww.Entropay.com\n不认证可以开五张卡,4067卡段,该卡可以用三三金融卡进行充值,可以自定义充值金额,认证过的账户可以开出10张卡片,可以自由决定充值的金额。欧贝通充值可以用 tapngo卡和三三金融进行充值,经本人测试是中国用户目前最好使的充值方法,tapngo和三三金融可以自行在香港购买。\n\n30. payoneer\npayoneer是目前非常不错的虚拟卡平台,身份证即可申请下来,遗憾的是申请到收到卡需要一个月左右的时间,值得一提的是payoneer更吸引我们的是他有美国银行账户、美元、欧元、日元、英镑银行账户可供我们申请选择,非常值得拥有。\n\n31. Mmvpaymmvpay\n是新加坡的虚拟卡平台可以开出mastercard 虚拟卡,需要新加坡手机号码注册!经过测试,账户不用认证,甚至是不用充值,一个账户直接可以获取5张卡片信息,包含卡号,有效期和卡密信息\n\n32. paypal mastercard\nhttps://www.paypal.com/us/webapps/mpp/paypal-prepaid-mastercard\n此卡是paypal美国发行的mastercard,支持大部分网站消费,绑定以及验证,但是需要美国护照、身份和银行卡信息申请,并且是需要真实的\n\n33. amazon mastercard\nhttps://www.amazon.co.jp/\n三井住友カード株式会社-amazon-mastercardゴード/dp/b0092vb6vkAmazon mastercard是amazon日本网站发行的mastercard虚拟卡账户,同样是需要日本身份证护照地址证明才能申请下来,专门针对日亚的mastercard。\n\n34. Cryptopaycryptopay\n是一个数字交易平台同属4665卡段的虚拟卡,不认证可以开出虚拟卡,但是前提是必须用欧洲国家的地址以及资料进行注册!\n\n35. Capitalistcapitalist\n是一个俄罗斯的电子钱包工具,目前不认证一个账户可以开2张mastercard虚拟卡,分别是一张欧元的一张,一张美元的,认证过后可以开通四张卡片,两张实体卡和两张虚拟卡。\n\n36. Unichangeunichange\n是一个电子货币兑换平台,该平台提供欧元和美元两种币种的虚拟卡。Unichange.me如果你没有某些资料,某些材料,那么万能的商人一定可以满足的了你!\n\n37. PayzaPayza\n也是一个电子钱包工具,类似于paypal之类的电子 钱包,这边主要介绍payza发行的mastercard虚拟卡,申请虚拟卡需要身份证和信用卡认证,可以用预付卡能看得到自己姓名的信用卡。\n\n38. mycard2go\nmycard2go是一个德国的虚拟卡,发卡行为wire bank ag卡种为visa,注册账户无需身份认证,但是需要进行充值了才能开卡,充值成功后自动开通卡片,卡种为欧元,需要用KLARNA网银或者是当地现金进行充值,也可以进行网银。\n\n39. Vandle\nhttps://app.vandle.jp/\nvandle是一家日本的虚拟卡提供平台,它提供mastercard虚拟卡片,需要再日本的便利店进行充值,也可以用日本的信用卡网银进行充值\n\n40. Chocom\nhttp://www.chocom.jp/index.html\nChocom也是一家日本的虚拟卡,可以在日本的便利店,或者是日本信用卡以及Chocom电子钱包进行充值。\n\n41. Docomokouza\ndocomokouza为日本docomo发行的visa虚拟信用卡,甚至是注册无需审查即可申请visa虚拟卡,最短有效期仅10天,还有一种则为3年需要日本的电子货币或者是信用卡对其进行充值。\nhttps://docomokouza.jpmastercard借记卡\n\n42. Nttsmarttrade\nnttsmarttrade是一家日本的在线虚拟卡平台,支持中文界面,非常方便,需要用日本信用卡段进行充值,中国和日本以外的mastercard无法进行充值。http://www.nttsmarttrade.co.jp/mastercardnet/cn/","source":"_posts/42个虚拟信用卡开卡渠道.md","raw":"---\nlayout: post\ncid: 373\ntitle: 42个虚拟信用卡开卡渠道\nslug: 42-virtual-credit-card-opening-channels\ndate: '2022/11/29 08:47:15'\nupdated: '2022/11/29 08:47:15'\nstatus: publish\nauthor: 老孙\ncategories:\n - Note\ntags:\n - 虚拟信用卡\narticleCopyright: show\nPictype: 0\nabbrlink: 22526\nbanner:\npostgjc:\npostjj:\n---\n\n\n1. 全球付\nhttp://www.globalcash.hk/\n在线申请,可充值,微信支付,开卡简单。\n\n2. 爱汇旅之卡\nhttp://www.ihui.com/\n此卡是目前最方便容易获得,并大量获得的实体mastercard实体卡,可以直接联系客服大量拿卡,一次上百张甚至是数百张,该卡支持paypal、amazon、google等网站。\n\n3. Tap&go 拍住赏\nhttp://tapngo.com.hk/\n可以支持微信,amazon、applepay 国际阿里云 GCE aws paypal等大部分网站,需要认证,买卡可以去香港总部或者某宝,最低100余额 充值可在香港便利店充值或者网上找人代充!\n\n4. 三三金融:\nhttps://cards.33finance.com\n需要到香港公司进行开卡,也可以找某宝,开出来的卡适用于大部分网站,包括欧贝通/amazon/阿里云/paypal/等等等等,充值也需要到香港便利店或者是到公司充,也可以找人代充。\n\n5. Tierrapay\nwww.tierrapay.com卡段4665\n注册要用欧洲地址,比如英国,需要用pm或者是wmz充值,无需认证即可成功开卡。\n\n6. 通汇香港\nhttps://www.transforex.hk/\n此卡要携带护照和身份证前往香港开通,该公司有礼品卡,固定金额每天限购买3张,经测试,此卡适用于paypal amazon ebay等平台\n\n7. Uphold www.uphold.com\n需要护照和地址证明申请,支持银行 比特币进行充值\n\n8. Payeer\nhttp://www.zhesui.com/payeer/\n目前需要用欧洲国家的资料注册,\n\n9. Advcash\n目前需要用欧洲国家的资料注册\n\n10. Moneypolo\nhttp://www.zhesui.com/moneypolo/需要完成实名认证,以及收费购买。\n\n11. Wirexapp\nhttp://www.zhesui.com/wirex-app-visa/\n4665卡段,目前需要用欧洲国家地址注册申请。没认证只能比特币充值。\n\n12. Payoneer派安盈\n附带美国 日本 英国和欧洲银行账户\nhttp://www.payoneer.com/\n\n13. okpay\n需要用护照通过实名认证才能开卡。\n\n14. Qiwi\nhttps://qiwi.com/\n需要俄罗斯电话卡注册成功才能开卡 (俄罗斯卡可以去淘宝买一个)\n\n15. ecoPayz\nhttp://www.zhesui.com/ecopayz-card/\n目前需要认证,该卡支持大部分网站,可以无限移除替换卡片。\n\n16. 浦发E-GO卡(需要有浦发实体卡)\nhttp://www.zhesui.com/e-go/\n该卡可以开出银联 mastercard visa AME 四种卡片\n\n17. Yandexmoney\nmoney.yandex.ru\n以上虚拟卡渠道基本都是国外电子钱包发行的,类似于国内的支付宝,不同的是除开少数几个支持人民币和国内银行充值的之外,其他基本都需要使用国外银行卡或者是电子钱包、信用卡充值,如果没有的话我们可以通过兑换的方式为该网站充值,具体兑换商可参照电子货币兑换网中国上面所说的兑换网站以及方法:电子货币兑换网中国:http://currencyexchange.net.cn/\n\n18. VirtualCards(支持支付宝充值)\nhttps://VirtualCards.us\n50美元起充,注册成功无需充值既可出卡号\n\n19. payweb\nhttp://payweb.com\n(需要付费、只有实体卡)可以用银联进行充值!\n\n20. Solid Trust Pay\nhttp://SolidTrustPay.com\n\n21. Skrill(需要注册国外账户)\nhttp://www.skrill.com\n要注册欧洲国家的资料才有开卡选项。\n\n22. Neteller(需要注册国外账户)\nwww.neteller.com\n\n23. v-preca(需要日本ip注册 少数中国卡能够充值)\nhttp://vpc.lifecard.co.jp\n\n24. mun-prepaid(需要日本ip注册)\n日元卡或者日本便利店充值\nwww.mun-prepaid.com\n\n25. Giftcardmall\nwww.giftcardmall.com\n此网站要美国信用卡或者是借记卡进行购买\n\n26. netspend(需翻墙 国外身份认证)\nwww.Netspend.com\n\n27. vanilla(实体卡、需要国外身份或者是便利店购买)\n也可以找我们进行购买。\nwww.vanilla.com\n\n28. 通汇香港\nhttps://www.transforex.hk/\n此卡支持amazon googleplay paypal 等网站需要携带护照和身份证到香港总公司进行开卡!用身份证就能通过认证,可以开实体卡和虚拟卡\n\n29. Entropay 欧贝通\nwww.Entropay.com\n不认证可以开五张卡,4067卡段,该卡可以用三三金融卡进行充值,可以自定义充值金额,认证过的账户可以开出10张卡片,可以自由决定充值的金额。欧贝通充值可以用 tapngo卡和三三金融进行充值,经本人测试是中国用户目前最好使的充值方法,tapngo和三三金融可以自行在香港购买。\n\n30. payoneer\npayoneer是目前非常不错的虚拟卡平台,身份证即可申请下来,遗憾的是申请到收到卡需要一个月左右的时间,值得一提的是payoneer更吸引我们的是他有美国银行账户、美元、欧元、日元、英镑银行账户可供我们申请选择,非常值得拥有。\n\n31. Mmvpaymmvpay\n是新加坡的虚拟卡平台可以开出mastercard 虚拟卡,需要新加坡手机号码注册!经过测试,账户不用认证,甚至是不用充值,一个账户直接可以获取5张卡片信息,包含卡号,有效期和卡密信息\n\n32. paypal mastercard\nhttps://www.paypal.com/us/webapps/mpp/paypal-prepaid-mastercard\n此卡是paypal美国发行的mastercard,支持大部分网站消费,绑定以及验证,但是需要美国护照、身份和银行卡信息申请,并且是需要真实的\n\n33. amazon mastercard\nhttps://www.amazon.co.jp/\n三井住友カード株式会社-amazon-mastercardゴード/dp/b0092vb6vkAmazon mastercard是amazon日本网站发行的mastercard虚拟卡账户,同样是需要日本身份证护照地址证明才能申请下来,专门针对日亚的mastercard。\n\n34. Cryptopaycryptopay\n是一个数字交易平台同属4665卡段的虚拟卡,不认证可以开出虚拟卡,但是前提是必须用欧洲国家的地址以及资料进行注册!\n\n35. Capitalistcapitalist\n是一个俄罗斯的电子钱包工具,目前不认证一个账户可以开2张mastercard虚拟卡,分别是一张欧元的一张,一张美元的,认证过后可以开通四张卡片,两张实体卡和两张虚拟卡。\n\n36. Unichangeunichange\n是一个电子货币兑换平台,该平台提供欧元和美元两种币种的虚拟卡。Unichange.me如果你没有某些资料,某些材料,那么万能的商人一定可以满足的了你!\n\n37. PayzaPayza\n也是一个电子钱包工具,类似于paypal之类的电子 钱包,这边主要介绍payza发行的mastercard虚拟卡,申请虚拟卡需要身份证和信用卡认证,可以用预付卡能看得到自己姓名的信用卡。\n\n38. mycard2go\nmycard2go是一个德国的虚拟卡,发卡行为wire bank ag卡种为visa,注册账户无需身份认证,但是需要进行充值了才能开卡,充值成功后自动开通卡片,卡种为欧元,需要用KLARNA网银或者是当地现金进行充值,也可以进行网银。\n\n39. Vandle\nhttps://app.vandle.jp/\nvandle是一家日本的虚拟卡提供平台,它提供mastercard虚拟卡片,需要再日本的便利店进行充值,也可以用日本的信用卡网银进行充值\n\n40. Chocom\nhttp://www.chocom.jp/index.html\nChocom也是一家日本的虚拟卡,可以在日本的便利店,或者是日本信用卡以及Chocom电子钱包进行充值。\n\n41. Docomokouza\ndocomokouza为日本docomo发行的visa虚拟信用卡,甚至是注册无需审查即可申请visa虚拟卡,最短有效期仅10天,还有一种则为3年需要日本的电子货币或者是信用卡对其进行充值。\nhttps://docomokouza.jpmastercard借记卡\n\n42. Nttsmarttrade\nnttsmarttrade是一家日本的在线虚拟卡平台,支持中文界面,非常方便,需要用日本信用卡段进行充值,中国和日本以外的mastercard无法进行充值。http://www.nttsmarttrade.co.jp/mastercardnet/cn/","published":1,"_id":"cln4obygi00aooko0evlmaeis","comments":1,"photos":[],"link":"","content":"
    \n
  1. 全球付
    http://www.globalcash.hk/
    在线申请,可充值,微信支付,开卡简单。

    \n
  2. \n
  3. 爱汇旅之卡
    http://www.ihui.com/
    此卡是目前最方便容易获得,并大量获得的实体mastercard实体卡,可以直接联系客服大量拿卡,一次上百张甚至是数百张,该卡支持paypal、amazon、google等网站。

    \n
  4. \n
  5. Tap&go 拍住赏
    http://tapngo.com.hk/
    可以支持微信,amazon、applepay 国际阿里云 GCE aws paypal等大部分网站,需要认证,买卡可以去香港总部或者某宝,最低100余额 充值可在香港便利店充值或者网上找人代充!

    \n
  6. \n
  7. 三三金融:
    https://cards.33finance.com
    需要到香港公司进行开卡,也可以找某宝,开出来的卡适用于大部分网站,包括欧贝通/amazon/阿里云/paypal/等等等等,充值也需要到香港便利店或者是到公司充,也可以找人代充。

    \n
  8. \n
  9. Tierrapay
    www.tierrapay.com卡段4665
    注册要用欧洲地址,比如英国,需要用pm或者是wmz充值,无需认证即可成功开卡。

    \n
  10. \n
  11. 通汇香港
    https://www.transforex.hk/
    此卡要携带护照和身份证前往香港开通,该公司有礼品卡,固定金额每天限购买3张,经测试,此卡适用于paypal amazon ebay等平台

    \n
  12. \n
  13. Uphold www.uphold.com
    需要护照和地址证明申请,支持银行 比特币进行充值

    \n
  14. \n
  15. Payeer
    http://www.zhesui.com/payeer/
    目前需要用欧洲国家的资料注册,

    \n
  16. \n
  17. Advcash
    目前需要用欧洲国家的资料注册

    \n
  18. \n
  19. Moneypolo
    http://www.zhesui.com/moneypolo/需要完成实名认证,以及收费购买。

    \n
  20. \n
  21. Wirexapp
    http://www.zhesui.com/wirex-app-visa/
    4665卡段,目前需要用欧洲国家地址注册申请。没认证只能比特币充值。

    \n
  22. \n
  23. Payoneer派安盈
    附带美国 日本 英国和欧洲银行账户
    http://www.payoneer.com/

    \n
  24. \n
  25. okpay
    需要用护照通过实名认证才能开卡。

    \n
  26. \n
  27. Qiwi
    https://qiwi.com/
    需要俄罗斯电话卡注册成功才能开卡 (俄罗斯卡可以去淘宝买一个)

    \n
  28. \n
  29. ecoPayz
    http://www.zhesui.com/ecopayz-card/
    目前需要认证,该卡支持大部分网站,可以无限移除替换卡片。

    \n
  30. \n
  31. 浦发E-GO卡(需要有浦发实体卡)
    http://www.zhesui.com/e-go/
    该卡可以开出银联 mastercard visa AME 四种卡片

    \n
  32. \n
  33. Yandexmoney
    money.yandex.ru
    以上虚拟卡渠道基本都是国外电子钱包发行的,类似于国内的支付宝,不同的是除开少数几个支持人民币和国内银行充值的之外,其他基本都需要使用国外银行卡或者是电子钱包、信用卡充值,如果没有的话我们可以通过兑换的方式为该网站充值,具体兑换商可参照电子货币兑换网中国上面所说的兑换网站以及方法:电子货币兑换网中国:http://currencyexchange.net.cn/

    \n
  34. \n
  35. VirtualCards(支持支付宝充值)
    https://VirtualCards.us
    50美元起充,注册成功无需充值既可出卡号

    \n
  36. \n
  37. payweb
    http://payweb.com
    (需要付费、只有实体卡)可以用银联进行充值!

    \n
  38. \n
  39. Solid Trust Pay
    http://SolidTrustPay.com

    \n
  40. \n
  41. Skrill(需要注册国外账户)
    http://www.skrill.com
    要注册欧洲国家的资料才有开卡选项。

    \n
  42. \n
  43. Neteller(需要注册国外账户)
    www.neteller.com

    \n
  44. \n
  45. v-preca(需要日本ip注册 少数中国卡能够充值)
    http://vpc.lifecard.co.jp

    \n
  46. \n
  47. mun-prepaid(需要日本ip注册)
    日元卡或者日本便利店充值
    www.mun-prepaid.com

    \n
  48. \n
  49. Giftcardmall
    www.giftcardmall.com
    此网站要美国信用卡或者是借记卡进行购买

    \n
  50. \n
  51. netspend(需翻墙 国外身份认证)
    www.Netspend.com

    \n
  52. \n
  53. vanilla(实体卡、需要国外身份或者是便利店购买)
    也可以找我们进行购买。
    www.vanilla.com

    \n
  54. \n
  55. 通汇香港
    https://www.transforex.hk/
    此卡支持amazon googleplay paypal 等网站需要携带护照和身份证到香港总公司进行开卡!用身份证就能通过认证,可以开实体卡和虚拟卡

    \n
  56. \n
  57. Entropay 欧贝通
    www.Entropay.com
    不认证可以开五张卡,4067卡段,该卡可以用三三金融卡进行充值,可以自定义充值金额,认证过的账户可以开出10张卡片,可以自由决定充值的金额。欧贝通充值可以用 tapngo卡和三三金融进行充值,经本人测试是中国用户目前最好使的充值方法,tapngo和三三金融可以自行在香港购买。

    \n
  58. \n
  59. payoneer
    payoneer是目前非常不错的虚拟卡平台,身份证即可申请下来,遗憾的是申请到收到卡需要一个月左右的时间,值得一提的是payoneer更吸引我们的是他有美国银行账户、美元、欧元、日元、英镑银行账户可供我们申请选择,非常值得拥有。

    \n
  60. \n
  61. Mmvpaymmvpay
    是新加坡的虚拟卡平台可以开出mastercard 虚拟卡,需要新加坡手机号码注册!经过测试,账户不用认证,甚至是不用充值,一个账户直接可以获取5张卡片信息,包含卡号,有效期和卡密信息

    \n
  62. \n
  63. paypal mastercard
    https://www.paypal.com/us/webapps/mpp/paypal-prepaid-mastercard
    此卡是paypal美国发行的mastercard,支持大部分网站消费,绑定以及验证,但是需要美国护照、身份和银行卡信息申请,并且是需要真实的

    \n
  64. \n
  65. amazon mastercard
    https://www.amazon.co.jp/
    三井住友カード株式会社-amazon-mastercardゴード/dp/b0092vb6vkAmazon mastercard是amazon日本网站发行的mastercard虚拟卡账户,同样是需要日本身份证护照地址证明才能申请下来,专门针对日亚的mastercard。

    \n
  66. \n
  67. Cryptopaycryptopay
    是一个数字交易平台同属4665卡段的虚拟卡,不认证可以开出虚拟卡,但是前提是必须用欧洲国家的地址以及资料进行注册!

    \n
  68. \n
  69. Capitalistcapitalist
    是一个俄罗斯的电子钱包工具,目前不认证一个账户可以开2张mastercard虚拟卡,分别是一张欧元的一张,一张美元的,认证过后可以开通四张卡片,两张实体卡和两张虚拟卡。

    \n
  70. \n
  71. Unichangeunichange
    是一个电子货币兑换平台,该平台提供欧元和美元两种币种的虚拟卡。Unichange.me如果你没有某些资料,某些材料,那么万能的商人一定可以满足的了你!

    \n
  72. \n
  73. PayzaPayza
    也是一个电子钱包工具,类似于paypal之类的电子 钱包,这边主要介绍payza发行的mastercard虚拟卡,申请虚拟卡需要身份证和信用卡认证,可以用预付卡能看得到自己姓名的信用卡。

    \n
  74. \n
  75. mycard2go
    mycard2go是一个德国的虚拟卡,发卡行为wire bank ag卡种为visa,注册账户无需身份认证,但是需要进行充值了才能开卡,充值成功后自动开通卡片,卡种为欧元,需要用KLARNA网银或者是当地现金进行充值,也可以进行网银。

    \n
  76. \n
  77. Vandle
    https://app.vandle.jp/
    vandle是一家日本的虚拟卡提供平台,它提供mastercard虚拟卡片,需要再日本的便利店进行充值,也可以用日本的信用卡网银进行充值

    \n
  78. \n
  79. Chocom
    http://www.chocom.jp/index.html
    Chocom也是一家日本的虚拟卡,可以在日本的便利店,或者是日本信用卡以及Chocom电子钱包进行充值。

    \n
  80. \n
  81. Docomokouza
    docomokouza为日本docomo发行的visa虚拟信用卡,甚至是注册无需审查即可申请visa虚拟卡,最短有效期仅10天,还有一种则为3年需要日本的电子货币或者是信用卡对其进行充值。
    https://docomokouza.jpmastercard借记卡

    \n
  82. \n
  83. Nttsmarttrade
    nttsmarttrade是一家日本的在线虚拟卡平台,支持中文界面,非常方便,需要用日本信用卡段进行充值,中国和日本以外的mastercard无法进行充值。http://www.nttsmarttrade.co.jp/mastercardnet/cn/

    \n
  84. \n
\n","site":{"data":{}},"excerpt":"","more":"
    \n
  1. 全球付
    http://www.globalcash.hk/
    在线申请,可充值,微信支付,开卡简单。

    \n
  2. \n
  3. 爱汇旅之卡
    http://www.ihui.com/
    此卡是目前最方便容易获得,并大量获得的实体mastercard实体卡,可以直接联系客服大量拿卡,一次上百张甚至是数百张,该卡支持paypal、amazon、google等网站。

    \n
  4. \n
  5. Tap&go 拍住赏
    http://tapngo.com.hk/
    可以支持微信,amazon、applepay 国际阿里云 GCE aws paypal等大部分网站,需要认证,买卡可以去香港总部或者某宝,最低100余额 充值可在香港便利店充值或者网上找人代充!

    \n
  6. \n
  7. 三三金融:
    https://cards.33finance.com
    需要到香港公司进行开卡,也可以找某宝,开出来的卡适用于大部分网站,包括欧贝通/amazon/阿里云/paypal/等等等等,充值也需要到香港便利店或者是到公司充,也可以找人代充。

    \n
  8. \n
  9. Tierrapay
    www.tierrapay.com卡段4665
    注册要用欧洲地址,比如英国,需要用pm或者是wmz充值,无需认证即可成功开卡。

    \n
  10. \n
  11. 通汇香港
    https://www.transforex.hk/
    此卡要携带护照和身份证前往香港开通,该公司有礼品卡,固定金额每天限购买3张,经测试,此卡适用于paypal amazon ebay等平台

    \n
  12. \n
  13. Uphold www.uphold.com
    需要护照和地址证明申请,支持银行 比特币进行充值

    \n
  14. \n
  15. Payeer
    http://www.zhesui.com/payeer/
    目前需要用欧洲国家的资料注册,

    \n
  16. \n
  17. Advcash
    目前需要用欧洲国家的资料注册

    \n
  18. \n
  19. Moneypolo
    http://www.zhesui.com/moneypolo/需要完成实名认证,以及收费购买。

    \n
  20. \n
  21. Wirexapp
    http://www.zhesui.com/wirex-app-visa/
    4665卡段,目前需要用欧洲国家地址注册申请。没认证只能比特币充值。

    \n
  22. \n
  23. Payoneer派安盈
    附带美国 日本 英国和欧洲银行账户
    http://www.payoneer.com/

    \n
  24. \n
  25. okpay
    需要用护照通过实名认证才能开卡。

    \n
  26. \n
  27. Qiwi
    https://qiwi.com/
    需要俄罗斯电话卡注册成功才能开卡 (俄罗斯卡可以去淘宝买一个)

    \n
  28. \n
  29. ecoPayz
    http://www.zhesui.com/ecopayz-card/
    目前需要认证,该卡支持大部分网站,可以无限移除替换卡片。

    \n
  30. \n
  31. 浦发E-GO卡(需要有浦发实体卡)
    http://www.zhesui.com/e-go/
    该卡可以开出银联 mastercard visa AME 四种卡片

    \n
  32. \n
  33. Yandexmoney
    money.yandex.ru
    以上虚拟卡渠道基本都是国外电子钱包发行的,类似于国内的支付宝,不同的是除开少数几个支持人民币和国内银行充值的之外,其他基本都需要使用国外银行卡或者是电子钱包、信用卡充值,如果没有的话我们可以通过兑换的方式为该网站充值,具体兑换商可参照电子货币兑换网中国上面所说的兑换网站以及方法:电子货币兑换网中国:http://currencyexchange.net.cn/

    \n
  34. \n
  35. VirtualCards(支持支付宝充值)
    https://VirtualCards.us
    50美元起充,注册成功无需充值既可出卡号

    \n
  36. \n
  37. payweb
    http://payweb.com
    (需要付费、只有实体卡)可以用银联进行充值!

    \n
  38. \n
  39. Solid Trust Pay
    http://SolidTrustPay.com

    \n
  40. \n
  41. Skrill(需要注册国外账户)
    http://www.skrill.com
    要注册欧洲国家的资料才有开卡选项。

    \n
  42. \n
  43. Neteller(需要注册国外账户)
    www.neteller.com

    \n
  44. \n
  45. v-preca(需要日本ip注册 少数中国卡能够充值)
    http://vpc.lifecard.co.jp

    \n
  46. \n
  47. mun-prepaid(需要日本ip注册)
    日元卡或者日本便利店充值
    www.mun-prepaid.com

    \n
  48. \n
  49. Giftcardmall
    www.giftcardmall.com
    此网站要美国信用卡或者是借记卡进行购买

    \n
  50. \n
  51. netspend(需翻墙 国外身份认证)
    www.Netspend.com

    \n
  52. \n
  53. vanilla(实体卡、需要国外身份或者是便利店购买)
    也可以找我们进行购买。
    www.vanilla.com

    \n
  54. \n
  55. 通汇香港
    https://www.transforex.hk/
    此卡支持amazon googleplay paypal 等网站需要携带护照和身份证到香港总公司进行开卡!用身份证就能通过认证,可以开实体卡和虚拟卡

    \n
  56. \n
  57. Entropay 欧贝通
    www.Entropay.com
    不认证可以开五张卡,4067卡段,该卡可以用三三金融卡进行充值,可以自定义充值金额,认证过的账户可以开出10张卡片,可以自由决定充值的金额。欧贝通充值可以用 tapngo卡和三三金融进行充值,经本人测试是中国用户目前最好使的充值方法,tapngo和三三金融可以自行在香港购买。

    \n
  58. \n
  59. payoneer
    payoneer是目前非常不错的虚拟卡平台,身份证即可申请下来,遗憾的是申请到收到卡需要一个月左右的时间,值得一提的是payoneer更吸引我们的是他有美国银行账户、美元、欧元、日元、英镑银行账户可供我们申请选择,非常值得拥有。

    \n
  60. \n
  61. Mmvpaymmvpay
    是新加坡的虚拟卡平台可以开出mastercard 虚拟卡,需要新加坡手机号码注册!经过测试,账户不用认证,甚至是不用充值,一个账户直接可以获取5张卡片信息,包含卡号,有效期和卡密信息

    \n
  62. \n
  63. paypal mastercard
    https://www.paypal.com/us/webapps/mpp/paypal-prepaid-mastercard
    此卡是paypal美国发行的mastercard,支持大部分网站消费,绑定以及验证,但是需要美国护照、身份和银行卡信息申请,并且是需要真实的

    \n
  64. \n
  65. amazon mastercard
    https://www.amazon.co.jp/
    三井住友カード株式会社-amazon-mastercardゴード/dp/b0092vb6vkAmazon mastercard是amazon日本网站发行的mastercard虚拟卡账户,同样是需要日本身份证护照地址证明才能申请下来,专门针对日亚的mastercard。

    \n
  66. \n
  67. Cryptopaycryptopay
    是一个数字交易平台同属4665卡段的虚拟卡,不认证可以开出虚拟卡,但是前提是必须用欧洲国家的地址以及资料进行注册!

    \n
  68. \n
  69. Capitalistcapitalist
    是一个俄罗斯的电子钱包工具,目前不认证一个账户可以开2张mastercard虚拟卡,分别是一张欧元的一张,一张美元的,认证过后可以开通四张卡片,两张实体卡和两张虚拟卡。

    \n
  70. \n
  71. Unichangeunichange
    是一个电子货币兑换平台,该平台提供欧元和美元两种币种的虚拟卡。Unichange.me如果你没有某些资料,某些材料,那么万能的商人一定可以满足的了你!

    \n
  72. \n
  73. PayzaPayza
    也是一个电子钱包工具,类似于paypal之类的电子 钱包,这边主要介绍payza发行的mastercard虚拟卡,申请虚拟卡需要身份证和信用卡认证,可以用预付卡能看得到自己姓名的信用卡。

    \n
  74. \n
  75. mycard2go
    mycard2go是一个德国的虚拟卡,发卡行为wire bank ag卡种为visa,注册账户无需身份认证,但是需要进行充值了才能开卡,充值成功后自动开通卡片,卡种为欧元,需要用KLARNA网银或者是当地现金进行充值,也可以进行网银。

    \n
  76. \n
  77. Vandle
    https://app.vandle.jp/
    vandle是一家日本的虚拟卡提供平台,它提供mastercard虚拟卡片,需要再日本的便利店进行充值,也可以用日本的信用卡网银进行充值

    \n
  78. \n
  79. Chocom
    http://www.chocom.jp/index.html
    Chocom也是一家日本的虚拟卡,可以在日本的便利店,或者是日本信用卡以及Chocom电子钱包进行充值。

    \n
  80. \n
  81. Docomokouza
    docomokouza为日本docomo发行的visa虚拟信用卡,甚至是注册无需审查即可申请visa虚拟卡,最短有效期仅10天,还有一种则为3年需要日本的电子货币或者是信用卡对其进行充值。
    https://docomokouza.jpmastercard借记卡

    \n
  82. \n
  83. Nttsmarttrade
    nttsmarttrade是一家日本的在线虚拟卡平台,支持中文界面,非常方便,需要用日本信用卡段进行充值,中国和日本以外的mastercard无法进行充值。http://www.nttsmarttrade.co.jp/mastercardnet/cn/

    \n
  84. \n
\n"},{"abbrlink":"94ed24f6","date":"2023-04-22T05:29:06.000Z","excerpt":"说明 下载之后用软件写入U盘或者硬盘. 引导的修改请参照教程 下载 链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦 ","title":"黑群晖DSM918 引导7.1.0镜像分享","updated":"2023-04-22T05:29:11.000Z","cover":null,"_content":"## 说明\n\n下载之后用软件写入U盘或者硬盘.\n\n引导的修改请参照教程\n\n## 下载\n\n\n链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦\n","source":"_posts/DSM918黑群晖引导7.1.0.md","raw":"---\nabbrlink: 94ed24f6\ncategories:\n - - 分享\ndate: '2023-04-22 13:29:06'\nexcerpt: >-\n 说明 下载之后用软件写入U盘或者硬盘. 引导的修改请参照教程 下载 链接:\n https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj\n 复制这段内容后打开百度网盘手机App,操作更方便哦 \ntags:\n - 黑群晖\n - 镜像\n - DSM918\ntitle: 黑群晖DSM918 引导7.1.0镜像分享\nupdated: 'Sat, 22 Apr 2023 05:29:11 GMT'\ncover:\n---\n## 说明\n\n下载之后用软件写入U盘或者硬盘.\n\n引导的修改请参照教程\n\n## 下载\n\n\n链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦\n","slug":"DSM918黑群晖引导7.1.0","published":1,"_id":"cln4obygi00aqoko01uj5098h","comments":1,"layout":"post","photos":[],"link":"","content":"

说明

下载之后用软件写入U盘或者硬盘.

\n

引导的修改请参照教程

\n

下载

链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦

\n","site":{"data":{}},"more":"

说明

下载之后用软件写入U盘或者硬盘.

\n

引导的修改请参照教程

\n

下载

链接: https://pan.baidu.com/s/1ZufU2pBEgZp1jYGVBVpo0g?pwd=jumj 提取码: jumj 复制这段内容后打开百度网盘手机App,操作更方便哦

\n"},{"title":"Git在windows下区分大小写","abbrlink":61166,"date":"2023-03-21T11:03:13.000Z","_content":"在`.deploy_git`目录下运行\n```bash\ngit config core.ignorecase false\n```\n可解决github pages 下CNAME被改为小写导致绑定域名失效的情况","source":"_posts/Git在windows下区分大小写.md","raw":"---\ntitle: Git在windows下区分大小写\ntags:\n - git\ncategories:\n - 分享\nabbrlink: 61166\ndate: 2023-03-21 19:03:13\n---\n在`.deploy_git`目录下运行\n```bash\ngit config core.ignorecase false\n```\n可解决github pages 下CNAME被改为小写导致绑定域名失效的情况","slug":"Git在windows下区分大小写","published":1,"updated":"2023-09-30T02:59:46.515Z","_id":"cln4obygj00asoko0ctp79eo3","comments":1,"layout":"post","photos":[],"link":"","content":"

.deploy_git目录下运行

\n
1
git config core.ignorecase false
\n

可解决github pages 下CNAME被改为小写导致绑定域名失效的情况

\n","site":{"data":{}},"excerpt":"","more":"

.deploy_git目录下运行

\n
1
git config core.ignorecase false
\n

可解决github pages 下CNAME被改为小写导致绑定域名失效的情况

\n"},{"title":"CentOS系统时间和时区查看以及修改的方法","excerpt":"","abbrlink":8952,"date":"2016-11-14T05:38:48.000Z","_content":"\n一、时间修改 远程连接到centos 或者直接登录系统 \n\n```\ndate \n```\n查看系统时间 \n\n\n```\ndate -s \n```\n修改时间 看下面的例子\n\n ```\n date -s  03/04/2013\n ```\n (将系统日期设定为2013年03月04日)\n```\ndate -s  110:38\n```\n(将系统时间设定为上午 10:38) \n\n二、时区修改 \n\n先查看时区 \n```\ndate -R  \n``` \n\n修改时区: (将Asia/shanghai-上海时区写入当前时区)\n\n ```\n cp -f /usr/share/zoneinfo/Asia/Shanghai     /etc/localtime \n ```\n \n 提示是否覆盖,输入Y回车, 然后 \n ```\n date\n ```\n 查看时区和时间(CST,中国时区)","source":"_posts/CentOS系统时间和时区查看以及修改的方法.md","raw":"---\ntitle: CentOS系统时间和时区查看以及修改的方法\ntags:\n - centos\n - VPS\nexcerpt: ''\ncategories: 分享\nabbrlink: 8952\ndate: 2016-11-14 13:38:48\n---\n\n一、时间修改 远程连接到centos 或者直接登录系统 \n\n```\ndate \n```\n查看系统时间 \n\n\n```\ndate -s \n```\n修改时间 看下面的例子\n\n ```\n date -s  03/04/2013\n ```\n (将系统日期设定为2013年03月04日)\n```\ndate -s  110:38\n```\n(将系统时间设定为上午 10:38) \n\n二、时区修改 \n\n先查看时区 \n```\ndate -R  \n``` \n\n修改时区: (将Asia/shanghai-上海时区写入当前时区)\n\n ```\n cp -f /usr/share/zoneinfo/Asia/Shanghai     /etc/localtime \n ```\n \n 提示是否覆盖,输入Y回车, 然后 \n ```\n date\n ```\n 查看时区和时间(CST,中国时区)","slug":"CentOS系统时间和时区查看以及修改的方法","published":1,"updated":"2023-09-30T02:59:46.515Z","_id":"cln4obygk00avoko05lpmhi95","comments":1,"layout":"post","photos":[],"link":"","content":"

一、时间修改 远程连接到centos 或者直接登录系统

\n
1
date 
\n

查看系统时间

\n
1
date -s 
\n

修改时间 看下面的例子

\n
1
date -s  03/04/2013
\n

(将系统日期设定为2013年03月04日)

\n
1
date -s  110:38
\n

(将系统时间设定为上午 10:38)

\n

二、时区修改

\n

先查看时区

\n
1
date -R  
\n\n

修改时区: (将Asia/shanghai-上海时区写入当前时区)

\n
1
cp -f /usr/share/zoneinfo/Asia/Shanghai     /etc/localtime 
\n

提示是否覆盖,输入Y回车, 然后

1
date

查看时区和时间(CST,中国时区)

\n","site":{"data":{}},"more":"

一、时间修改 远程连接到centos 或者直接登录系统

\n
1
date 
\n

查看系统时间

\n
1
date -s 
\n

修改时间 看下面的例子

\n
1
date -s  03/04/2013
\n

(将系统日期设定为2013年03月04日)

\n
1
date -s  110:38
\n

(将系统时间设定为上午 10:38)

\n

二、时区修改

\n

先查看时区

\n
1
date -R  
\n\n

修改时区: (将Asia/shanghai-上海时区写入当前时区)

\n
1
cp -f /usr/share/zoneinfo/Asia/Shanghai     /etc/localtime 
\n

提示是否覆盖,输入Y回车, 然后

1
date

查看时区和时间(CST,中国时区)

\n"},{"abbrlink":"1c81ee10","date":"2023-06-16T02:59:36.682Z","excerpt":"...","title":"LEDE 软路由安装“koolss”离线插件包提示含非法关键字的解决方法","updated":"2023-09-30T02:59:46.515Z","cover":null,"_content":"用SSH登录软路由\n\n```\nssh root@192.168.1.1\n```\n\n然后输入\n\n```\nsed -i 's/\\tdetect_package/\\t# detect_package/g' /koolshare/scripts/ks_tar_install.sh\n```\n\n再安装科学上网插件即可\n\n[koolss](https://blog-1312096806.cos.ap-guangzhou.myqcloud.com/halo/koolss_2.2.2.tar.gz)\n\n","source":"_posts/LEDE 软路由安装“XX上网”离线插件包提示含非法关键字的解决方法.md","raw":"---\nabbrlink: 1c81ee10\ncategories:\n - - 分享\ndate: '2023-06-16T10:59:36.682323+08:00'\nexcerpt: ...\ntags:\n - openwrt\n - lede\n - 软路由\n - 科学上网\ntitle: LEDE 软路由安装“koolss”离线插件包提示含非法关键字的解决方法\nupdated: '2023-6-16T11:4:22.86+8:0'\ncover:\n---\n用SSH登录软路由\n\n```\nssh root@192.168.1.1\n```\n\n然后输入\n\n```\nsed -i 's/\\tdetect_package/\\t# detect_package/g' /koolshare/scripts/ks_tar_install.sh\n```\n\n再安装科学上网插件即可\n\n[koolss](https://blog-1312096806.cos.ap-guangzhou.myqcloud.com/halo/koolss_2.2.2.tar.gz)\n\n","slug":"LEDE 软路由安装“XX上网”离线插件包提示含非法关键字的解决方法","published":1,"_id":"cln4obygl00axoko039iy1kiz","comments":1,"layout":"post","photos":[],"link":"","content":"

用SSH登录软路由

\n
1
ssh root@192.168.1.1
\n\n

然后输入

\n
1
sed -i 's/\\tdetect_package/\\t# detect_package/g' /koolshare/scripts/ks_tar_install.sh
\n\n

再安装科学上网插件即可

\n

koolss

\n","site":{"data":{}},"more":"

用SSH登录软路由

\n
1
ssh root@192.168.1.1
\n\n

然后输入

\n
1
sed -i 's/\\tdetect_package/\\t# detect_package/g' /koolshare/scripts/ks_tar_install.sh
\n\n

再安装科学上网插件即可

\n

koolss

\n"},{"title":"Vi编辑器的基本使用方法","abbrlink":22356,"date":"2016-11-16T00:37:48.000Z","_content":"\nvi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。\n由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。\nVi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。 \n\n1、vi的基本概念 \n\n基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:\n\n1) 命令行模式command mode) \n\n控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。 \n\n2) 插入模式(Insert mode)\n\n只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。 \n\n3) 底行模式(last line mode) \n\n将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。 \n\n2、vi的基本操作\n\n a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!\n \n b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 \n \n c) Insert 的切换 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。 \n \n d) 退出vi及保存文件\n\n在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:\n\nw filename (输入 「w filename」将文章以指定的文件名filename保存)\n\nwq (输入「wq」,存盘并退出vi)\n\nq! (输入q!, 不存盘强制退出vi)\n\n3、命令行模式(command mode)功能键 \n\n1). 插入模式 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。 \n\n2). 从插入模式切换为命令行模式 按「ESC」键。 \n\n3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往“后”移动一页。 按「ctrl」+「f」:屏幕往“前”移动一页。 按「ctrl」+「u」:屏幕往“后”移动半页。 按「ctrl」+「d」:屏幕往“前”移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的“行尾”。 按「^」:移动到光标所在行的“行首” 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如:5l,56l。 \n\n4). 删除文字 「x」:每按一次,删除光标所在位置的“后面”一个字符。 「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。 「dd」:删除光标所在行。 「#dd」:从光标所在行开始删除#行 \n\n5). 复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。 \n\n6). 替换 「r」:替换光标所在处的字符。 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。 \n\n7). 回复上一次操作 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。 \n\n8). 更改 「cw」:更改光标所在处的字到字尾处 「c#w」:例如,「c3w」表示更改3个字 9). 跳至指定的行 「ctrl」+「g」列出光标所在行的行号。 「#G」:例如,「15G」,表示移动光标至文章的第15行行首。 \n\n4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。 \n\nA) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。 \n\nB) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。 \n\nC) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。 \n\nD) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。 \n\nE) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。 \n\n5、vi命令列表 \n\n1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字“0”,光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字 \n\n2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。 \n\n对于第一次用vi,有几点注意要提醒一下: \n\n1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。\n\n切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。\n\n2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。\n\n3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)","source":"_posts/Vi编辑器的基本使用方法!.md","raw":"---\ntitle: Vi编辑器的基本使用方法\ntags:\n - Linux\ncategories: 分享\nabbrlink: 22356\ndate: 2016-11-16 08:37:48\n---\n\nvi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。\n由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。\nVi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。 \n\n1、vi的基本概念 \n\n基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:\n\n1) 命令行模式command mode) \n\n控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。 \n\n2) 插入模式(Insert mode)\n\n只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。 \n\n3) 底行模式(last line mode) \n\n将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。 \n\n2、vi的基本操作\n\n a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!\n \n b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 \n \n c) Insert 的切换 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。 \n \n d) 退出vi及保存文件\n\n在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:\n\nw filename (输入 「w filename」将文章以指定的文件名filename保存)\n\nwq (输入「wq」,存盘并退出vi)\n\nq! (输入q!, 不存盘强制退出vi)\n\n3、命令行模式(command mode)功能键 \n\n1). 插入模式 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。 \n\n2). 从插入模式切换为命令行模式 按「ESC」键。 \n\n3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往“后”移动一页。 按「ctrl」+「f」:屏幕往“前”移动一页。 按「ctrl」+「u」:屏幕往“后”移动半页。 按「ctrl」+「d」:屏幕往“前”移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的“行尾”。 按「^」:移动到光标所在行的“行首” 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如:5l,56l。 \n\n4). 删除文字 「x」:每按一次,删除光标所在位置的“后面”一个字符。 「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。 「dd」:删除光标所在行。 「#dd」:从光标所在行开始删除#行 \n\n5). 复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。 \n\n6). 替换 「r」:替换光标所在处的字符。 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。 \n\n7). 回复上一次操作 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。 \n\n8). 更改 「cw」:更改光标所在处的字到字尾处 「c#w」:例如,「c3w」表示更改3个字 9). 跳至指定的行 「ctrl」+「g」列出光标所在行的行号。 「#G」:例如,「15G」,表示移动光标至文章的第15行行首。 \n\n4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。 \n\nA) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。 \n\nB) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。 \n\nC) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。 \n\nD) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。 \n\nE) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。 \n\n5、vi命令列表 \n\n1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字“0”,光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字 \n\n2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。 \n\n对于第一次用vi,有几点注意要提醒一下: \n\n1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。\n\n切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。\n\n2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。\n\n3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)","slug":"Vi编辑器的基本使用方法!","published":1,"updated":"2023-09-30T02:59:46.516Z","_id":"cln4obygl00azoko066h93056","comments":1,"layout":"post","photos":[],"link":"","content":"

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。
由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。
Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。

\n

1、vi的基本概念

\n

基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

\n
    \n
  1. 命令行模式command mode)
  2. \n
\n

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。

\n
    \n
  1. 插入模式(Insert mode)
  2. \n
\n

只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。

\n
    \n
  1. 底行模式(last line mode)
  2. \n
\n

将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。

\n

2、vi的基本操作

\n

a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!

\n

b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

\n

c) Insert 的切换 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。

\n

d) 退出vi及保存文件

\n

在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:

\n

w filename (输入 「w filename」将文章以指定的文件名filename保存)

\n

wq (输入「wq」,存盘并退出vi)

\n

q! (输入q!, 不存盘强制退出vi)

\n

3、命令行模式(command mode)功能键

\n

1). 插入模式 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

\n

2). 从插入模式切换为命令行模式 按「ESC」键。

\n

3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往“后”移动一页。 按「ctrl」+「f」:屏幕往“前”移动一页。 按「ctrl」+「u」:屏幕往“后”移动半页。 按「ctrl」+「d」:屏幕往“前”移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的“行尾”。 按「^」:移动到光标所在行的“行首” 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如:5l,56l。

\n

4). 删除文字 「x」:每按一次,删除光标所在位置的“后面”一个字符。 「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。 「dd」:删除光标所在行。 「#dd」:从光标所在行开始删除#行

\n

5). 复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

\n

6). 替换 「r」:替换光标所在处的字符。 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

\n

7). 回复上一次操作 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。

\n

8). 更改 「cw」:更改光标所在处的字到字尾处 「c#w」:例如,「c3w」表示更改3个字 9). 跳至指定的行 「ctrl」+「g」列出光标所在行的行号。 「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

\n

4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。

\n

A) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。

\n

B) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

\n

C) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

\n

D) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。

\n

E) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

\n

5、vi命令列表

\n

1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字“0”,光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字

\n

2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。

\n

对于第一次用vi,有几点注意要提醒一下:

\n

1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。

\n

切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

\n

2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。

\n

3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)

\n","site":{"data":{}},"excerpt":"","more":"

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。
由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。
Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。

\n

1、vi的基本概念

\n

基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

\n
    \n
  1. 命令行模式command mode)
  2. \n
\n

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。

\n
    \n
  1. 插入模式(Insert mode)
  2. \n
\n

只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。

\n
    \n
  1. 底行模式(last line mode)
  2. \n
\n

将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。

\n

2、vi的基本操作

\n

a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!

\n

b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

\n

c) Insert 的切换 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。

\n

d) 退出vi及保存文件

\n

在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:

\n

w filename (输入 「w filename」将文章以指定的文件名filename保存)

\n

wq (输入「wq」,存盘并退出vi)

\n

q! (输入q!, 不存盘强制退出vi)

\n

3、命令行模式(command mode)功能键

\n

1). 插入模式 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

\n

2). 从插入模式切换为命令行模式 按「ESC」键。

\n

3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往“后”移动一页。 按「ctrl」+「f」:屏幕往“前”移动一页。 按「ctrl」+「u」:屏幕往“后”移动半页。 按「ctrl」+「d」:屏幕往“前”移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的“行尾”。 按「^」:移动到光标所在行的“行首” 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如:5l,56l。

\n

4). 删除文字 「x」:每按一次,删除光标所在位置的“后面”一个字符。 「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。 「dd」:删除光标所在行。 「#dd」:从光标所在行开始删除#行

\n

5). 复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

\n

6). 替换 「r」:替换光标所在处的字符。 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

\n

7). 回复上一次操作 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。

\n

8). 更改 「cw」:更改光标所在处的字到字尾处 「c#w」:例如,「c3w」表示更改3个字 9). 跳至指定的行 「ctrl」+「g」列出光标所在行的行号。 「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

\n

4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。

\n

A) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。

\n

B) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

\n

C) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

\n

D) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。

\n

E) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

\n

5、vi命令列表

\n

1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字“0”,光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字

\n

2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。

\n

对于第一次用vi,有几点注意要提醒一下:

\n

1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。

\n

切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

\n

2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。

\n

3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)

\n"},{"layout":"post","cid":342,"title":"centos7 ssh连接慢的解决方法","slug":"centos7_ssh连接慢的解决方法","date":"2022-08-12T08:52:00.000Z","updated":"2022-08-12T08:55:00.000Z","status":"publish","author":"老孙","dtMode":0,"radioPostImg":"none","abbrlink":58592,"icon":null,"thumbnail":null,"_content":"\n\n```bash\nvim /etc/ssh/sshd_config\n```\n按i编辑插入\n找到\n`UseDNS`去掉前面的#号 改为 no\n\n`GSSAPIAuthentication` 改为 no\n\n然后`:wq `保存退出\n\n```bash\nsystemctl restart sshd\n```\n重启","source":"_posts/centos7_ssh连接慢的解决方法.md","raw":"---\nlayout: post\ncid: 342\ntitle: centos7 ssh连接慢的解决方法\nslug: solution-to-slow-ssh-connection-of-centos-7\ndate: '2022/08/12 16:52:00'\nupdated: '2022/08/12 16:55:00'\nstatus: publish\nauthor: 老孙\ncategories: 分享\ntags:\n - centos\ndtMode: 0\nradioPostImg: none\nabbrlink: 58592\nicon:\nthumbnail:\n---\n\n\n```bash\nvim /etc/ssh/sshd_config\n```\n按i编辑插入\n找到\n`UseDNS`去掉前面的#号 改为 no\n\n`GSSAPIAuthentication` 改为 no\n\n然后`:wq `保存退出\n\n```bash\nsystemctl restart sshd\n```\n重启","published":1,"_id":"cln4obygm00b1oko07rdt1v5y","comments":1,"photos":[],"link":"","content":"
1
vim /etc/ssh/sshd_config
\n

按i编辑插入
找到
UseDNS去掉前面的#号 改为 no

\n

GSSAPIAuthentication 改为 no

\n

然后:wq 保存退出

\n
1
systemctl restart sshd
\n

重启

\n","site":{"data":{}},"excerpt":"","more":"
1
vim /etc/ssh/sshd_config
\n

按i编辑插入
找到
UseDNS去掉前面的#号 改为 no

\n

GSSAPIAuthentication 改为 no

\n

然后:wq 保存退出

\n
1
systemctl restart sshd
\n

重启

\n"},{"layout":"post","cid":374,"title":"centos7安装后没有网络","slug":"centos7安装后没有网络","date":"2022-11-29T01:56:00.000Z","updated":"2022-11-29T01:57:00.000Z","status":"publish","author":"老孙","abbrlink":6609,"_content":"\n\n以`root`账号登陆\n用`ip addr`命令查看网络参数。\n打开`eth0`网卡的配置文件\n\n```bash\nvi /etc/sysconfig/network-scripts/ifcfg-eth0\n```\n\n把`NOBOOT`参数`no`,修改为`yes`\n重启网络或者重启服务器都可","source":"_posts/centos7安装后没有网络.md","raw":"---\nlayout: post\ncid: 374\ntitle: centos7安装后没有网络\nslug: there-is-no-network-after-centos7-installation\ndate: '2022/11/29 09:56:00'\nupdated: '2022/11/29 09:57:00'\nstatus: publish\nauthor: 老孙\ncategories: 分享\ntags:\n - centos\nabbrlink: 6609\n---\n\n\n以`root`账号登陆\n用`ip addr`命令查看网络参数。\n打开`eth0`网卡的配置文件\n\n```bash\nvi /etc/sysconfig/network-scripts/ifcfg-eth0\n```\n\n把`NOBOOT`参数`no`,修改为`yes`\n重启网络或者重启服务器都可","published":1,"_id":"cln4obygm00b4oko05ez0aioh","comments":1,"photos":[],"link":"","content":"

root账号登陆
ip addr命令查看网络参数。
打开eth0网卡的配置文件

\n
1
vi /etc/sysconfig/network-scripts/ifcfg-eth0
\n\n

NOBOOT参数no,修改为yes
重启网络或者重启服务器都可

\n","site":{"data":{}},"excerpt":"","more":"

root账号登陆
ip addr命令查看网络参数。
打开eth0网卡的配置文件

\n
1
vi /etc/sysconfig/network-scripts/ifcfg-eth0
\n\n

NOBOOT参数no,修改为yes
重启网络或者重启服务器都可

\n"},{"title":"Cloud Torrent for centos一键安装","published":1,"hideInList":false,"isTop":false,"abbrlink":"eac40a64","date":"2017-05-27T13:54:00.000Z","feature":null,"_content":"\n\n支持 离线下载 BT和磁力链接和边下边播 的老司机坐骑 —— Cloud Torrent\n声明:本文章仅提供 BT/磁力链接 下载工具的安装方法和说明,任何使用此工具 下载版权侵权文件或导致任何经济损失,皆和本人无任何关系!如果你不同意或有异议,请关闭这个网页!\n![10-1.png][1]\n - 系统需求\nCentOS / Debian / Ubuntu 都可以,因为是 Go语言写的\n- 脚本版本:\nVer: 1.0.3\n\n- Cloud Torrent特点\n支持 BT下载\n支持 磁力链接下载\n支持 搜索磁力链接\n支持 离线下载\n支持 边下边播( 格式限制:mp4/wbem/ogg,同时需要手动输入链接)\n可视化界面 Web UI\n- 安装步骤\n\n\n wget -N --no-check-certificate https://www.xuanlove.download/sh/cloudt.sh && chmod +x cloudt.sh && bash cloudt.sh\n\n\n下载运行完毕脚本,就会直接开始安装 Cloud Torrent ,安装过程中如果出现让你选择Y和N的,都选Y。\n安装完成之后,就会提醒你,输入要开放的端口(推荐:默认 8000)\n启动后,访问 http://VPS_IP:8000 即可看到Web UI界面了。\n- 脚本使用说明\n\n \n\n bash cloudt.sh\n #可以直接输入这个命令,会自动判断是否需要 安装/启动/停止 Cloud Torrent\n  \n bash cloudt.sh install\n #安装 Cloud Torrent\n  \n bash cloudt.sh start\n #启动 Cloud Torrent\n  \n bash cloudt.sh stop\n #停止 Cloud Torrent\n  \n bash cloudt.sh tail\n #查看 Cloud Torrent 日志\n  \n bash cloudt.sh uninstall\n #卸载 Cloud Torrent\n\n\n- Cloud Torrent使用说明\nCloud Torrent可以直接在输入中输入 磁力链接 或者 在线的BT种子(不支持本地上传),点击下面的 蓝色的按钮,就会开始解析资源。\n--- \n\n按钮说明\n----\n\n成功解析后,就会显示如下的界面,开始下载。\nFiles 是查看正在下载的文件列表, Start 是启动下载(默认解析后直接启动下载), Stop 是停止下载。\n还有,如果你下载完毕或者点了 Stop 停止下载,那么 Stop 就会变成 Remove 删除任务的按钮了。\n\n搜索磁力链接\n----------\n\nCloud Torrent支持搜索磁力链接,在输入栏中直接输入你要搜索的文件名称,同时点击 绿色的按钮 选择一个搜索源,然后点击 蓝色的Search 按钮就可以搜索了。\n注意:Cloud Torrent是国外人写的,所以这些搜索源均是国外的磁力链接网站,搜索到的资源基本没有中文的,所以非特殊需求的这个功能就没什么卵用了。\n\n注意事项\n------\n\nBT和磁力链接的速度是和, 磁力链接/BT 的用户上传共享量 和 中心服务器的宽带质量,以及你下载 磁力链接/BT 的VPS的宽带有关系。\n这种软件在某些程度上比不上 国内的迅雷,毕竟迅雷 用户了很大共享了很多的上传速度,而且还有缓存的中心服务器,所以才会那么快。\n如果你是国外的VPS,特别是美国的,一定要注意下载 BT/磁力链接 容易遇到蜜罐,然后被投诉封VPS。建议使用欧洲的罗马尼亚,那里的VPS无视版权,当然拉回本地,速度肯定也不会多快\n# 无法访问你的 http://IP:端口\n可能是防火墙规则的问题,使用下面这个命令来开放端口\n\n iptables -I INPUT -p tcp --dport 端口 -j ACCEPT\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/05/27/823290012.png\n\n\n\n\n\n","source":"_posts/cloud-torrent-for-centos-yi-jian-an-zhuang.md","raw":"---\ntitle: Cloud Torrent for centos一键安装\ncategories: 分享\ntags:\n - torrent\n - 磁力\n - 下载\n - cloud torrent\n - centos\npublished: true\nhideInList: false\nisTop: false\nabbrlink: eac40a64\ndate: 2017-05-27 21:54:00\nfeature:\n---\n\n\n支持 离线下载 BT和磁力链接和边下边播 的老司机坐骑 —— Cloud Torrent\n声明:本文章仅提供 BT/磁力链接 下载工具的安装方法和说明,任何使用此工具 下载版权侵权文件或导致任何经济损失,皆和本人无任何关系!如果你不同意或有异议,请关闭这个网页!\n![10-1.png][1]\n - 系统需求\nCentOS / Debian / Ubuntu 都可以,因为是 Go语言写的\n- 脚本版本:\nVer: 1.0.3\n\n- Cloud Torrent特点\n支持 BT下载\n支持 磁力链接下载\n支持 搜索磁力链接\n支持 离线下载\n支持 边下边播( 格式限制:mp4/wbem/ogg,同时需要手动输入链接)\n可视化界面 Web UI\n- 安装步骤\n\n\n wget -N --no-check-certificate https://www.xuanlove.download/sh/cloudt.sh && chmod +x cloudt.sh && bash cloudt.sh\n\n\n下载运行完毕脚本,就会直接开始安装 Cloud Torrent ,安装过程中如果出现让你选择Y和N的,都选Y。\n安装完成之后,就会提醒你,输入要开放的端口(推荐:默认 8000)\n启动后,访问 http://VPS_IP:8000 即可看到Web UI界面了。\n- 脚本使用说明\n\n \n\n bash cloudt.sh\n #可以直接输入这个命令,会自动判断是否需要 安装/启动/停止 Cloud Torrent\n  \n bash cloudt.sh install\n #安装 Cloud Torrent\n  \n bash cloudt.sh start\n #启动 Cloud Torrent\n  \n bash cloudt.sh stop\n #停止 Cloud Torrent\n  \n bash cloudt.sh tail\n #查看 Cloud Torrent 日志\n  \n bash cloudt.sh uninstall\n #卸载 Cloud Torrent\n\n\n- Cloud Torrent使用说明\nCloud Torrent可以直接在输入中输入 磁力链接 或者 在线的BT种子(不支持本地上传),点击下面的 蓝色的按钮,就会开始解析资源。\n--- \n\n按钮说明\n----\n\n成功解析后,就会显示如下的界面,开始下载。\nFiles 是查看正在下载的文件列表, Start 是启动下载(默认解析后直接启动下载), Stop 是停止下载。\n还有,如果你下载完毕或者点了 Stop 停止下载,那么 Stop 就会变成 Remove 删除任务的按钮了。\n\n搜索磁力链接\n----------\n\nCloud Torrent支持搜索磁力链接,在输入栏中直接输入你要搜索的文件名称,同时点击 绿色的按钮 选择一个搜索源,然后点击 蓝色的Search 按钮就可以搜索了。\n注意:Cloud Torrent是国外人写的,所以这些搜索源均是国外的磁力链接网站,搜索到的资源基本没有中文的,所以非特殊需求的这个功能就没什么卵用了。\n\n注意事项\n------\n\nBT和磁力链接的速度是和, 磁力链接/BT 的用户上传共享量 和 中心服务器的宽带质量,以及你下载 磁力链接/BT 的VPS的宽带有关系。\n这种软件在某些程度上比不上 国内的迅雷,毕竟迅雷 用户了很大共享了很多的上传速度,而且还有缓存的中心服务器,所以才会那么快。\n如果你是国外的VPS,特别是美国的,一定要注意下载 BT/磁力链接 容易遇到蜜罐,然后被投诉封VPS。建议使用欧洲的罗马尼亚,那里的VPS无视版权,当然拉回本地,速度肯定也不会多快\n# 无法访问你的 http://IP:端口\n可能是防火墙规则的问题,使用下面这个命令来开放端口\n\n iptables -I INPUT -p tcp --dport 端口 -j ACCEPT\n\n\n [1]: https://xy07-1251893119.costj.myqcloud.com/2017/05/27/823290012.png\n\n\n\n\n\n","slug":"cloud-torrent-for-centos-yi-jian-an-zhuang","updated":"2023-09-30T02:59:46.517Z","_id":"cln4obygn00b7oko01rmaep60","comments":1,"layout":"post","photos":[],"link":"","content":"

支持 离线下载 BT和磁力链接和边下边播 的老司机坐骑 —— Cloud Torrent
声明:本文章仅提供 BT/磁力链接 下载工具的安装方法和说明,任何使用此工具 下载版权侵权文件或导致任何经济损失,皆和本人无任何关系!如果你不同意或有异议,请关闭这个网页!
\"10-1.png\"

\n
    \n
  • 系统需求
    CentOS / Debian / Ubuntu 都可以,因为是 Go语言写的

    \n
  • \n
  • 脚本版本:
    Ver: 1.0.3

    \n
  • \n
  • Cloud Torrent特点
    支持 BT下载
    支持 磁力链接下载
    支持 搜索磁力链接
    支持 离线下载
    支持 边下边播( 格式限制:mp4/wbem/ogg,同时需要手动输入链接)
    可视化界面 Web UI

    \n
  • \n
  • 安装步骤

    \n

    wget -N –no-check-certificate https://www.xuanlove.download/sh/cloudt.sh && chmod +x cloudt.sh && bash cloudt.sh

    \n
  • \n
\n

下载运行完毕脚本,就会直接开始安装 Cloud Torrent ,安装过程中如果出现让你选择Y和N的,都选Y。
安装完成之后,就会提醒你,输入要开放的端口(推荐:默认 8000)
启动后,访问 http://VPS_IP:8000 即可看到Web UI界面了。

\n
    \n
  • 脚本使用说明

    \n

    bash cloudt.sh
    #可以直接输入这个命令,会自动判断是否需要 安装/启动/停止 Cloud Torrent
     
    bash cloudt.sh install
    #安装 Cloud Torrent
     
    bash cloudt.sh start
    #启动 Cloud Torrent
     
    bash cloudt.sh stop
    #停止 Cloud Torrent
     
    bash cloudt.sh tail
    #查看 Cloud Torrent 日志
     
    bash cloudt.sh uninstall
    #卸载 Cloud Torrent

    \n
  • \n
  • Cloud Torrent使用说明
    Cloud Torrent可以直接在输入中输入 磁力链接 或者 在线的BT种子(不支持本地上传),点击下面的 蓝色的按钮,就会开始解析资源。

    \n
  • \n
\n
\n

按钮说明

成功解析后,就会显示如下的界面,开始下载。
Files 是查看正在下载的文件列表, Start 是启动下载(默认解析后直接启动下载), Stop 是停止下载。
还有,如果你下载完毕或者点了 Stop 停止下载,那么 Stop 就会变成 Remove 删除任务的按钮了。

\n

搜索磁力链接

Cloud Torrent支持搜索磁力链接,在输入栏中直接输入你要搜索的文件名称,同时点击 绿色的按钮 选择一个搜索源,然后点击 蓝色的Search 按钮就可以搜索了。
注意:Cloud Torrent是国外人写的,所以这些搜索源均是国外的磁力链接网站,搜索到的资源基本没有中文的,所以非特殊需求的这个功能就没什么卵用了。

\n

注意事项

BT和磁力链接的速度是和, 磁力链接/BT 的用户上传共享量 和 中心服务器的宽带质量,以及你下载 磁力链接/BT 的VPS的宽带有关系。
这种软件在某些程度上比不上 国内的迅雷,毕竟迅雷 用户了很大共享了很多的上传速度,而且还有缓存的中心服务器,所以才会那么快。
如果你是国外的VPS,特别是美国的,一定要注意下载 BT/磁力链接 容易遇到蜜罐,然后被投诉封VPS。建议使用欧洲的罗马尼亚,那里的VPS无视版权,当然拉回本地,速度肯定也不会多快

\n

无法访问你的 http://IP:端口

可能是防火墙规则的问题,使用下面这个命令来开放端口

\n
iptables -I INPUT -p tcp --dport 端口 -j ACCEPT\n
\n","site":{"data":{}},"excerpt":"","more":"

支持 离线下载 BT和磁力链接和边下边播 的老司机坐骑 —— Cloud Torrent
声明:本文章仅提供 BT/磁力链接 下载工具的安装方法和说明,任何使用此工具 下载版权侵权文件或导致任何经济损失,皆和本人无任何关系!如果你不同意或有异议,请关闭这个网页!
\"10-1.png\"

\n
    \n
  • 系统需求
    CentOS / Debian / Ubuntu 都可以,因为是 Go语言写的

    \n
  • \n
  • 脚本版本:
    Ver: 1.0.3

    \n
  • \n
  • Cloud Torrent特点
    支持 BT下载
    支持 磁力链接下载
    支持 搜索磁力链接
    支持 离线下载
    支持 边下边播( 格式限制:mp4/wbem/ogg,同时需要手动输入链接)
    可视化界面 Web UI

    \n
  • \n
  • 安装步骤

    \n

    wget -N –no-check-certificate https://www.xuanlove.download/sh/cloudt.sh && chmod +x cloudt.sh && bash cloudt.sh

    \n
  • \n
\n

下载运行完毕脚本,就会直接开始安装 Cloud Torrent ,安装过程中如果出现让你选择Y和N的,都选Y。
安装完成之后,就会提醒你,输入要开放的端口(推荐:默认 8000)
启动后,访问 http://VPS_IP:8000 即可看到Web UI界面了。

\n
    \n
  • 脚本使用说明

    \n

    bash cloudt.sh
    #可以直接输入这个命令,会自动判断是否需要 安装/启动/停止 Cloud Torrent
     
    bash cloudt.sh install
    #安装 Cloud Torrent
     
    bash cloudt.sh start
    #启动 Cloud Torrent
     
    bash cloudt.sh stop
    #停止 Cloud Torrent
     
    bash cloudt.sh tail
    #查看 Cloud Torrent 日志
     
    bash cloudt.sh uninstall
    #卸载 Cloud Torrent

    \n
  • \n
  • Cloud Torrent使用说明
    Cloud Torrent可以直接在输入中输入 磁力链接 或者 在线的BT种子(不支持本地上传),点击下面的 蓝色的按钮,就会开始解析资源。

    \n
  • \n
\n
\n

按钮说明

成功解析后,就会显示如下的界面,开始下载。
Files 是查看正在下载的文件列表, Start 是启动下载(默认解析后直接启动下载), Stop 是停止下载。
还有,如果你下载完毕或者点了 Stop 停止下载,那么 Stop 就会变成 Remove 删除任务的按钮了。

\n

搜索磁力链接

Cloud Torrent支持搜索磁力链接,在输入栏中直接输入你要搜索的文件名称,同时点击 绿色的按钮 选择一个搜索源,然后点击 蓝色的Search 按钮就可以搜索了。
注意:Cloud Torrent是国外人写的,所以这些搜索源均是国外的磁力链接网站,搜索到的资源基本没有中文的,所以非特殊需求的这个功能就没什么卵用了。

\n

注意事项

BT和磁力链接的速度是和, 磁力链接/BT 的用户上传共享量 和 中心服务器的宽带质量,以及你下载 磁力链接/BT 的VPS的宽带有关系。
这种软件在某些程度上比不上 国内的迅雷,毕竟迅雷 用户了很大共享了很多的上传速度,而且还有缓存的中心服务器,所以才会那么快。
如果你是国外的VPS,特别是美国的,一定要注意下载 BT/磁力链接 容易遇到蜜罐,然后被投诉封VPS。建议使用欧洲的罗马尼亚,那里的VPS无视版权,当然拉回本地,速度肯定也不会多快

\n

无法访问你的 http://IP:端口

可能是防火墙规则的问题,使用下面这个命令来开放端口

\n
iptables -I INPUT -p tcp --dport 端口 -j ACCEPT\n
\n"},{"layout":"post","cid":334,"title":"edge 浏览器,出现“你的连接不是专用连接提示”,怎么办?","slug":"edge_浏览器,出现“你的连接不是专用连接提示”,怎么办?","date":"2022-07-08T01:04:36.000Z","updated":"2022-07-08T01:04:36.000Z","status":"publish","author":"老孙","abbrlink":25686,"icon":null,"thumbnail":null,"_content":"\n\n调整键盘为英文输入状态,刷新一下页面,鼠标点击当前页面任意位置,然后依次按键:thisisunsafe\n\n按完上面的按键,页面会自动刷新,然后就可以正常访问了。","source":"_posts/edge_浏览器,出现“你的连接不是专用连接提示”,怎么办?.md","raw":"---\nlayout: post\ncid: 334\ntitle: edge 浏览器,出现“你的连接不是专用连接提示”,怎么办?\nslug: >-\n what-should-i-do-if-your-connection-is-not-a-private-connection-prompt-appears-in-edge-browser\ndate: '2022/07/08 09:04:36'\nupdated: '2022/07/08 09:04:36'\nstatus: publish\nauthor: 老孙\ncategories:\n - 分享\ntags:\n - edge\nabbrlink: 25686\nicon:\nthumbnail:\n---\n\n\n调整键盘为英文输入状态,刷新一下页面,鼠标点击当前页面任意位置,然后依次按键:thisisunsafe\n\n按完上面的按键,页面会自动刷新,然后就可以正常访问了。","published":1,"_id":"cln4obygn00bboko04ivg7ado","comments":1,"photos":[],"link":"","content":"

调整键盘为英文输入状态,刷新一下页面,鼠标点击当前页面任意位置,然后依次按键:thisisunsafe

\n

按完上面的按键,页面会自动刷新,然后就可以正常访问了。

\n","site":{"data":{}},"excerpt":"","more":"

调整键盘为英文输入状态,刷新一下页面,鼠标点击当前页面任意位置,然后依次按键:thisisunsafe

\n

按完上面的按键,页面会自动刷新,然后就可以正常访问了。

\n"},{"abbrlink":"b564ae15","date":"2023-04-07T00:33:27.000Z","excerpt":"关于Qv2ray 在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。 V2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。 其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作...","published":1,"title":"Qv2ray客户端及内核下载","updated":"2023-04-13T07:27:22.000Z","_content":"### 关于Qv2ray\n\n在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。\n\nV2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。\n\n其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作为V2ray/SS/SSR/Trojan客户端使用。\n\n### 支持的协议\n\nVmess(V2ray)\nSS(Shadowsocks)\nSSR(ShadowsocksR)\nTrojan\nTrojan-go\nNaiveProxy\nVless\n\n### 下载\n\n#### 客户端下载\n\nhttps://github.com/Qv2ray/Qv2ray/releases\n\n#### 内核下载\n\nhttps://github.com/v2fly/v2ray-core/releases/tag/v4.31.0\n\n### 相关文章\n\n- [x-ui:支持多协议多用户的 xray 面板](https://www.sunpeiwen.com/archives/396.html)\n x-ui:支持多协议多用户的 xray 面板\n- [注册Vultr教程和送100美金活动!](https://www.sunpeiwen.com/archives/481.html)\n 可选日本机房延迟低速度快稳定\n","source":"_posts/qv2ray-ke-hu-duan-ji-nei-he-xia-zai.md","raw":"---\nabbrlink: b564ae15\ncategories:\n - - 分享\ndate: '2023-04-07 08:33:27'\nexcerpt: >-\n 关于Qv2ray 在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。\n V2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。\n 其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作...\npublished: true\ntags:\n - V2RAY\n - 梯子\ntitle: Qv2ray客户端及内核下载\nupdated: 'Thu, 13 Apr 2023 07:27:22 GMT'\n---\n### 关于Qv2ray\n\n在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。\n\nV2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。\n\n其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作为V2ray/SS/SSR/Trojan客户端使用。\n\n### 支持的协议\n\nVmess(V2ray)\nSS(Shadowsocks)\nSSR(ShadowsocksR)\nTrojan\nTrojan-go\nNaiveProxy\nVless\n\n### 下载\n\n#### 客户端下载\n\nhttps://github.com/Qv2ray/Qv2ray/releases\n\n#### 内核下载\n\nhttps://github.com/v2fly/v2ray-core/releases/tag/v4.31.0\n\n### 相关文章\n\n- [x-ui:支持多协议多用户的 xray 面板](https://www.sunpeiwen.com/archives/396.html)\n x-ui:支持多协议多用户的 xray 面板\n- [注册Vultr教程和送100美金活动!](https://www.sunpeiwen.com/archives/481.html)\n 可选日本机房延迟低速度快稳定\n","slug":"qv2ray-ke-hu-duan-ji-nei-he-xia-zai","_id":"cln4obygo00beoko0cvrs4xid","comments":1,"layout":"post","photos":[],"link":"","content":"

关于Qv2ray

在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。

\n

V2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。

\n

其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作为V2ray/SS/SSR/Trojan客户端使用。

\n

支持的协议

Vmess(V2ray)
SS(Shadowsocks)
SSR(ShadowsocksR)
Trojan
Trojan-go
NaiveProxy
Vless

\n

下载

客户端下载

https://github.com/Qv2ray/Qv2ray/releases

\n

内核下载

https://github.com/v2fly/v2ray-core/releases/tag/v4.31.0

\n

相关文章

\n","site":{"data":{}},"more":"

关于Qv2ray

在我们常用的PC系统上,比如Windows/Mac/Linux等系统平台,V2ray官方并没有发布图形化的桌面客户端。

\n

V2rayN和Qv2ray等一些第三方工具,在V2ray官方内核的基础上,为我们提供了图形化界面支持,使用起来会更加方便。

\n

其中Qv2ray除了支持V2ray的vmess协议外,还可以通过安装插件的方式,额外增加对SS/SSR/Trojan等代理协议的支持,可作为V2ray/SS/SSR/Trojan客户端使用。

\n

支持的协议

Vmess(V2ray)
SS(Shadowsocks)
SSR(ShadowsocksR)
Trojan
Trojan-go
NaiveProxy
Vless

\n

下载

客户端下载

https://github.com/Qv2ray/Qv2ray/releases

\n

内核下载

https://github.com/v2fly/v2ray-core/releases/tag/v4.31.0

\n

相关文章

\n"},{"abbrlink":"54321412","cover":"https://blogcdn.asbid.cn/2023/01/11/1673403142.png","date":"2023-01-11T02:15:24.000Z","excerpt":" 魔趣的官网已经跳转到马丁龙猪的博客文章 宣布删库跑路。 我也曾刷过魔趣。也捐赠过。 很多人对马丁龙猪褒贬不一。 无论怎么说,这也是一个时代里曾留下过的痕迹了 当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。 ","published":1,"title":"魔趣倒了 安卓的刷机时代正式宣布结束了","updated":"2023-04-13T07:28:45.000Z","_content":"![QQ截图20230111101157.png][1]\n魔趣的官网已经跳转到马丁龙猪的博客文章\n\n宣布删库跑路。\n我也曾刷过魔趣。也捐赠过。\n很多人对马丁龙猪褒贬不一。\n\n无论怎么说,这也是一个时代里曾留下过的痕迹了\n\n当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。\n\n[1]: https://blogcdn.asbid.cn/2023/01/11/1673403142.png\n","source":"_posts/mokee-rom.md","raw":"---\nabbrlink: '54321412'\ncategories: 随笔\ncover: 'https://blogcdn.asbid.cn/2023/01/11/1673403142.png'\ndate: '2023-01-11 10:15:24'\nexcerpt: ' 魔趣的官网已经跳转到马丁龙猪的博客文章 宣布删库跑路。 我也曾刷过魔趣。也捐赠过。 很多人对马丁龙猪褒贬不一。 无论怎么说,这也是一个时代里曾留下过的痕迹了 当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。 '\npublished: true\ntags:\n - 魔趣\n - 安卓\n - 刷机\ntitle: 魔趣倒了 安卓的刷机时代正式宣布结束了\nupdated: 'Thu, 13 Apr 2023 07:28:45 GMT'\n---\n![QQ截图20230111101157.png][1]\n魔趣的官网已经跳转到马丁龙猪的博客文章\n\n宣布删库跑路。\n我也曾刷过魔趣。也捐赠过。\n很多人对马丁龙猪褒贬不一。\n\n无论怎么说,这也是一个时代里曾留下过的痕迹了\n\n当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。\n\n[1]: https://blogcdn.asbid.cn/2023/01/11/1673403142.png\n","slug":"mokee-rom","_id":"cln4obygo00bhoko0ff58cnor","comments":1,"layout":"post","photos":[],"link":"","content":"

\"QQ截图20230111101157.png\"
魔趣的官网已经跳转到马丁龙猪的博客文章

\n

宣布删库跑路。
我也曾刷过魔趣。也捐赠过。
很多人对马丁龙猪褒贬不一。

\n

无论怎么说,这也是一个时代里曾留下过的痕迹了

\n

当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。

\n","site":{"data":{}},"more":"

\"QQ截图20230111101157.png\"
魔趣的官网已经跳转到马丁龙猪的博客文章

\n

宣布删库跑路。
我也曾刷过魔趣。也捐赠过。
很多人对马丁龙猪褒贬不一。

\n

无论怎么说,这也是一个时代里曾留下过的痕迹了

\n

当年的MIUI,乐蛙,yunos等等也只有MIUI活到了现在。

\n"},{"title":"一个时代终将落幕","excerpt":"","abbrlink":15539,"date":"2018-10-30T17:18:49.000Z","_content":"\n惊闻金庸先生去世的消息。 \n\n自此金古梁黄四大家代表的武侠时代落下帷幕。 \n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/682de8655140a4f918512469001bb2f3.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_1024,h_682) \n\nring给我发消息 \n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/Screenshot_2018-10-31-01-08-52-085_com.tencent.mm_.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_512,h_1024) \n\n她始终记得我最喜欢古龙 \n\n但是她可能不知道金庸先生的小说我几乎都读过 \n\n很少联系的我们以后怕是再难相见了吧。 \n\n难忘记那曾陪伴我度过漫长青春岁月的武侠小说 \n\n那也是我的青春 \n\n飞雪连天射白鹿。 笑书神侠倚碧鸳。 \n\n金庸先生千古!","source":"_posts/一个时代终将落幕.md","raw":"---\ntitle: 一个时代终将落幕\ntags:\n - 武侠\n - 生活\n - 金庸\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 15539\ndate: 2018-10-31 01:18:49\n---\n\n惊闻金庸先生去世的消息。 \n\n自此金古梁黄四大家代表的武侠时代落下帷幕。 \n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/682de8655140a4f918512469001bb2f3.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_1024,h_682) \n\nring给我发消息 \n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/Screenshot_2018-10-31-01-08-52-085_com.tencent.mm_.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_512,h_1024) \n\n她始终记得我最喜欢古龙 \n\n但是她可能不知道金庸先生的小说我几乎都读过 \n\n很少联系的我们以后怕是再难相见了吧。 \n\n难忘记那曾陪伴我度过漫长青春岁月的武侠小说 \n\n那也是我的青春 \n\n飞雪连天射白鹿。 笑书神侠倚碧鸳。 \n\n金庸先生千古!","slug":"一个时代终将落幕","published":1,"updated":"2023-09-30T02:59:46.517Z","_id":"cln4obygp00bkoko03c7x68kt","comments":1,"layout":"post","photos":[],"link":"","content":"

惊闻金庸先生去世的消息。

\n

自此金古梁黄四大家代表的武侠时代落下帷幕。

\n

ring给我发消息

\n

\n

她始终记得我最喜欢古龙

\n

但是她可能不知道金庸先生的小说我几乎都读过

\n

很少联系的我们以后怕是再难相见了吧。

\n

难忘记那曾陪伴我度过漫长青春岁月的武侠小说

\n

那也是我的青春

\n

飞雪连天射白鹿。 笑书神侠倚碧鸳。

\n

金庸先生千古!

\n","site":{"data":{}},"more":"

惊闻金庸先生去世的消息。

\n

自此金古梁黄四大家代表的武侠时代落下帷幕。

\n

ring给我发消息

\n

\n

她始终记得我最喜欢古龙

\n

但是她可能不知道金庸先生的小说我几乎都读过

\n

很少联系的我们以后怕是再难相见了吧。

\n

难忘记那曾陪伴我度过漫长青春岁月的武侠小说

\n

那也是我的青春

\n

飞雪连天射白鹿。 笑书神侠倚碧鸳。

\n

金庸先生千古!

\n"},{"title":"一周之始","excerpt":"","abbrlink":65173,"date":"2011-08-08T11:44:32.000Z","_content":"\n今天8月8号,星期一。\n\n立秋。\n\n网络上有人称今天是爸爸节。 \n\n清早起床去拱北转车。\n\n这时天还下着小雨。 \n\n如同往常,会在拱北车站买一份炒河粉做早餐,然后在巴士站坐等31路。 \n\n珠海的公交车一直都很多人,降价之后的公交车挤得更加密不透风。 \n\n都是上班的人们。\n\n赶时间,拼命的往车上塞。\n\n就像自己家灌香肠一样,使劲往里塞肉。 \n\n我喜欢看着这些行色匆匆的路人。\n\n尽管我觉得这样会很拥挤。 \n\n八点二十到了站,天已经晴了。\n\n太阳有些晒人。 不得不顶着阳光去往公司的方向。\n\n颇有段距离。\n\n刚好在八点半的时候到达公司打卡。 \n\n上班的环境的确不怎么样。 \n\n一进实验室热浪扑面而来。\n\n这样的情况之下任谁都会抱怨。\n\n小公司就这点,爱斤斤计较。 \n\n空调坏了能用就行,也不修。\n\n一点都不制冷。也不管。 \n\n热。闷热。 \n\n热的我实在都懒得动了。 \n\n边插科打诨的聊天打屁,边动动手打印几张图片,调几个墨水上机测试一下,然后写打印测试报告。 \n\n好了。\n\n就这样一天过去了。 \n\n多么充实的一天啊。\n\n过的真他妈有意义。 \n\nPS 今天是爸爸节的话,我就祝我老爸身体健康长命百岁。 \n\n虽然儿子不太听话经常惹你生气。 \n\n可儿子长大了。\n\n您能别管的事就尽量别管了吧。 \n\n气坏了身子,儿子也愧疚。","source":"_posts/一周之始.md","raw":"---\ntitle: 一周之始\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 65173\ndate: 2011-08-08 19:44:32\n---\n\n今天8月8号,星期一。\n\n立秋。\n\n网络上有人称今天是爸爸节。 \n\n清早起床去拱北转车。\n\n这时天还下着小雨。 \n\n如同往常,会在拱北车站买一份炒河粉做早餐,然后在巴士站坐等31路。 \n\n珠海的公交车一直都很多人,降价之后的公交车挤得更加密不透风。 \n\n都是上班的人们。\n\n赶时间,拼命的往车上塞。\n\n就像自己家灌香肠一样,使劲往里塞肉。 \n\n我喜欢看着这些行色匆匆的路人。\n\n尽管我觉得这样会很拥挤。 \n\n八点二十到了站,天已经晴了。\n\n太阳有些晒人。 不得不顶着阳光去往公司的方向。\n\n颇有段距离。\n\n刚好在八点半的时候到达公司打卡。 \n\n上班的环境的确不怎么样。 \n\n一进实验室热浪扑面而来。\n\n这样的情况之下任谁都会抱怨。\n\n小公司就这点,爱斤斤计较。 \n\n空调坏了能用就行,也不修。\n\n一点都不制冷。也不管。 \n\n热。闷热。 \n\n热的我实在都懒得动了。 \n\n边插科打诨的聊天打屁,边动动手打印几张图片,调几个墨水上机测试一下,然后写打印测试报告。 \n\n好了。\n\n就这样一天过去了。 \n\n多么充实的一天啊。\n\n过的真他妈有意义。 \n\nPS 今天是爸爸节的话,我就祝我老爸身体健康长命百岁。 \n\n虽然儿子不太听话经常惹你生气。 \n\n可儿子长大了。\n\n您能别管的事就尽量别管了吧。 \n\n气坏了身子,儿子也愧疚。","slug":"一周之始","published":1,"updated":"2023-09-30T02:59:46.517Z","_id":"cln4obygp00bmoko06e55e2qs","comments":1,"layout":"post","photos":[],"link":"","content":"

今天8月8号,星期一。

\n

立秋。

\n

网络上有人称今天是爸爸节。

\n

清早起床去拱北转车。

\n

这时天还下着小雨。

\n

如同往常,会在拱北车站买一份炒河粉做早餐,然后在巴士站坐等31路。

\n

珠海的公交车一直都很多人,降价之后的公交车挤得更加密不透风。

\n

都是上班的人们。

\n

赶时间,拼命的往车上塞。

\n

就像自己家灌香肠一样,使劲往里塞肉。

\n

我喜欢看着这些行色匆匆的路人。

\n

尽管我觉得这样会很拥挤。

\n

八点二十到了站,天已经晴了。

\n

太阳有些晒人。 不得不顶着阳光去往公司的方向。

\n

颇有段距离。

\n

刚好在八点半的时候到达公司打卡。

\n

上班的环境的确不怎么样。

\n

一进实验室热浪扑面而来。

\n

这样的情况之下任谁都会抱怨。

\n

小公司就这点,爱斤斤计较。

\n

空调坏了能用就行,也不修。

\n

一点都不制冷。也不管。

\n

热。闷热。

\n

热的我实在都懒得动了。

\n

边插科打诨的聊天打屁,边动动手打印几张图片,调几个墨水上机测试一下,然后写打印测试报告。

\n

好了。

\n

就这样一天过去了。

\n

多么充实的一天啊。

\n

过的真他妈有意义。

\n

PS 今天是爸爸节的话,我就祝我老爸身体健康长命百岁。

\n

虽然儿子不太听话经常惹你生气。

\n

可儿子长大了。

\n

您能别管的事就尽量别管了吧。

\n

气坏了身子,儿子也愧疚。

\n","site":{"data":{}},"more":"

今天8月8号,星期一。

\n

立秋。

\n

网络上有人称今天是爸爸节。

\n

清早起床去拱北转车。

\n

这时天还下着小雨。

\n

如同往常,会在拱北车站买一份炒河粉做早餐,然后在巴士站坐等31路。

\n

珠海的公交车一直都很多人,降价之后的公交车挤得更加密不透风。

\n

都是上班的人们。

\n

赶时间,拼命的往车上塞。

\n

就像自己家灌香肠一样,使劲往里塞肉。

\n

我喜欢看着这些行色匆匆的路人。

\n

尽管我觉得这样会很拥挤。

\n

八点二十到了站,天已经晴了。

\n

太阳有些晒人。 不得不顶着阳光去往公司的方向。

\n

颇有段距离。

\n

刚好在八点半的时候到达公司打卡。

\n

上班的环境的确不怎么样。

\n

一进实验室热浪扑面而来。

\n

这样的情况之下任谁都会抱怨。

\n

小公司就这点,爱斤斤计较。

\n

空调坏了能用就行,也不修。

\n

一点都不制冷。也不管。

\n

热。闷热。

\n

热的我实在都懒得动了。

\n

边插科打诨的聊天打屁,边动动手打印几张图片,调几个墨水上机测试一下,然后写打印测试报告。

\n

好了。

\n

就这样一天过去了。

\n

多么充实的一天啊。

\n

过的真他妈有意义。

\n

PS 今天是爸爸节的话,我就祝我老爸身体健康长命百岁。

\n

虽然儿子不太听话经常惹你生气。

\n

可儿子长大了。

\n

您能别管的事就尽量别管了吧。

\n

气坏了身子,儿子也愧疚。

\n"},{"title":"上海","excerpt":"","abbrlink":63050,"date":"2017-12-31T03:17:24.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2017/12/wx_camera_151463479906610797492.jpg) \n时隔十年再次回到了上海! \n老二在上海据说混的还可以… \n过完年不在上海大概就要去深圳了… \n中午吃完饭就去找老二,他今天竟然还在加班…","source":"_posts/上海.md","raw":"---\ntitle: 上海\ntags:\n - 上海\n - 影像\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 63050\ndate: 2017-12-31 11:17:24\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2017/12/wx_camera_151463479906610797492.jpg) \n时隔十年再次回到了上海! \n老二在上海据说混的还可以… \n过完年不在上海大概就要去深圳了… \n中午吃完饭就去找老二,他今天竟然还在加班…","slug":"上海","published":1,"updated":"2023-09-30T02:59:46.517Z","_id":"cln4obygp00bpoko04ksq9jyj","comments":1,"layout":"post","photos":[],"link":"","content":"


时隔十年再次回到了上海!
老二在上海据说混的还可以…
过完年不在上海大概就要去深圳了…
中午吃完饭就去找老二,他今天竟然还在加班…

\n","site":{"data":{}},"more":"


时隔十年再次回到了上海!
老二在上海据说混的还可以…
过完年不在上海大概就要去深圳了…
中午吃完饭就去找老二,他今天竟然还在加班…

\n"},{"title":"中元节","excerpt":"","abbrlink":17944,"date":"2011-08-14T06:45:22.000Z","_content":"\n今天中元节。\n\n农历七月十五是_中元节_,又称鬼节、_盂兰盆节_ \n\n道家全年的盛会分三次(合称为\"三元\"),认为\"三元\"就是天官、地官及水官\"三官\"的别称,正月十五、七月十五以及十月十五各为三官大帝的诞辰。\n\n根据五杂俎的记载:\"道经以正月十五日为上元,七月十五日为中元,十月十五日为下元。\"\n\n正月十五日称为\"上元\",主要是举行赐福的仪式;\n\n七月十五日称为\"中元\",用以赦免亡魂的罪(中元法事是为亡魂赦罪,但是绝对不能完全解除罪孽,只是减轻了一些,希望他们早日安息。);\n\n十月十五日称为\"下元\",则是为有过失的人解除厄运。\n\n道教《太上三官经》云:\"天官赐福,地官赦罪,水官解厄\",\"一切众生皆是天、地、水官统摄\"。\n\n中元节时,道教宫观如地安门火神庙、西便门外白云观为了祈祷\"风调雨顺、国泰民安\"照例举办\"祈福吉祥道场\"。\n\n因为惧厉的心理,民众于日常生活中复合儒、佛、道三教,成为农历7月15日的中元节,民间则称农历7月为\"鬼月\"。    \n\n佛教传入后,佛教徒根据印度一种佛教仪式追荐祖先,佛教也在这一天,举行超渡法会,称为\"屋兰玛纳\"(印度话ULLAMBANA)也就是\"孟兰会\"。\n\n孟兰盆的意义是倒悬,人生的痛苦有如倒挂在树头上的蝙蝠,悬挂著、苦不堪言。\n\n为了使众生免於倒悬之苦,便需要诵经,布绝食物给孤魂野鬼。\n\n此举正好和中国的鬼月祭拜不谋而合,因而中元节和孟兰会便同时流传下来。","source":"_posts/中元节.md","raw":"---\ntitle: 中元节\ntags:\n - 中元节\n - 鬼节\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 17944\ndate: 2011-08-14 14:45:22\n---\n\n今天中元节。\n\n农历七月十五是_中元节_,又称鬼节、_盂兰盆节_ \n\n道家全年的盛会分三次(合称为\"三元\"),认为\"三元\"就是天官、地官及水官\"三官\"的别称,正月十五、七月十五以及十月十五各为三官大帝的诞辰。\n\n根据五杂俎的记载:\"道经以正月十五日为上元,七月十五日为中元,十月十五日为下元。\"\n\n正月十五日称为\"上元\",主要是举行赐福的仪式;\n\n七月十五日称为\"中元\",用以赦免亡魂的罪(中元法事是为亡魂赦罪,但是绝对不能完全解除罪孽,只是减轻了一些,希望他们早日安息。);\n\n十月十五日称为\"下元\",则是为有过失的人解除厄运。\n\n道教《太上三官经》云:\"天官赐福,地官赦罪,水官解厄\",\"一切众生皆是天、地、水官统摄\"。\n\n中元节时,道教宫观如地安门火神庙、西便门外白云观为了祈祷\"风调雨顺、国泰民安\"照例举办\"祈福吉祥道场\"。\n\n因为惧厉的心理,民众于日常生活中复合儒、佛、道三教,成为农历7月15日的中元节,民间则称农历7月为\"鬼月\"。    \n\n佛教传入后,佛教徒根据印度一种佛教仪式追荐祖先,佛教也在这一天,举行超渡法会,称为\"屋兰玛纳\"(印度话ULLAMBANA)也就是\"孟兰会\"。\n\n孟兰盆的意义是倒悬,人生的痛苦有如倒挂在树头上的蝙蝠,悬挂著、苦不堪言。\n\n为了使众生免於倒悬之苦,便需要诵经,布绝食物给孤魂野鬼。\n\n此举正好和中国的鬼月祭拜不谋而合,因而中元节和孟兰会便同时流传下来。","slug":"中元节","published":1,"updated":"2023-09-30T02:59:46.517Z","_id":"cln4obygq00bsoko0b3m95fuz","comments":1,"layout":"post","photos":[],"link":"","content":"

今天中元节。

\n

农历七月十五是_中元节_,又称鬼节、盂兰盆节

\n

道家全年的盛会分三次(合称为”三元”),认为”三元”就是天官、地官及水官”三官”的别称,正月十五、七月十五以及十月十五各为三官大帝的诞辰。

\n

根据五杂俎的记载:”道经以正月十五日为上元,七月十五日为中元,十月十五日为下元。”

\n

正月十五日称为”上元”,主要是举行赐福的仪式;

\n

七月十五日称为”中元”,用以赦免亡魂的罪(中元法事是为亡魂赦罪,但是绝对不能完全解除罪孽,只是减轻了一些,希望他们早日安息。);

\n

十月十五日称为”下元”,则是为有过失的人解除厄运。

\n

道教《太上三官经》云:”天官赐福,地官赦罪,水官解厄”,”一切众生皆是天、地、水官统摄”。

\n

中元节时,道教宫观如地安门火神庙、西便门外白云观为了祈祷”风调雨顺、国泰民安”照例举办”祈福吉祥道场”。

\n

因为惧厉的心理,民众于日常生活中复合儒、佛、道三教,成为农历7月15日的中元节,民间则称农历7月为”鬼月”。    

\n

佛教传入后,佛教徒根据印度一种佛教仪式追荐祖先,佛教也在这一天,举行超渡法会,称为”屋兰玛纳”(印度话ULLAMBANA)也就是”孟兰会”。

\n

孟兰盆的意义是倒悬,人生的痛苦有如倒挂在树头上的蝙蝠,悬挂著、苦不堪言。

\n

为了使众生免於倒悬之苦,便需要诵经,布绝食物给孤魂野鬼。

\n

此举正好和中国的鬼月祭拜不谋而合,因而中元节和孟兰会便同时流传下来。

\n","site":{"data":{}},"more":"

今天中元节。

\n

农历七月十五是_中元节_,又称鬼节、盂兰盆节

\n

道家全年的盛会分三次(合称为”三元”),认为”三元”就是天官、地官及水官”三官”的别称,正月十五、七月十五以及十月十五各为三官大帝的诞辰。

\n

根据五杂俎的记载:”道经以正月十五日为上元,七月十五日为中元,十月十五日为下元。”

\n

正月十五日称为”上元”,主要是举行赐福的仪式;

\n

七月十五日称为”中元”,用以赦免亡魂的罪(中元法事是为亡魂赦罪,但是绝对不能完全解除罪孽,只是减轻了一些,希望他们早日安息。);

\n

十月十五日称为”下元”,则是为有过失的人解除厄运。

\n

道教《太上三官经》云:”天官赐福,地官赦罪,水官解厄”,”一切众生皆是天、地、水官统摄”。

\n

中元节时,道教宫观如地安门火神庙、西便门外白云观为了祈祷”风调雨顺、国泰民安”照例举办”祈福吉祥道场”。

\n

因为惧厉的心理,民众于日常生活中复合儒、佛、道三教,成为农历7月15日的中元节,民间则称农历7月为”鬼月”。    

\n

佛教传入后,佛教徒根据印度一种佛教仪式追荐祖先,佛教也在这一天,举行超渡法会,称为”屋兰玛纳”(印度话ULLAMBANA)也就是”孟兰会”。

\n

孟兰盆的意义是倒悬,人生的痛苦有如倒挂在树头上的蝙蝠,悬挂著、苦不堪言。

\n

为了使众生免於倒悬之苦,便需要诵经,布绝食物给孤魂野鬼。

\n

此举正好和中国的鬼月祭拜不谋而合,因而中元节和孟兰会便同时流传下来。

\n"},{"title":"下雨了","excerpt":"","abbrlink":28203,"date":"2018-01-06T03:04:19.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/01/IMG_20180106_102356.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n\n老家下雪了。\n珠海下雨了。 \n最近更新博客勤了许多。 \n可能是太闲了。 \n人都发霉了。 \n辞职了。 \n在同事的挽留下决定做到这个月20号办理离职。 \n之后或许会去上海工作。 \n也可能去深圳。 \n还是需要看看深圳这边的条件是什么。","source":"_posts/下雨了.md","raw":"---\ntitle: 下雨了\ntags:\n - 影像\n - 珠海\n - 雨天\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 28203\ndate: 2018-01-06 11:04:19\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/01/IMG_20180106_102356.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n\n老家下雪了。\n珠海下雨了。 \n最近更新博客勤了许多。 \n可能是太闲了。 \n人都发霉了。 \n辞职了。 \n在同事的挽留下决定做到这个月20号办理离职。 \n之后或许会去上海工作。 \n也可能去深圳。 \n还是需要看看深圳这边的条件是什么。","slug":"下雨了","published":1,"updated":"2023-09-30T02:59:46.517Z","_id":"cln4obygq00bvoko03fm2af8w","comments":1,"layout":"post","photos":[],"link":"","content":"

\n

老家下雪了。
珠海下雨了。
最近更新博客勤了许多。
可能是太闲了。
人都发霉了。
辞职了。
在同事的挽留下决定做到这个月20号办理离职。
之后或许会去上海工作。
也可能去深圳。
还是需要看看深圳这边的条件是什么。

\n","site":{"data":{}},"more":"

\n

老家下雪了。
珠海下雨了。
最近更新博客勤了许多。
可能是太闲了。
人都发霉了。
辞职了。
在同事的挽留下决定做到这个月20号办理离职。
之后或许会去上海工作。
也可能去深圳。
还是需要看看深圳这边的条件是什么。

\n"},{"title":"中国式相亲之现状","excerpt":"","abbrlink":11338,"date":"2019-02-24T09:54:02.000Z","_content":"\n最近芒果台在播的《我家那闺女》\n\n我有在看,我特别喜欢的就是焦俊艳,美丽大方,主要是素颜也非常耐看 \n\n其中所有父亲都焦虑的一个问题 \n\n儿女的婚事 \n\n说到这里最常见的套路莫过于相亲。 \n\n所谓的相亲呢就是原本八竿子打不到一起去的两个人由于媒人这个神奇的存在而有了交集。 \n\n当然我不抗拒相亲,相亲的确是给很多人解决了社交圈子小的问题,但是相亲很多时候存在的意义就是门当户对的思想。\n\n转念一想也没错。\n\n不同的成长环境造成很多人的三观未必一致。\n\n降低风险。 \n\n最让我不能容忍的网络上的个别思想。 \n\n认为学历低就是别人挑剩下来的。\n\n这种人有种莫名的优越感认为自己就应该卖个价钱的感觉。\n\n就好像在说我是你用不起的女人。 \n\n这奇葩的观点我真是不敢苟同。 \n\n很多高学历的人反而会更加慎重的对待自己的婚姻。 \n\n虽说婚姻与爱情不能混为一谈,但是爱情毕竟是基础。 \n\n相亲中的男女就好似在做买卖。 \n\n我有房有车有学历有工作有存款你有啥 \n\n说难听点一个像货比三家另外一个像待价而沽 \n\n真。买卖婚姻是也","source":"_posts/中国式相亲之现状.md","raw":"---\ntitle: 中国式相亲之现状\ntags:\n - 中国\n - 吐槽\n - 相亲\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 11338\ndate: 2019-02-24 17:54:02\n---\n\n最近芒果台在播的《我家那闺女》\n\n我有在看,我特别喜欢的就是焦俊艳,美丽大方,主要是素颜也非常耐看 \n\n其中所有父亲都焦虑的一个问题 \n\n儿女的婚事 \n\n说到这里最常见的套路莫过于相亲。 \n\n所谓的相亲呢就是原本八竿子打不到一起去的两个人由于媒人这个神奇的存在而有了交集。 \n\n当然我不抗拒相亲,相亲的确是给很多人解决了社交圈子小的问题,但是相亲很多时候存在的意义就是门当户对的思想。\n\n转念一想也没错。\n\n不同的成长环境造成很多人的三观未必一致。\n\n降低风险。 \n\n最让我不能容忍的网络上的个别思想。 \n\n认为学历低就是别人挑剩下来的。\n\n这种人有种莫名的优越感认为自己就应该卖个价钱的感觉。\n\n就好像在说我是你用不起的女人。 \n\n这奇葩的观点我真是不敢苟同。 \n\n很多高学历的人反而会更加慎重的对待自己的婚姻。 \n\n虽说婚姻与爱情不能混为一谈,但是爱情毕竟是基础。 \n\n相亲中的男女就好似在做买卖。 \n\n我有房有车有学历有工作有存款你有啥 \n\n说难听点一个像货比三家另外一个像待价而沽 \n\n真。买卖婚姻是也","slug":"中国式相亲之现状","published":1,"updated":"2023-09-30T02:59:46.517Z","_id":"cln4obygr00byoko0f9geg7qr","comments":1,"layout":"post","photos":[],"link":"","content":"

最近芒果台在播的《我家那闺女》

\n

我有在看,我特别喜欢的就是焦俊艳,美丽大方,主要是素颜也非常耐看

\n

其中所有父亲都焦虑的一个问题

\n

儿女的婚事

\n

说到这里最常见的套路莫过于相亲。

\n

所谓的相亲呢就是原本八竿子打不到一起去的两个人由于媒人这个神奇的存在而有了交集。

\n

当然我不抗拒相亲,相亲的确是给很多人解决了社交圈子小的问题,但是相亲很多时候存在的意义就是门当户对的思想。

\n

转念一想也没错。

\n

不同的成长环境造成很多人的三观未必一致。

\n

降低风险。

\n

最让我不能容忍的网络上的个别思想。

\n

认为学历低就是别人挑剩下来的。

\n

这种人有种莫名的优越感认为自己就应该卖个价钱的感觉。

\n

就好像在说我是你用不起的女人。

\n

这奇葩的观点我真是不敢苟同。

\n

很多高学历的人反而会更加慎重的对待自己的婚姻。

\n

虽说婚姻与爱情不能混为一谈,但是爱情毕竟是基础。

\n

相亲中的男女就好似在做买卖。

\n

我有房有车有学历有工作有存款你有啥

\n

说难听点一个像货比三家另外一个像待价而沽

\n

真。买卖婚姻是也

\n","site":{"data":{}},"more":"

最近芒果台在播的《我家那闺女》

\n

我有在看,我特别喜欢的就是焦俊艳,美丽大方,主要是素颜也非常耐看

\n

其中所有父亲都焦虑的一个问题

\n

儿女的婚事

\n

说到这里最常见的套路莫过于相亲。

\n

所谓的相亲呢就是原本八竿子打不到一起去的两个人由于媒人这个神奇的存在而有了交集。

\n

当然我不抗拒相亲,相亲的确是给很多人解决了社交圈子小的问题,但是相亲很多时候存在的意义就是门当户对的思想。

\n

转念一想也没错。

\n

不同的成长环境造成很多人的三观未必一致。

\n

降低风险。

\n

最让我不能容忍的网络上的个别思想。

\n

认为学历低就是别人挑剩下来的。

\n

这种人有种莫名的优越感认为自己就应该卖个价钱的感觉。

\n

就好像在说我是你用不起的女人。

\n

这奇葩的观点我真是不敢苟同。

\n

很多高学历的人反而会更加慎重的对待自己的婚姻。

\n

虽说婚姻与爱情不能混为一谈,但是爱情毕竟是基础。

\n

相亲中的男女就好似在做买卖。

\n

我有房有车有学历有工作有存款你有啥

\n

说难听点一个像货比三家另外一个像待价而沽

\n

真。买卖婚姻是也

\n"},{"title":"中秋节快乐","excerpt":"","abbrlink":17218,"date":"2011-09-12T15:56:37.000Z","_content":"\n睡到中午起床。 \n\n到姨奶奶家吃饭。\n\n喝了一两茅台,倒了。 \n\n睡到三四点。 \n\n打了2局麻将输了四十五。 \n\n陪表妹玩没有规则的围棋。 \n\n超没意思。 \n\n吃完晚饭,站在17层的高楼之上看澳门的烟火。 \n\n虽然很绚烂,只是一瞬间罢了。 \n\n虽然现在很晚很晚了。 \n\n在2011中秋节结束之前,我祝愿我父母的身体能够好起来,我祝愿我的外公外婆身体健康。 \n\n我祝愿我的亲戚朋友都能够万事如意。 \n\n如同我小表妹说的,我祝你们都学习进步…… - -!","source":"_posts/中秋节快乐.md","raw":"---\ntitle: 中秋节快乐\ntags:\n - 中秋节\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 17218\ndate: 2011-09-12 23:56:37\n---\n\n睡到中午起床。 \n\n到姨奶奶家吃饭。\n\n喝了一两茅台,倒了。 \n\n睡到三四点。 \n\n打了2局麻将输了四十五。 \n\n陪表妹玩没有规则的围棋。 \n\n超没意思。 \n\n吃完晚饭,站在17层的高楼之上看澳门的烟火。 \n\n虽然很绚烂,只是一瞬间罢了。 \n\n虽然现在很晚很晚了。 \n\n在2011中秋节结束之前,我祝愿我父母的身体能够好起来,我祝愿我的外公外婆身体健康。 \n\n我祝愿我的亲戚朋友都能够万事如意。 \n\n如同我小表妹说的,我祝你们都学习进步…… - -!","slug":"中秋节快乐","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygr00c2oko0g5g17r02","comments":1,"layout":"post","photos":[],"link":"","content":"

睡到中午起床。

\n

到姨奶奶家吃饭。

\n

喝了一两茅台,倒了。

\n

睡到三四点。

\n

打了2局麻将输了四十五。

\n

陪表妹玩没有规则的围棋。

\n

超没意思。

\n

吃完晚饭,站在17层的高楼之上看澳门的烟火。

\n

虽然很绚烂,只是一瞬间罢了。

\n

虽然现在很晚很晚了。

\n

在2011中秋节结束之前,我祝愿我父母的身体能够好起来,我祝愿我的外公外婆身体健康。

\n

我祝愿我的亲戚朋友都能够万事如意。

\n

如同我小表妹说的,我祝你们都学习进步…… - -!

\n","site":{"data":{}},"more":"

睡到中午起床。

\n

到姨奶奶家吃饭。

\n

喝了一两茅台,倒了。

\n

睡到三四点。

\n

打了2局麻将输了四十五。

\n

陪表妹玩没有规则的围棋。

\n

超没意思。

\n

吃完晚饭,站在17层的高楼之上看澳门的烟火。

\n

虽然很绚烂,只是一瞬间罢了。

\n

虽然现在很晚很晚了。

\n

在2011中秋节结束之前,我祝愿我父母的身体能够好起来,我祝愿我的外公外婆身体健康。

\n

我祝愿我的亲戚朋友都能够万事如意。

\n

如同我小表妹说的,我祝你们都学习进步…… - -!

\n"},{"title":"估计也只有QQ邮箱记得今天是什么日子","excerpt":"","abbrlink":36456,"date":"2018-07-27T02:29:52.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/07/Screenshot_2018-07-27-10-02-57-231_com.tencent.mobileqq.png?x-oss-process=image/resize,m_fill,w_512,h_1024) 连我自己都忘记了。 看来年纪越大越不想记起自己年龄这回事","source":"_posts/估计也只有QQ邮箱记得今天是什么日子.md","raw":"---\ntitle: 估计也只有QQ邮箱记得今天是什么日子\ntags:\n - 生日\n - 生活\nexcerpt: ''\ncategories: 随笔\nabbrlink: 36456\ndate: 2018-07-27 10:29:52\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/07/Screenshot_2018-07-27-10-02-57-231_com.tencent.mobileqq.png?x-oss-process=image/resize,m_fill,w_512,h_1024) 连我自己都忘记了。 看来年纪越大越不想记起自己年龄这回事","slug":"估计也只有QQ邮箱记得今天是什么日子","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygr00c5oko05iw6cb5r","comments":1,"layout":"post","photos":[],"link":"","content":"

连我自己都忘记了。 看来年纪越大越不想记起自己年龄这回事

\n","site":{"data":{}},"more":"

连我自己都忘记了。 看来年纪越大越不想记起自己年龄这回事

\n"},{"title":"你好2018","excerpt":"","abbrlink":31224,"date":"2018-01-02T04:25:57.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/01/wx_camera_15148204218371171678685.jpg) 新的一年终于还是来了。 昨天刚从上海赶回来,到宿舍已经是接近十二点钟了。匆匆洗了洗,就睡了。 这次的上海之行,总体来说还是挺满意的。看到了许久不见的好朋友老二,还见到了聊了很久的小萱萱。 小萱萱真的很可爱,还给我准备了礼物,可我来去匆匆的,都没准备,再加上我这直男审美,真不知道她会喜欢什么礼物。我先自我原谅一波。但心里还是很愧疚。 老二所在的公司我去看了。挺大的园区,就是离萱萱的学校远了一些。老二希望我留在上海一起工作。我手头上事情还没处理说,只能告诉他过完春节再决定去哪里。 眼下只有努力工作。至于提升自我价值,目前还在思考。 今年是我外婆去世三周年的日子,依照我们当地的习俗,今年是要给我外婆立碑的。所以我们这些后辈应该都是要回去老家的。 我不想在家逗留。实在是因为混的不怎么好。抵挡不住村里人的议论纷纷。 2018年我希望所有的一切都顺利。 我的家人都健康。 不求闻达于诸侯,只求无愧于心。","source":"_posts/你好2018.md","raw":"---\ntitle: 你好2018\ntags:\n - '2018'\n - 上海\n - 新年\n - 生活\n - 规划\n - 过年\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 31224\ndate: 2018-01-02 12:25:57\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/01/wx_camera_15148204218371171678685.jpg) 新的一年终于还是来了。 昨天刚从上海赶回来,到宿舍已经是接近十二点钟了。匆匆洗了洗,就睡了。 这次的上海之行,总体来说还是挺满意的。看到了许久不见的好朋友老二,还见到了聊了很久的小萱萱。 小萱萱真的很可爱,还给我准备了礼物,可我来去匆匆的,都没准备,再加上我这直男审美,真不知道她会喜欢什么礼物。我先自我原谅一波。但心里还是很愧疚。 老二所在的公司我去看了。挺大的园区,就是离萱萱的学校远了一些。老二希望我留在上海一起工作。我手头上事情还没处理说,只能告诉他过完春节再决定去哪里。 眼下只有努力工作。至于提升自我价值,目前还在思考。 今年是我外婆去世三周年的日子,依照我们当地的习俗,今年是要给我外婆立碑的。所以我们这些后辈应该都是要回去老家的。 我不想在家逗留。实在是因为混的不怎么好。抵挡不住村里人的议论纷纷。 2018年我希望所有的一切都顺利。 我的家人都健康。 不求闻达于诸侯,只求无愧于心。","slug":"你好2018","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygs00c8oko05vou10rf","comments":1,"layout":"post","photos":[],"link":"","content":"

新的一年终于还是来了。 昨天刚从上海赶回来,到宿舍已经是接近十二点钟了。匆匆洗了洗,就睡了。 这次的上海之行,总体来说还是挺满意的。看到了许久不见的好朋友老二,还见到了聊了很久的小萱萱。 小萱萱真的很可爱,还给我准备了礼物,可我来去匆匆的,都没准备,再加上我这直男审美,真不知道她会喜欢什么礼物。我先自我原谅一波。但心里还是很愧疚。 老二所在的公司我去看了。挺大的园区,就是离萱萱的学校远了一些。老二希望我留在上海一起工作。我手头上事情还没处理说,只能告诉他过完春节再决定去哪里。 眼下只有努力工作。至于提升自我价值,目前还在思考。 今年是我外婆去世三周年的日子,依照我们当地的习俗,今年是要给我外婆立碑的。所以我们这些后辈应该都是要回去老家的。 我不想在家逗留。实在是因为混的不怎么好。抵挡不住村里人的议论纷纷。 2018年我希望所有的一切都顺利。 我的家人都健康。 不求闻达于诸侯,只求无愧于心。

\n","site":{"data":{}},"more":"

新的一年终于还是来了。 昨天刚从上海赶回来,到宿舍已经是接近十二点钟了。匆匆洗了洗,就睡了。 这次的上海之行,总体来说还是挺满意的。看到了许久不见的好朋友老二,还见到了聊了很久的小萱萱。 小萱萱真的很可爱,还给我准备了礼物,可我来去匆匆的,都没准备,再加上我这直男审美,真不知道她会喜欢什么礼物。我先自我原谅一波。但心里还是很愧疚。 老二所在的公司我去看了。挺大的园区,就是离萱萱的学校远了一些。老二希望我留在上海一起工作。我手头上事情还没处理说,只能告诉他过完春节再决定去哪里。 眼下只有努力工作。至于提升自我价值,目前还在思考。 今年是我外婆去世三周年的日子,依照我们当地的习俗,今年是要给我外婆立碑的。所以我们这些后辈应该都是要回去老家的。 我不想在家逗留。实在是因为混的不怎么好。抵挡不住村里人的议论纷纷。 2018年我希望所有的一切都顺利。 我的家人都健康。 不求闻达于诸侯,只求无愧于心。

\n"},{"title":"使用 Docker 构建 Pleroma 实例","abbrlink":"e48ebe86","date":"2023-07-24T13:57:00.000Z","cover":null,"_content":"\nPleroma 是一个去中心化的社区程序,其基于 ActivityPub 协议。\n而 ActivityPub 包括 Mastodon(Pawoo 等)、Misskey(misskey.io 等)、Pleroma 等等。\n在这些开源产品中,Pleroma 实机上部署环境步骤复杂繁琐。\n但它是对服务器性能要求最低的微博客工具,它的配置要求多低呢?\n现在 docker 的出现大大简化了部署的方式,只需要简单三步即可轻松搭建实例。\n\n本文将介绍如何使用 docker 构建 Pleroma 实例。\n以宝塔面板为例\n### 先安装docker\n在应用商店中查找docker并安装\n### 获取 docker-compose.yml 模板\n```\ngit clone https://git.pleroma.social/pleroma/pleroma-docker-compose.git\ncd pleroma-docker-compose \n```\n接下来所有操作(除 nginx 配置)如果没有加以说明都在这个目录下进行。\n### 需要修改的内容\n打开`./enviroments/pleroma/pleroma.env`,修改其中的配置:\n```\nDB_USER=pleroma # 数据库用户名\nDB_PASS=pleroma # 数据库密码\nDB_HOST=pleroma-db # 数据库地址\nDB_NAME=pleroma # 数据库名\nINSTANCE_NAME=Pleroma # 实例名\nADMIN_EMAIL=admin@ops.pleroma.social # 管理员邮箱\nNOTIFY_EMAIL=pleroma+admin@ops.pleroma.social # 通知邮箱\nDOMAIN=s.pwq.app # 实例域名\nPORT=4000 # 实例运行端口\n```\n只需要修改域名和邮箱即可\n打开`./volumes/pleroma/config.exs`\n在下面添加\n```\nimport Config\nconfig :pleroma, configurable_from_database: true\n```\n### 启动容器\n随后运行 \n```\ndocker-compose up -d\n```\n启动容器。\n### 添加反向代理\n```\n#PROXY-START/\n\nlocation ^~ /\n{\n # 4000 是你的实例容器运行端口,如果你修改过,记得改成你的端口。\n proxy_pass http://127.0.0.1:4000;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header REMOTE-HOST $remote_addr;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n # proxy_hide_header Upgrade;\n}\n```\n### 创建管理员账户\n```\ndocker exec -it pleroma ./opt/pleroma/bin/pleroma_ctl user new admin 邮箱 --admin\n```\n运行后会出现一个链接,复制在浏览器即可重置密码.\n### 修改文件夹权限\n`/root/pleroma-docker-compose/volumes/pleroma`下的`uploads`权限设置为`777`\n当然如果你用S3协议的对象存储则不需要修改\n直接在后台设置S3即可.\n\n### 演示地址\nhttps://chaihu.top\n","source":"_posts/使用 Docker 构建 Pleroma 实例.md","raw":"---\ntitle: 使用 Docker 构建 Pleroma 实例\ntags:\n - Docker\n - Pleroma\ncategories: 推荐\nabbrlink: e48ebe86\ndate: 2023-07-24 21:57:00\ncover:\n---\n\nPleroma 是一个去中心化的社区程序,其基于 ActivityPub 协议。\n而 ActivityPub 包括 Mastodon(Pawoo 等)、Misskey(misskey.io 等)、Pleroma 等等。\n在这些开源产品中,Pleroma 实机上部署环境步骤复杂繁琐。\n但它是对服务器性能要求最低的微博客工具,它的配置要求多低呢?\n现在 docker 的出现大大简化了部署的方式,只需要简单三步即可轻松搭建实例。\n\n本文将介绍如何使用 docker 构建 Pleroma 实例。\n以宝塔面板为例\n### 先安装docker\n在应用商店中查找docker并安装\n### 获取 docker-compose.yml 模板\n```\ngit clone https://git.pleroma.social/pleroma/pleroma-docker-compose.git\ncd pleroma-docker-compose \n```\n接下来所有操作(除 nginx 配置)如果没有加以说明都在这个目录下进行。\n### 需要修改的内容\n打开`./enviroments/pleroma/pleroma.env`,修改其中的配置:\n```\nDB_USER=pleroma # 数据库用户名\nDB_PASS=pleroma # 数据库密码\nDB_HOST=pleroma-db # 数据库地址\nDB_NAME=pleroma # 数据库名\nINSTANCE_NAME=Pleroma # 实例名\nADMIN_EMAIL=admin@ops.pleroma.social # 管理员邮箱\nNOTIFY_EMAIL=pleroma+admin@ops.pleroma.social # 通知邮箱\nDOMAIN=s.pwq.app # 实例域名\nPORT=4000 # 实例运行端口\n```\n只需要修改域名和邮箱即可\n打开`./volumes/pleroma/config.exs`\n在下面添加\n```\nimport Config\nconfig :pleroma, configurable_from_database: true\n```\n### 启动容器\n随后运行 \n```\ndocker-compose up -d\n```\n启动容器。\n### 添加反向代理\n```\n#PROXY-START/\n\nlocation ^~ /\n{\n # 4000 是你的实例容器运行端口,如果你修改过,记得改成你的端口。\n proxy_pass http://127.0.0.1:4000;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header REMOTE-HOST $remote_addr;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n # proxy_hide_header Upgrade;\n}\n```\n### 创建管理员账户\n```\ndocker exec -it pleroma ./opt/pleroma/bin/pleroma_ctl user new admin 邮箱 --admin\n```\n运行后会出现一个链接,复制在浏览器即可重置密码.\n### 修改文件夹权限\n`/root/pleroma-docker-compose/volumes/pleroma`下的`uploads`权限设置为`777`\n当然如果你用S3协议的对象存储则不需要修改\n直接在后台设置S3即可.\n\n### 演示地址\nhttps://chaihu.top\n","slug":"使用 Docker 构建 Pleroma 实例","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygs00cboko02qmzgblk","comments":1,"layout":"post","photos":[],"link":"","content":"

Pleroma 是一个去中心化的社区程序,其基于 ActivityPub 协议。
而 ActivityPub 包括 Mastodon(Pawoo 等)、Misskey(misskey.io 等)、Pleroma 等等。
在这些开源产品中,Pleroma 实机上部署环境步骤复杂繁琐。
但它是对服务器性能要求最低的微博客工具,它的配置要求多低呢?
现在 docker 的出现大大简化了部署的方式,只需要简单三步即可轻松搭建实例。

\n

本文将介绍如何使用 docker 构建 Pleroma 实例。
以宝塔面板为例

\n

先安装docker

在应用商店中查找docker并安装

\n

获取 docker-compose.yml 模板

1
2
git clone https://git.pleroma.social/pleroma/pleroma-docker-compose.git
cd pleroma-docker-compose
\n

接下来所有操作(除 nginx 配置)如果没有加以说明都在这个目录下进行。

\n

需要修改的内容

打开./enviroments/pleroma/pleroma.env,修改其中的配置:

\n
1
2
3
4
5
6
7
8
9
DB_USER=pleroma # 数据库用户名
DB_PASS=pleroma # 数据库密码
DB_HOST=pleroma-db # 数据库地址
DB_NAME=pleroma # 数据库名
INSTANCE_NAME=Pleroma # 实例名
ADMIN_EMAIL=admin@ops.pleroma.social # 管理员邮箱
NOTIFY_EMAIL=pleroma+admin@ops.pleroma.social # 通知邮箱
DOMAIN=s.pwq.app # 实例域名
PORT=4000 # 实例运行端口
\n

只需要修改域名和邮箱即可
打开./volumes/pleroma/config.exs
在下面添加

\n
1
2
import Config
config :pleroma, configurable_from_database: true
\n

启动容器

随后运行

\n
1
docker-compose up -d
\n

启动容器。

\n

添加反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#PROXY-START/

location ^~ /
{
# 4000 是你的实例容器运行端口,如果你修改过,记得改成你的端口。
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# proxy_hide_header Upgrade;
}
\n

创建管理员账户

1
docker exec -it pleroma ./opt/pleroma/bin/pleroma_ctl user new admin 邮箱 --admin
\n

运行后会出现一个链接,复制在浏览器即可重置密码.

\n

修改文件夹权限

/root/pleroma-docker-compose/volumes/pleroma下的uploads权限设置为777
当然如果你用S3协议的对象存储则不需要修改
直接在后台设置S3即可.

\n

演示地址

https://chaihu.top

\n","site":{"data":{}},"excerpt":"","more":"

Pleroma 是一个去中心化的社区程序,其基于 ActivityPub 协议。
而 ActivityPub 包括 Mastodon(Pawoo 等)、Misskey(misskey.io 等)、Pleroma 等等。
在这些开源产品中,Pleroma 实机上部署环境步骤复杂繁琐。
但它是对服务器性能要求最低的微博客工具,它的配置要求多低呢?
现在 docker 的出现大大简化了部署的方式,只需要简单三步即可轻松搭建实例。

\n

本文将介绍如何使用 docker 构建 Pleroma 实例。
以宝塔面板为例

\n

先安装docker

在应用商店中查找docker并安装

\n

获取 docker-compose.yml 模板

1
2
git clone https://git.pleroma.social/pleroma/pleroma-docker-compose.git
cd pleroma-docker-compose
\n

接下来所有操作(除 nginx 配置)如果没有加以说明都在这个目录下进行。

\n

需要修改的内容

打开./enviroments/pleroma/pleroma.env,修改其中的配置:

\n
1
2
3
4
5
6
7
8
9
DB_USER=pleroma # 数据库用户名
DB_PASS=pleroma # 数据库密码
DB_HOST=pleroma-db # 数据库地址
DB_NAME=pleroma # 数据库名
INSTANCE_NAME=Pleroma # 实例名
ADMIN_EMAIL=admin@ops.pleroma.social # 管理员邮箱
NOTIFY_EMAIL=pleroma+admin@ops.pleroma.social # 通知邮箱
DOMAIN=s.pwq.app # 实例域名
PORT=4000 # 实例运行端口
\n

只需要修改域名和邮箱即可
打开./volumes/pleroma/config.exs
在下面添加

\n
1
2
import Config
config :pleroma, configurable_from_database: true
\n

启动容器

随后运行

\n
1
docker-compose up -d
\n

启动容器。

\n

添加反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#PROXY-START/

location ^~ /
{
# 4000 是你的实例容器运行端口,如果你修改过,记得改成你的端口。
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# proxy_hide_header Upgrade;
}
\n

创建管理员账户

1
docker exec -it pleroma ./opt/pleroma/bin/pleroma_ctl user new admin 邮箱 --admin
\n

运行后会出现一个链接,复制在浏览器即可重置密码.

\n

修改文件夹权限

/root/pleroma-docker-compose/volumes/pleroma下的uploads权限设置为777
当然如果你用S3协议的对象存储则不需要修改
直接在后台设置S3即可.

\n

演示地址

https://chaihu.top

\n"},{"abbrlink":"6d58ffa9","cover":"https://blog.dasbid.com/upload/image-bvkn.png","date":"2023-05-18T08:23:20.354Z","excerpt":"...","title":"使用cloudflare Tunnels实现内网穿透","updated":"2023-09-30T02:59:46.518Z","_content":"## 使用cloudflare Tunnels实现内网穿透\n\n### 准备工作\n\n* 一个顶级域名\n* 更改DNS解析服务器\n* 等待生效\n\n### 打开 [Tunnels](https://one.dash.cloudflare.com/165012cc0f623729405e26de2fb3f876/access/tunnels)\n\n![](https://blog.dasbid.com//upload/image.png)\n\n### 点击**create a Tunnels**\n\n![](https://blog.dasbid.com/upload/image-bvkn.png)![](https://blog.dasbid.com//upload/image.png)\n\n### 随意输入一个名称用以区分\n\n![](https://blog.dasbid.com//upload/image-qzcq.png)\n\n选一个服务端软件\\~用以启动\\~\n\n### 以群晖为例\n\n群晖就选择**docker**\n\n![](https://blog.dasbid.com//upload/image-jjnh.png)复制命令行启动\\~\n\n#### **群晖要在root权限下执行**\n\n#### 获取root只需要\n\n```bash\n\nsudo su\n```\n\n![](https://blog.dasbid.com//upload/image-jsyd.png)\n\n#### 按需填写\n\n**Subdomain** 随便一个A记录\n\n**Domain **选择一个域名\n\n**Path **可以为空\n\n**Type**可以填写HTTP或者HTTPS\n\n**URL **填写localhost加上端口号\n\n保存即可\\~\n\n#### 演示地址\n\n[https://h.imsun.pw](https://h.imsun.pw)\n","source":"_posts/使用cloudflare Tunnels实现内网穿透.md","raw":"---\nabbrlink: 6d58ffa9\ncategories:\n - - 分享\ncover: 'https://blog.dasbid.com/upload/image-bvkn.png'\ndate: '2023-05-18T16:23:20.354081+08:00'\nexcerpt: ...\ntags:\n - cloudflare\ntitle: 使用cloudflare Tunnels实现内网穿透\nupdated: '2023-5-18T16:27:3.464+8:0'\n---\n## 使用cloudflare Tunnels实现内网穿透\n\n### 准备工作\n\n* 一个顶级域名\n* 更改DNS解析服务器\n* 等待生效\n\n### 打开 [Tunnels](https://one.dash.cloudflare.com/165012cc0f623729405e26de2fb3f876/access/tunnels)\n\n![](https://blog.dasbid.com//upload/image.png)\n\n### 点击**create a Tunnels**\n\n![](https://blog.dasbid.com/upload/image-bvkn.png)![](https://blog.dasbid.com//upload/image.png)\n\n### 随意输入一个名称用以区分\n\n![](https://blog.dasbid.com//upload/image-qzcq.png)\n\n选一个服务端软件\\~用以启动\\~\n\n### 以群晖为例\n\n群晖就选择**docker**\n\n![](https://blog.dasbid.com//upload/image-jjnh.png)复制命令行启动\\~\n\n#### **群晖要在root权限下执行**\n\n#### 获取root只需要\n\n```bash\n\nsudo su\n```\n\n![](https://blog.dasbid.com//upload/image-jsyd.png)\n\n#### 按需填写\n\n**Subdomain** 随便一个A记录\n\n**Domain **选择一个域名\n\n**Path **可以为空\n\n**Type**可以填写HTTP或者HTTPS\n\n**URL **填写localhost加上端口号\n\n保存即可\\~\n\n#### 演示地址\n\n[https://h.imsun.pw](https://h.imsun.pw)\n","slug":"使用cloudflare Tunnels实现内网穿透","published":1,"_id":"cln4obygt00cdoko01rbg7j16","comments":1,"layout":"post","photos":[],"link":"","content":"

使用cloudflare Tunnels实现内网穿透

准备工作

    \n
  • 一个顶级域名
  • \n
  • 更改DNS解析服务器
  • \n
  • 等待生效
  • \n
\n

打开 Tunnels

\n

点击create a Tunnels

\n

随意输入一个名称用以区分

\n

选一个服务端软件~用以启动~

\n

以群晖为例

群晖就选择docker

\n

复制命令行启动~

\n

群晖要在root权限下执行

获取root只需要

1
2

sudo su
\n\n

\n

按需填写

Subdomain 随便一个A记录

\n

**Domain **选择一个域名

\n

**Path **可以为空

\n

Type可以填写HTTP或者HTTPS

\n

**URL **填写localhost加上端口号

\n

保存即可~

\n

演示地址

https://h.imsun.pw

\n","site":{"data":{}},"more":"

使用cloudflare Tunnels实现内网穿透

准备工作

    \n
  • 一个顶级域名
  • \n
  • 更改DNS解析服务器
  • \n
  • 等待生效
  • \n
\n

打开 Tunnels

\n

点击create a Tunnels

\n

随意输入一个名称用以区分

\n

选一个服务端软件~用以启动~

\n

以群晖为例

群晖就选择docker

\n

复制命令行启动~

\n

群晖要在root权限下执行

获取root只需要

1
2

sudo su
\n\n

\n

按需填写

Subdomain 随便一个A记录

\n

**Domain **选择一个域名

\n

**Path **可以为空

\n

Type可以填写HTTP或者HTTPS

\n

**URL **填写localhost加上端口号

\n

保存即可~

\n

演示地址

https://h.imsun.pw

\n"},{"title":"关于网恋","abbrlink":4937,"date":"2016-12-23T07:34:58.000Z","_content":"\n随着年龄越来越大,变得越来越不相信爱情。 \n\n网恋更是让人觉得是浪费时间与精力的事情。 \n\n其中充满了大量无意义的对话,甚至大量的虚假的问候,让人充满了怀疑,与自我怀疑。 \n\n这都是因为双方的不信任。这可能与年龄有关。 \n\n在我读书的时候,QQ是最流行的通讯工具,他的成本比发短信要来的实惠太多。\n\n那时候没有微信,但是每次上线都会有提醒,都会有许久不见的问候,那时的我们都是真实的自己。\n\n我们会把自己的真心话讲给他们听。他们包括熟识的同学朋友,以及素未谋面的网络另一端的那个熟悉的陌生人。 \n\n年级再大了些,走出校园,走进社会。开始渐渐的学会把真话藏起来,把假话说给众人听。_\n\n于是_开始怀疑他人甚至自己的话。\n\n这网恋就越发艰难,虽说现在网恋的成本没有以前那么高,但实在是感觉不到感情了。 \n\n是我们越长大越冷漠了吧。","source":"_posts/关于网恋.md","raw":"---\ntitle: 关于网恋\ntags:\n - 爱情\n - 生活\n - 网恋\ncategories: 随笔\nabbrlink: 4937\ndate: 2016-12-23 15:34:58\n---\n\n随着年龄越来越大,变得越来越不相信爱情。 \n\n网恋更是让人觉得是浪费时间与精力的事情。 \n\n其中充满了大量无意义的对话,甚至大量的虚假的问候,让人充满了怀疑,与自我怀疑。 \n\n这都是因为双方的不信任。这可能与年龄有关。 \n\n在我读书的时候,QQ是最流行的通讯工具,他的成本比发短信要来的实惠太多。\n\n那时候没有微信,但是每次上线都会有提醒,都会有许久不见的问候,那时的我们都是真实的自己。\n\n我们会把自己的真心话讲给他们听。他们包括熟识的同学朋友,以及素未谋面的网络另一端的那个熟悉的陌生人。 \n\n年级再大了些,走出校园,走进社会。开始渐渐的学会把真话藏起来,把假话说给众人听。_\n\n于是_开始怀疑他人甚至自己的话。\n\n这网恋就越发艰难,虽说现在网恋的成本没有以前那么高,但实在是感觉不到感情了。 \n\n是我们越长大越冷漠了吧。","slug":"关于网恋","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygt00cgoko0g20id478","comments":1,"layout":"post","photos":[],"link":"","content":"

随着年龄越来越大,变得越来越不相信爱情。

\n

网恋更是让人觉得是浪费时间与精力的事情。

\n

其中充满了大量无意义的对话,甚至大量的虚假的问候,让人充满了怀疑,与自我怀疑。

\n

这都是因为双方的不信任。这可能与年龄有关。

\n

在我读书的时候,QQ是最流行的通讯工具,他的成本比发短信要来的实惠太多。

\n

那时候没有微信,但是每次上线都会有提醒,都会有许久不见的问候,那时的我们都是真实的自己。

\n

我们会把自己的真心话讲给他们听。他们包括熟识的同学朋友,以及素未谋面的网络另一端的那个熟悉的陌生人。

\n

年级再大了些,走出校园,走进社会。开始渐渐的学会把真话藏起来,把假话说给众人听。_

\n

于是_开始怀疑他人甚至自己的话。

\n

这网恋就越发艰难,虽说现在网恋的成本没有以前那么高,但实在是感觉不到感情了。

\n

是我们越长大越冷漠了吧。

\n","site":{"data":{}},"excerpt":"","more":"

随着年龄越来越大,变得越来越不相信爱情。

\n

网恋更是让人觉得是浪费时间与精力的事情。

\n

其中充满了大量无意义的对话,甚至大量的虚假的问候,让人充满了怀疑,与自我怀疑。

\n

这都是因为双方的不信任。这可能与年龄有关。

\n

在我读书的时候,QQ是最流行的通讯工具,他的成本比发短信要来的实惠太多。

\n

那时候没有微信,但是每次上线都会有提醒,都会有许久不见的问候,那时的我们都是真实的自己。

\n

我们会把自己的真心话讲给他们听。他们包括熟识的同学朋友,以及素未谋面的网络另一端的那个熟悉的陌生人。

\n

年级再大了些,走出校园,走进社会。开始渐渐的学会把真话藏起来,把假话说给众人听。_

\n

于是_开始怀疑他人甚至自己的话。

\n

这网恋就越发艰难,虽说现在网恋的成本没有以前那么高,但实在是感觉不到感情了。

\n

是我们越长大越冷漠了吧。

\n"},{"title":"关于英雄联盟S8八强对抗的预测","excerpt":"","abbrlink":3459,"date":"2018-10-19T10:12:54.000Z","_content":"\n明天会有两场BO5的比赛 分别是12:00 KT VS IG 16:00 RNG VS G2. 对于RNG我还是有信心的。IG则不太好说了。胜率不高。大约KT3:1IG。RNG则大概率3:1 G2。 RNG的状态的确有点不太稳定。但是调节能力还是可以的。特别是这个赛季的气势如虹给了RNG足够的信心。 我希望明天IG可以爆冷击败KT。","source":"_posts/关于英雄联盟S8八强对抗的预测.md","raw":"---\ntitle: 关于英雄联盟S8八强对抗的预测\ntags:\n - lol\n - RNG\n - S8\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 3459\ndate: 2018-10-19 18:12:54\n---\n\n明天会有两场BO5的比赛 分别是12:00 KT VS IG 16:00 RNG VS G2. 对于RNG我还是有信心的。IG则不太好说了。胜率不高。大约KT3:1IG。RNG则大概率3:1 G2。 RNG的状态的确有点不太稳定。但是调节能力还是可以的。特别是这个赛季的气势如虹给了RNG足够的信心。 我希望明天IG可以爆冷击败KT。","slug":"关于英雄联盟S8八强对抗的预测","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygu00cjoko08k2w4av4","comments":1,"layout":"post","photos":[],"link":"","content":"

明天会有两场BO5的比赛 分别是12:00 KT VS IG 16:00 RNG VS G2. 对于RNG我还是有信心的。IG则不太好说了。胜率不高。大约KT3:1IG。RNG则大概率3:1 G2。 RNG的状态的确有点不太稳定。但是调节能力还是可以的。特别是这个赛季的气势如虹给了RNG足够的信心。 我希望明天IG可以爆冷击败KT。

\n","site":{"data":{}},"more":"

明天会有两场BO5的比赛 分别是12:00 KT VS IG 16:00 RNG VS G2. 对于RNG我还是有信心的。IG则不太好说了。胜率不高。大约KT3:1IG。RNG则大概率3:1 G2。 RNG的状态的确有点不太稳定。但是调节能力还是可以的。特别是这个赛季的气势如虹给了RNG足够的信心。 我希望明天IG可以爆冷击败KT。

\n"},{"title":"2023中秋前夕","abbrlink":"20772b2a","date":"2023-09-28T06:59:24.000Z","cover":null,"_content":"\n又是中秋节,只有4天假.\n想回湖北老家看看,但是买不到票.\n于是愿望搁浅.\n\n---\n闲鱼账号被处罚了,理由是有交易纠纷.\n那么既然是纠纷,单方面罚卖家合理吗?\n我不知道,我选择卸载.\n\n---\n服务器方面,由于腾讯云的活动,续费了一年花费336大洋.\n免费升到4核4G6M的配置.\n2027-04-20到期.\n觉得国内竟然比国外还贵一些.\n\n---\n家里介绍的相亲对象,聊过一次之后便没有再联系了.\n年纪大了,可能对爱情就不抱任何期待了吧.\n用心交流也变的越来越难.\n考虑更多的是物质方面的东西.\n\n---\n至于假期安排大概率是在家西瓜空调WIFI.\n外面那么拥挤.还是不要出去浪了.\n\n---\n如果有妹妹一起出去吃饭也是极好的.\n\n---\n没有妹妹,看看电视也是极好的.\n\n---\n今天的亚运会英雄联盟四分之一决赛中国队0比2输给了韩国队\n应该没有人在开始之前就看好这个阵容的吧\n\n---\n王者荣耀国家队昨天获得了金牌,而且是以碾压之势获得了冠军\n","source":"_posts/写在2023中秋前夕.md","raw":"---\ntitle: 2023中秋前夕\ntags: 中秋节\ncategories: 随笔\nabbrlink: 20772b2a\ndate: 2023-09-28 14:59:24\ncover:\n---\n\n又是中秋节,只有4天假.\n想回湖北老家看看,但是买不到票.\n于是愿望搁浅.\n\n---\n闲鱼账号被处罚了,理由是有交易纠纷.\n那么既然是纠纷,单方面罚卖家合理吗?\n我不知道,我选择卸载.\n\n---\n服务器方面,由于腾讯云的活动,续费了一年花费336大洋.\n免费升到4核4G6M的配置.\n2027-04-20到期.\n觉得国内竟然比国外还贵一些.\n\n---\n家里介绍的相亲对象,聊过一次之后便没有再联系了.\n年纪大了,可能对爱情就不抱任何期待了吧.\n用心交流也变的越来越难.\n考虑更多的是物质方面的东西.\n\n---\n至于假期安排大概率是在家西瓜空调WIFI.\n外面那么拥挤.还是不要出去浪了.\n\n---\n如果有妹妹一起出去吃饭也是极好的.\n\n---\n没有妹妹,看看电视也是极好的.\n\n---\n今天的亚运会英雄联盟四分之一决赛中国队0比2输给了韩国队\n应该没有人在开始之前就看好这个阵容的吧\n\n---\n王者荣耀国家队昨天获得了金牌,而且是以碾压之势获得了冠军\n","slug":"写在2023中秋前夕","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygu00cnoko0c80rcm8v","comments":1,"layout":"post","photos":[],"link":"","content":"

又是中秋节,只有4天假.
想回湖北老家看看,但是买不到票.
于是愿望搁浅.

\n
\n

闲鱼账号被处罚了,理由是有交易纠纷.
那么既然是纠纷,单方面罚卖家合理吗?
我不知道,我选择卸载.

\n
\n

服务器方面,由于腾讯云的活动,续费了一年花费336大洋.
免费升到4核4G6M的配置.
2027-04-20到期.
觉得国内竟然比国外还贵一些.

\n
\n

家里介绍的相亲对象,聊过一次之后便没有再联系了.
年纪大了,可能对爱情就不抱任何期待了吧.
用心交流也变的越来越难.
考虑更多的是物质方面的东西.

\n
\n

至于假期安排大概率是在家西瓜空调WIFI.
外面那么拥挤.还是不要出去浪了.

\n
\n

如果有妹妹一起出去吃饭也是极好的.

\n
\n

没有妹妹,看看电视也是极好的.

\n
\n

今天的亚运会英雄联盟四分之一决赛中国队0比2输给了韩国队
应该没有人在开始之前就看好这个阵容的吧

\n
\n

王者荣耀国家队昨天获得了金牌,而且是以碾压之势获得了冠军

\n","site":{"data":{}},"excerpt":"","more":"

又是中秋节,只有4天假.
想回湖北老家看看,但是买不到票.
于是愿望搁浅.

\n
\n

闲鱼账号被处罚了,理由是有交易纠纷.
那么既然是纠纷,单方面罚卖家合理吗?
我不知道,我选择卸载.

\n
\n

服务器方面,由于腾讯云的活动,续费了一年花费336大洋.
免费升到4核4G6M的配置.
2027-04-20到期.
觉得国内竟然比国外还贵一些.

\n
\n

家里介绍的相亲对象,聊过一次之后便没有再联系了.
年纪大了,可能对爱情就不抱任何期待了吧.
用心交流也变的越来越难.
考虑更多的是物质方面的东西.

\n
\n

至于假期安排大概率是在家西瓜空调WIFI.
外面那么拥挤.还是不要出去浪了.

\n
\n

如果有妹妹一起出去吃饭也是极好的.

\n
\n

没有妹妹,看看电视也是极好的.

\n
\n

今天的亚运会英雄联盟四分之一决赛中国队0比2输给了韩国队
应该没有人在开始之前就看好这个阵容的吧

\n
\n

王者荣耀国家队昨天获得了金牌,而且是以碾压之势获得了冠军

\n"},{"title":"写在30岁之后","excerpt":"","abbrlink":44022,"date":"2017-07-10T05:27:06.000Z","_content":"\n其实,前两天是我的生日。 \n\n然而好像除了我自己没人再记得自己的生日。 \n\n我好像就是这样一个存在感薄弱的人。\n平凡无奇。 \n而立之年,日子过的跟亿万在广打工的人们一样。 \n三点一线。 \n甚至比他们其实的大部分过的还要无趣很多。 \n \n只希望早些成家,别让爸妈操心吧。 \n\nhttp://music.163.com/#/song?id=487590187","source":"_posts/写在30岁之后.md","raw":"---\ntitle: 写在30岁之后\ntags:\n - 生活\n - 而立\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 44022\ndate: 2017-07-10 13:27:06\n---\n\n其实,前两天是我的生日。 \n\n然而好像除了我自己没人再记得自己的生日。 \n\n我好像就是这样一个存在感薄弱的人。\n平凡无奇。 \n而立之年,日子过的跟亿万在广打工的人们一样。 \n三点一线。 \n甚至比他们其实的大部分过的还要无趣很多。 \n \n只希望早些成家,别让爸妈操心吧。 \n\nhttp://music.163.com/#/song?id=487590187","slug":"写在30岁之后","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygv00cpoko00gjxbw2h","comments":1,"layout":"post","photos":[],"link":"","content":"

其实,前两天是我的生日。

\n

然而好像除了我自己没人再记得自己的生日。

\n

我好像就是这样一个存在感薄弱的人。
平凡无奇。
而立之年,日子过的跟亿万在广打工的人们一样。
三点一线。
甚至比他们其实的大部分过的还要无趣很多。

\n

只希望早些成家,别让爸妈操心吧。

\n

http://music.163.com/#/song?id=487590187

\n","site":{"data":{}},"more":"

其实,前两天是我的生日。

\n

然而好像除了我自己没人再记得自己的生日。

\n

我好像就是这样一个存在感薄弱的人。
平凡无奇。
而立之年,日子过的跟亿万在广打工的人们一样。
三点一线。
甚至比他们其实的大部分过的还要无趣很多。

\n

只希望早些成家,别让爸妈操心吧。

\n

http://music.163.com/#/song?id=487590187

\n"},{"title":"写在MSI季中冠军赛RNG夺冠之后","excerpt":"","abbrlink":64158,"date":"2018-05-27T16:37:32.000Z","_content":"\nMSI决赛 RNG VS KZ 中韩两个赛区的战斗 当天的比赛我是有看的,虽然KZ当时的表现状态并不是很好,但是我仍然觉得没有十足的信息 因为仿佛有一个魔咒 也许是因为关切所以有点患得患失 关注皇族关注小狗已经有五年了 五年过去了 小狗仍然是那个最强的ADC 他终于夺冠了 他的获奖感言也让我很感动 经历了太多的失败 胜利的喜悦难以言表 在夺冠的那一刻全场都在呼喊uzi uzi 这一刻全世界都是狗吹 永远记住这一天吧 2018年5月20日皇族RNG3:1KZ获得2018年英雄联盟季中冠军赛冠军 &![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/1.jpg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/2.jpeg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/3.jpeg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/K.jpg)","source":"_posts/写在MSI季中冠军赛RNG夺冠之后.md","raw":"---\ntitle: 写在MSI季中冠军赛RNG夺冠之后\ntags:\n - lol\n - LPL\n - RNG\n - UZI\n - 生活\n - 英雄联盟\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 64158\ndate: 2018-05-28 00:37:32\n---\n\nMSI决赛 RNG VS KZ 中韩两个赛区的战斗 当天的比赛我是有看的,虽然KZ当时的表现状态并不是很好,但是我仍然觉得没有十足的信息 因为仿佛有一个魔咒 也许是因为关切所以有点患得患失 关注皇族关注小狗已经有五年了 五年过去了 小狗仍然是那个最强的ADC 他终于夺冠了 他的获奖感言也让我很感动 经历了太多的失败 胜利的喜悦难以言表 在夺冠的那一刻全场都在呼喊uzi uzi 这一刻全世界都是狗吹 永远记住这一天吧 2018年5月20日皇族RNG3:1KZ获得2018年英雄联盟季中冠军赛冠军 &![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/1.jpg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/2.jpeg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/3.jpeg) ![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/K.jpg)","slug":"写在MSI季中冠军赛RNG夺冠之后","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygv00csoko0btaq8ef7","comments":1,"layout":"post","photos":[],"link":"","content":"

MSI决赛 RNG VS KZ 中韩两个赛区的战斗 当天的比赛我是有看的,虽然KZ当时的表现状态并不是很好,但是我仍然觉得没有十足的信息 因为仿佛有一个魔咒 也许是因为关切所以有点患得患失 关注皇族关注小狗已经有五年了 五年过去了 小狗仍然是那个最强的ADC 他终于夺冠了 他的获奖感言也让我很感动 经历了太多的失败 胜利的喜悦难以言表 在夺冠的那一刻全场都在呼喊uzi uzi 这一刻全世界都是狗吹 永远记住这一天吧 2018年5月20日皇族RNG3:1KZ获得2018年英雄联盟季中冠军赛冠军 &

\n","site":{"data":{}},"more":"

MSI决赛 RNG VS KZ 中韩两个赛区的战斗 当天的比赛我是有看的,虽然KZ当时的表现状态并不是很好,但是我仍然觉得没有十足的信息 因为仿佛有一个魔咒 也许是因为关切所以有点患得患失 关注皇族关注小狗已经有五年了 五年过去了 小狗仍然是那个最强的ADC 他终于夺冠了 他的获奖感言也让我很感动 经历了太多的失败 胜利的喜悦难以言表 在夺冠的那一刻全场都在呼喊uzi uzi 这一刻全世界都是狗吹 永远记住这一天吧 2018年5月20日皇族RNG3:1KZ获得2018年英雄联盟季中冠军赛冠军 &

\n"},{"title":"写在加班结束前","excerpt":"","abbrlink":26053,"date":"2011-08-11T12:28:51.000Z","_content":"\n我讨厌这种操蛋的生活。 连坐个顺风车都不舍得的公司你还有什么好说的呢。 我只能无奈的问候他的母亲大人了。","source":"_posts/写在加班结束前.md","raw":"---\ntitle: 写在加班结束前\ntags:\n - 下班\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 26053\ndate: 2011-08-11 20:28:51\n---\n\n我讨厌这种操蛋的生活。 连坐个顺风车都不舍得的公司你还有什么好说的呢。 我只能无奈的问候他的母亲大人了。","slug":"写在加班结束前","published":1,"updated":"2023-09-30T02:59:46.518Z","_id":"cln4obygw00cuoko09nzsflwl","comments":1,"layout":"post","photos":[],"link":"","content":"

我讨厌这种操蛋的生活。 连坐个顺风车都不舍得的公司你还有什么好说的呢。 我只能无奈的问候他的母亲大人了。

\n","site":{"data":{}},"more":"

我讨厌这种操蛋的生活。 连坐个顺风车都不舍得的公司你还有什么好说的呢。 我只能无奈的问候他的母亲大人了。

\n"},{"title":"写在感恩节的话","excerpt":"","abbrlink":6382,"date":"2016-11-24T11:34:14.000Z","_content":"\n首先我感谢我的父母赐予我生命来到这世上,我很愧对于他们,因为我至今也无法报答他们的养育之恩。 其次我感谢我的亲人,是他们无私的给予我帮助,在我无能为力的时候为我挡风遮雨。我很惭愧。 还有我的朋友们,我感谢你们。 虽然很多人都已经许久不联系了,我心里始终会记得你们的情谊。 谢谢313的兄弟。谢谢","source":"_posts/写在感恩节的话.md","raw":"---\ntitle: 写在感恩节的话\ntags:\n - 感恩\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 6382\ndate: 2016-11-24 19:34:14\n---\n\n首先我感谢我的父母赐予我生命来到这世上,我很愧对于他们,因为我至今也无法报答他们的养育之恩。 其次我感谢我的亲人,是他们无私的给予我帮助,在我无能为力的时候为我挡风遮雨。我很惭愧。 还有我的朋友们,我感谢你们。 虽然很多人都已经许久不联系了,我心里始终会记得你们的情谊。 谢谢313的兄弟。谢谢","slug":"写在感恩节的话","published":1,"updated":"2023-09-30T02:59:46.519Z","_id":"cln4obygx00cwoko009q83i3o","comments":1,"layout":"post","photos":[],"link":"","content":"

首先我感谢我的父母赐予我生命来到这世上,我很愧对于他们,因为我至今也无法报答他们的养育之恩。 其次我感谢我的亲人,是他们无私的给予我帮助,在我无能为力的时候为我挡风遮雨。我很惭愧。 还有我的朋友们,我感谢你们。 虽然很多人都已经许久不联系了,我心里始终会记得你们的情谊。 谢谢313的兄弟。谢谢

\n","site":{"data":{}},"more":"

首先我感谢我的父母赐予我生命来到这世上,我很愧对于他们,因为我至今也无法报答他们的养育之恩。 其次我感谢我的亲人,是他们无私的给予我帮助,在我无能为力的时候为我挡风遮雨。我很惭愧。 还有我的朋友们,我感谢你们。 虽然很多人都已经许久不联系了,我心里始终会记得你们的情谊。 谢谢313的兄弟。谢谢

\n"},{"title":"写在愚人节之后","excerpt":"","abbrlink":31287,"date":"2015-04-01T17:45:18.000Z","_content":"\n往年我都会记得小韩的忌日。就在愚人节之前。 今年可能我刻意回避死这个字。 亲眼看到自己所爱的人在自己眼前死去,这是件很残忍的事情,我觉得 我到现在才终于明白小韩父母家人是如何的伤痛。我并没有去送小韩最后一程。可能是因为我那时还想象不出死亡的样子。觉得离我很遥远。   并不习惯写博客了,特别是工作了以后,每日都是重复昨日。 看到两年前的博客还是忍不住上来随便写点什么。 对了,我月底回去。希望可以有点变化","source":"_posts/写在愚人节之后.md","raw":"---\ntitle: 写在愚人节之后\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 31287\ndate: 2015-04-02 01:45:18\n---\n\n往年我都会记得小韩的忌日。就在愚人节之前。 今年可能我刻意回避死这个字。 亲眼看到自己所爱的人在自己眼前死去,这是件很残忍的事情,我觉得 我到现在才终于明白小韩父母家人是如何的伤痛。我并没有去送小韩最后一程。可能是因为我那时还想象不出死亡的样子。觉得离我很遥远。   并不习惯写博客了,特别是工作了以后,每日都是重复昨日。 看到两年前的博客还是忍不住上来随便写点什么。 对了,我月底回去。希望可以有点变化","slug":"写在愚人节之后","published":1,"updated":"2023-09-30T02:59:46.519Z","_id":"cln4obygx00czoko04ykd651a","comments":1,"layout":"post","photos":[],"link":"","content":"

往年我都会记得小韩的忌日。就在愚人节之前。 今年可能我刻意回避死这个字。 亲眼看到自己所爱的人在自己眼前死去,这是件很残忍的事情,我觉得 我到现在才终于明白小韩父母家人是如何的伤痛。我并没有去送小韩最后一程。可能是因为我那时还想象不出死亡的样子。觉得离我很遥远。   并不习惯写博客了,特别是工作了以后,每日都是重复昨日。 看到两年前的博客还是忍不住上来随便写点什么。 对了,我月底回去。希望可以有点变化

\n","site":{"data":{}},"more":"

往年我都会记得小韩的忌日。就在愚人节之前。 今年可能我刻意回避死这个字。 亲眼看到自己所爱的人在自己眼前死去,这是件很残忍的事情,我觉得 我到现在才终于明白小韩父母家人是如何的伤痛。我并没有去送小韩最后一程。可能是因为我那时还想象不出死亡的样子。觉得离我很遥远。   并不习惯写博客了,特别是工作了以后,每日都是重复昨日。 看到两年前的博客还是忍不住上来随便写点什么。 对了,我月底回去。希望可以有点变化

\n"},{"title":"到深圳的第一天","excerpt":"","abbrlink":43468,"date":"2018-03-02T10:09:41.000Z","_content":"\n正月十五,多云,有风 穿短袖拖行李也拖出一身汗来 \n\n住进了宿舍 \n\n四个人两间房 \n\n晚上去吃饭 \n\n---------------------- \n\n话说今天是元宵节 \n\n上元节才是正儿八经的中国情人节 \n\n只有这天观花灯猜字谜的活动让男女有了相互认识的机会 \n\n而七夕又称乞巧节 \n\n是少女们求神祝愿的日子 \n\n------------- \n\n元宵节快乐!","source":"_posts/到深圳的第一天.md","raw":"---\ntitle: 到深圳的第一天\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 43468\ndate: 2018-03-02 18:09:41\n---\n\n正月十五,多云,有风 穿短袖拖行李也拖出一身汗来 \n\n住进了宿舍 \n\n四个人两间房 \n\n晚上去吃饭 \n\n---------------------- \n\n话说今天是元宵节 \n\n上元节才是正儿八经的中国情人节 \n\n只有这天观花灯猜字谜的活动让男女有了相互认识的机会 \n\n而七夕又称乞巧节 \n\n是少女们求神祝愿的日子 \n\n------------- \n\n元宵节快乐!","slug":"到深圳的第一天","published":1,"updated":"2023-09-30T02:59:46.519Z","_id":"cln4obygx00d1oko01vzifqgg","comments":1,"layout":"post","photos":[],"link":"","content":"

正月十五,多云,有风 穿短袖拖行李也拖出一身汗来

\n

住进了宿舍

\n

四个人两间房

\n

晚上去吃饭

\n
\n

话说今天是元宵节

\n

上元节才是正儿八经的中国情人节

\n

只有这天观花灯猜字谜的活动让男女有了相互认识的机会

\n

而七夕又称乞巧节

\n

是少女们求神祝愿的日子

\n
\n

元宵节快乐!

\n","site":{"data":{}},"more":"

正月十五,多云,有风 穿短袖拖行李也拖出一身汗来

\n

住进了宿舍

\n

四个人两间房

\n

晚上去吃饭

\n
\n

话说今天是元宵节

\n

上元节才是正儿八经的中国情人节

\n

只有这天观花灯猜字谜的活动让男女有了相互认识的机会

\n

而七夕又称乞巧节

\n

是少女们求神祝愿的日子

\n
\n

元宵节快乐!

\n"},{"title":"冬日-武汉","excerpt":"","abbrlink":11729,"date":"2018-03-31T10:02:23.000Z","_content":"\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141836.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141854.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141847.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180129_153655.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180129_153645.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n年前回家,在武汉时路过长春观拍摄 \n这几天整理手机相册的时候发现了 \n清明时节雨纷纷,天气预报后天有雨","source":"_posts/冬日-武汉.md","raw":"---\ntitle: 冬日-武汉\ntags:\n - 冬日\n - 影像\n - 武汉\nexcerpt: ''\ncategories: 随笔\nabbrlink: 11729\ndate: 2018-03-31 18:02:23\n---\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141836.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141854.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180201_141847.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180129_153655.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024)\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/03/IMG_20180129_153645.jpg?x-oss-process=image/resize,m_fill,w_768,h_1024) \n年前回家,在武汉时路过长春观拍摄 \n这几天整理手机相册的时候发现了 \n清明时节雨纷纷,天气预报后天有雨","slug":"冬日-武汉","published":1,"updated":"2023-09-30T02:59:46.519Z","_id":"cln4obygy00d5oko08ebcgf9r","comments":1,"layout":"post","photos":[],"link":"","content":"






年前回家,在武汉时路过长春观拍摄
这几天整理手机相册的时候发现了
清明时节雨纷纷,天气预报后天有雨

\n","site":{"data":{}},"more":"






年前回家,在武汉时路过长春观拍摄
这几天整理手机相册的时候发现了
清明时节雨纷纷,天气预报后天有雨

\n"},{"title":"十年","excerpt":"","abbrlink":1648,"date":"2018-03-17T12:34:13.000Z","_content":"\n人生能有多少个十年呢 我不知道 我只知道我已过完了三个十年 半个月前我已经八十岁的外公给我打电话说家里给我提了一个对象 这女子是隔壁村的比我要小上两岁 聊了几天 后来不了了之 可能是我的性格不讨喜 真是对不起外公 这么大年纪了还在为我的婚姻操心 我与ring是高中的同学 做过同桌 跟所有俗烂的二流青春小说一样 我喜欢她 给她写过情书 虽没有亲口表白 但她应该也知道 她不喜欢我这样的 我也知道 后来就毕业上了大学 还有联系 再后来毕了业 就渐渐的没有了联系 今年过年她在朋友圈里发动态说她回来了 我看到之后 马上就去找她 因为第二天我就要去广东 见到了她 ring她跟十年前一样 她见我的第一句话就是培文你怎么胖成这个样子 我无奈笑笑 你的性格还跟以前一样 她笑着对我说 她给我看他女儿的照片 恍然间 十年仿佛转瞬间消失的一样 情谊还在 只不过我们都长大了 有了各自的生活 许久不见得朋友啊在彼此的心中可能就没那么重要了","source":"_posts/十年.md","raw":"---\ntitle: 十年\ntags:\n - 十年\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 1648\ndate: 2018-03-17 20:34:13\n---\n\n人生能有多少个十年呢 我不知道 我只知道我已过完了三个十年 半个月前我已经八十岁的外公给我打电话说家里给我提了一个对象 这女子是隔壁村的比我要小上两岁 聊了几天 后来不了了之 可能是我的性格不讨喜 真是对不起外公 这么大年纪了还在为我的婚姻操心 我与ring是高中的同学 做过同桌 跟所有俗烂的二流青春小说一样 我喜欢她 给她写过情书 虽没有亲口表白 但她应该也知道 她不喜欢我这样的 我也知道 后来就毕业上了大学 还有联系 再后来毕了业 就渐渐的没有了联系 今年过年她在朋友圈里发动态说她回来了 我看到之后 马上就去找她 因为第二天我就要去广东 见到了她 ring她跟十年前一样 她见我的第一句话就是培文你怎么胖成这个样子 我无奈笑笑 你的性格还跟以前一样 她笑着对我说 她给我看他女儿的照片 恍然间 十年仿佛转瞬间消失的一样 情谊还在 只不过我们都长大了 有了各自的生活 许久不见得朋友啊在彼此的心中可能就没那么重要了","slug":"十年","published":1,"updated":"2023-09-30T02:59:46.519Z","_id":"cln4obygy00d8oko0grs88ez1","comments":1,"layout":"post","photos":[],"link":"","content":"

人生能有多少个十年呢 我不知道 我只知道我已过完了三个十年 半个月前我已经八十岁的外公给我打电话说家里给我提了一个对象 这女子是隔壁村的比我要小上两岁 聊了几天 后来不了了之 可能是我的性格不讨喜 真是对不起外公 这么大年纪了还在为我的婚姻操心 我与ring是高中的同学 做过同桌 跟所有俗烂的二流青春小说一样 我喜欢她 给她写过情书 虽没有亲口表白 但她应该也知道 她不喜欢我这样的 我也知道 后来就毕业上了大学 还有联系 再后来毕了业 就渐渐的没有了联系 今年过年她在朋友圈里发动态说她回来了 我看到之后 马上就去找她 因为第二天我就要去广东 见到了她 ring她跟十年前一样 她见我的第一句话就是培文你怎么胖成这个样子 我无奈笑笑 你的性格还跟以前一样 她笑着对我说 她给我看他女儿的照片 恍然间 十年仿佛转瞬间消失的一样 情谊还在 只不过我们都长大了 有了各自的生活 许久不见得朋友啊在彼此的心中可能就没那么重要了

\n","site":{"data":{}},"more":"

人生能有多少个十年呢 我不知道 我只知道我已过完了三个十年 半个月前我已经八十岁的外公给我打电话说家里给我提了一个对象 这女子是隔壁村的比我要小上两岁 聊了几天 后来不了了之 可能是我的性格不讨喜 真是对不起外公 这么大年纪了还在为我的婚姻操心 我与ring是高中的同学 做过同桌 跟所有俗烂的二流青春小说一样 我喜欢她 给她写过情书 虽没有亲口表白 但她应该也知道 她不喜欢我这样的 我也知道 后来就毕业上了大学 还有联系 再后来毕了业 就渐渐的没有了联系 今年过年她在朋友圈里发动态说她回来了 我看到之后 马上就去找她 因为第二天我就要去广东 见到了她 ring她跟十年前一样 她见我的第一句话就是培文你怎么胖成这个样子 我无奈笑笑 你的性格还跟以前一样 她笑着对我说 她给我看他女儿的照片 恍然间 十年仿佛转瞬间消失的一样 情谊还在 只不过我们都长大了 有了各自的生活 许久不见得朋友啊在彼此的心中可能就没那么重要了

\n"},{"title":"半年没有更新博客了","excerpt":"","abbrlink":55578,"date":"2013-01-30T14:11:18.000Z","_content":"\n不是遗忘了,而是大多数时间不知道写些什么。 \n\n人的想法总是很多,可真正做到的没有多少。\n\n其实有时候的灵机一动可能会让自己都叫绝的主意在自己的脑海里也只是转瞬即逝,总是为这种莫名的灵感感到可惜。\n因为不善于捕捉这些,所以日子总是过的稀里糊涂而没有条理。\n \n说的好听叫随性。 \n这种没有约束的日子没有目标没有目的,迷茫的心里总是空落落的。 \n \n \n写博客也是需要有点文采的,可惜,我没有。","source":"_posts/半年没有更新博客了.md","raw":"---\ntitle: 半年没有更新博客了\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 55578\ndate: 2013-01-30 22:11:18\n---\n\n不是遗忘了,而是大多数时间不知道写些什么。 \n\n人的想法总是很多,可真正做到的没有多少。\n\n其实有时候的灵机一动可能会让自己都叫绝的主意在自己的脑海里也只是转瞬即逝,总是为这种莫名的灵感感到可惜。\n因为不善于捕捉这些,所以日子总是过的稀里糊涂而没有条理。\n \n说的好听叫随性。 \n这种没有约束的日子没有目标没有目的,迷茫的心里总是空落落的。 \n \n \n写博客也是需要有点文采的,可惜,我没有。","slug":"半年没有更新博客了","published":1,"updated":"2023-09-30T02:59:46.520Z","_id":"cln4obygz00dcoko06zdsbodi","comments":1,"layout":"post","photos":[],"link":"","content":"

不是遗忘了,而是大多数时间不知道写些什么。

\n

人的想法总是很多,可真正做到的没有多少。

\n

其实有时候的灵机一动可能会让自己都叫绝的主意在自己的脑海里也只是转瞬即逝,总是为这种莫名的灵感感到可惜。
因为不善于捕捉这些,所以日子总是过的稀里糊涂而没有条理。

\n

说的好听叫随性。
这种没有约束的日子没有目标没有目的,迷茫的心里总是空落落的。

\n

写博客也是需要有点文采的,可惜,我没有。

\n","site":{"data":{}},"more":"

不是遗忘了,而是大多数时间不知道写些什么。

\n

人的想法总是很多,可真正做到的没有多少。

\n

其实有时候的灵机一动可能会让自己都叫绝的主意在自己的脑海里也只是转瞬即逝,总是为这种莫名的灵感感到可惜。
因为不善于捕捉这些,所以日子总是过的稀里糊涂而没有条理。

\n

说的好听叫随性。
这种没有约束的日子没有目标没有目的,迷茫的心里总是空落落的。

\n

写博客也是需要有点文采的,可惜,我没有。

\n"},{"title":"用Memos API实现hexo博客的动态说说页面","published":1,"abbrlink":"286ad0c6","date":"2023-06-13T07:57:00.000Z","cover":null,"_content":"新建一个页面\n```\nhexo new page Memos\n```\n修改`Memos/index.md`内容为\n```\n---\ntitle: Memos\ncomments: false\ndate: 2023-06-07 14:17:13\n---\n
\n

\n 共发布了 不知道多少 条说说\n

\n
\n
\n\n\n\n```\n即可~\n\n代码来源于网络~\n","source":"_posts/博客的说说页面之Memos.md","raw":"---\ntitle: 用Memos API实现hexo博客的动态说说页面\ntags:\n - memos\n - Hexo\npublished: true\ncategories: 分享\nabbrlink: 286ad0c6\ndate: 2023-06-13 15:57:00\ncover:\n---\n新建一个页面\n```\nhexo new page Memos\n```\n修改`Memos/index.md`内容为\n```\n---\ntitle: Memos\ncomments: false\ndate: 2023-06-07 14:17:13\n---\n
\n

\n 共发布了 不知道多少 条说说\n

\n
\n
\n\n\n\n```\n即可~\n\n代码来源于网络~\n","slug":"博客的说说页面之Memos","updated":"2023-09-30T02:59:46.520Z","_id":"cln4obyh000dfoko091xdhsru","comments":1,"layout":"post","photos":[],"link":"","content":"

新建一个页面

\n
1
hexo new page Memos
\n

修改Memos/index.md内容为

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
---
title: Memos
comments: false
date: 2023-06-07 14:17:13
---
<div class='memo-nums'>
<p class='note note-info memo-nums-text'>
共发布了 <span id="memosCount">不知道多少</span> 条说说
</p>
</div>
<div id="bber"></div>
<script type="text/javascript">
var bbMemos = {
memos : 'https://memos.ee/',
limit : '20',
creatorId:'1',
domId: '',
}
</script>
<script src="https://blogcdn.loliko.cn/memos2/js/marked.js"></script>
<script src="https://blogcdn.loliko.cn/memos2/js/talk.js"></script>
\n

即可~

\n

代码来源于网络~

\n","site":{"data":{}},"excerpt":"","more":"

新建一个页面

\n
1
hexo new page Memos
\n

修改Memos/index.md内容为

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
---
title: Memos
comments: false
date: 2023-06-07 14:17:13
---
<div class='memo-nums'>
<p class='note note-info memo-nums-text'>
共发布了 <span id="memosCount">不知道多少</span> 条说说
</p>
</div>
<div id="bber"></div>
<script type="text/javascript">
var bbMemos = {
memos : 'https://memos.ee/',
limit : '20',
creatorId:'1',
domId: '',
}
</script>
<script src="https://blogcdn.loliko.cn/memos2/js/marked.js"></script>
<script src="https://blogcdn.loliko.cn/memos2/js/talk.js"></script>
\n

即可~

\n

代码来源于网络~

\n"},{"title":"又是一年冬季","excerpt":"","abbrlink":42284,"date":"2017-12-10T13:05:38.000Z","_content":"\n珠海的冬天是不怎么寒冷的。\n\n最近的降温也是让人们都穿上了长袖。 \n\n每年这个时候我都会吐槽珠海的冬天来的太晚。 \n\n今年过年时要回家去的。\n\n外婆去世已经三周年了,按照我们当地的习俗,今年是要给外婆立碑的。 \n\n时间过的挺快的,感觉这么多年过去了,自己没有丝毫的长进。 \n\n挺悲哀的。\n\n有时候明知道自己做得不够,却不能改变什么,真的是一件挺无奈的事情,我不知道怎么才能够改变自己的生活。 \n\n \n\n另外我元旦会去上海。\n\n去见我的女朋友。","source":"_posts/又是一年冬季.md","raw":"---\ntitle: 又是一年冬季\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 42284\ndate: 2017-12-10 21:05:38\n---\n\n珠海的冬天是不怎么寒冷的。\n\n最近的降温也是让人们都穿上了长袖。 \n\n每年这个时候我都会吐槽珠海的冬天来的太晚。 \n\n今年过年时要回家去的。\n\n外婆去世已经三周年了,按照我们当地的习俗,今年是要给外婆立碑的。 \n\n时间过的挺快的,感觉这么多年过去了,自己没有丝毫的长进。 \n\n挺悲哀的。\n\n有时候明知道自己做得不够,却不能改变什么,真的是一件挺无奈的事情,我不知道怎么才能够改变自己的生活。 \n\n \n\n另外我元旦会去上海。\n\n去见我的女朋友。","slug":"又是一年冬季","published":1,"updated":"2023-09-30T02:59:46.520Z","_id":"cln4obyh100djoko0f515b8ii","comments":1,"layout":"post","photos":[],"link":"","content":"

珠海的冬天是不怎么寒冷的。

\n

最近的降温也是让人们都穿上了长袖。

\n

每年这个时候我都会吐槽珠海的冬天来的太晚。

\n

今年过年时要回家去的。

\n

外婆去世已经三周年了,按照我们当地的习俗,今年是要给外婆立碑的。

\n

时间过的挺快的,感觉这么多年过去了,自己没有丝毫的长进。

\n

挺悲哀的。

\n

有时候明知道自己做得不够,却不能改变什么,真的是一件挺无奈的事情,我不知道怎么才能够改变自己的生活。

\n

另外我元旦会去上海。

\n

去见我的女朋友。

\n","site":{"data":{}},"more":"

珠海的冬天是不怎么寒冷的。

\n

最近的降温也是让人们都穿上了长袖。

\n

每年这个时候我都会吐槽珠海的冬天来的太晚。

\n

今年过年时要回家去的。

\n

外婆去世已经三周年了,按照我们当地的习俗,今年是要给外婆立碑的。

\n

时间过的挺快的,感觉这么多年过去了,自己没有丝毫的长进。

\n

挺悲哀的。

\n

有时候明知道自己做得不够,却不能改变什么,真的是一件挺无奈的事情,我不知道怎么才能够改变自己的生活。

\n

另外我元旦会去上海。

\n

去见我的女朋友。

\n"},{"title":"压力山大","excerpt":"","abbrlink":2390,"date":"2016-11-04T10:20:56.000Z","_content":"\n说实在话年近三十的压力真的有点大,没有结婚,也没什么存款,买不起车也买不起房,虽然不啃老,但是日子过的也不大理想。 \n\n家中的老人始终都觉得如果你不结婚那以后肯定就是娶不到老婆了。 \n\n我曾经因为这个理由去相亲,去面试,让本来不是很擅长与人打交道的我很是尴尬。 \n\n当然结果是显而易见的,都没成功。 最近小草莓要结婚了。\n\n小草莓与我相识已经有十年了吧,当初就是在我维护的论坛上认识的妹子。\n\n不由得感叹时间真的快。 \n\n小草莓是个软妹子。\n\n二次元少女。\n\n呃,姑且还算是少女吧。\n\n我虽然宅,但是我不混二次元,所以我对动漫啊日语啊都不熟悉。\n\n有时候觉得这么一大把年纪了还在混二次元真的是件很羞耻的事情。 \n\n国庆节小草莓约我去广州陪她玩耍,我内心是拒绝的,所以我就婉约的拒绝了,国庆节人山人海也就罢了,去广州的路上还塞车,根本不值得去,何况我也不想去打搅他们的二人世界,去做一个闪光的人。 \n\n我对她的先生一点都不熟悉,准确来说只在图片上见到过,根本没有与其本人打过交道。\n\n这个也是我拒绝去的理由。\n\n这辈子也不太可能有交集。 \n\n在我们堂兄弟之中目前除了我没有结婚意外也就只有几个很小的没有结婚了。\n\n大部分比我小的堂弟都已经生了二胎。\n\n对此我觉得我应该是比不赢的了。","source":"_posts/压力山大.md","raw":"---\ntitle: 压力山大\ntags:\n - 生活\n - 结婚\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 2390\ndate: 2016-11-04 18:20:56\n---\n\n说实在话年近三十的压力真的有点大,没有结婚,也没什么存款,买不起车也买不起房,虽然不啃老,但是日子过的也不大理想。 \n\n家中的老人始终都觉得如果你不结婚那以后肯定就是娶不到老婆了。 \n\n我曾经因为这个理由去相亲,去面试,让本来不是很擅长与人打交道的我很是尴尬。 \n\n当然结果是显而易见的,都没成功。 最近小草莓要结婚了。\n\n小草莓与我相识已经有十年了吧,当初就是在我维护的论坛上认识的妹子。\n\n不由得感叹时间真的快。 \n\n小草莓是个软妹子。\n\n二次元少女。\n\n呃,姑且还算是少女吧。\n\n我虽然宅,但是我不混二次元,所以我对动漫啊日语啊都不熟悉。\n\n有时候觉得这么一大把年纪了还在混二次元真的是件很羞耻的事情。 \n\n国庆节小草莓约我去广州陪她玩耍,我内心是拒绝的,所以我就婉约的拒绝了,国庆节人山人海也就罢了,去广州的路上还塞车,根本不值得去,何况我也不想去打搅他们的二人世界,去做一个闪光的人。 \n\n我对她的先生一点都不熟悉,准确来说只在图片上见到过,根本没有与其本人打过交道。\n\n这个也是我拒绝去的理由。\n\n这辈子也不太可能有交集。 \n\n在我们堂兄弟之中目前除了我没有结婚意外也就只有几个很小的没有结婚了。\n\n大部分比我小的堂弟都已经生了二胎。\n\n对此我觉得我应该是比不赢的了。","slug":"压力山大","published":1,"updated":"2023-09-30T02:59:46.520Z","_id":"cln4obyh100dmoko02qj9fqke","comments":1,"layout":"post","photos":[],"link":"","content":"

说实在话年近三十的压力真的有点大,没有结婚,也没什么存款,买不起车也买不起房,虽然不啃老,但是日子过的也不大理想。

\n

家中的老人始终都觉得如果你不结婚那以后肯定就是娶不到老婆了。

\n

我曾经因为这个理由去相亲,去面试,让本来不是很擅长与人打交道的我很是尴尬。

\n

当然结果是显而易见的,都没成功。 最近小草莓要结婚了。

\n

小草莓与我相识已经有十年了吧,当初就是在我维护的论坛上认识的妹子。

\n

不由得感叹时间真的快。

\n

小草莓是个软妹子。

\n

二次元少女。

\n

呃,姑且还算是少女吧。

\n

我虽然宅,但是我不混二次元,所以我对动漫啊日语啊都不熟悉。

\n

有时候觉得这么一大把年纪了还在混二次元真的是件很羞耻的事情。

\n

国庆节小草莓约我去广州陪她玩耍,我内心是拒绝的,所以我就婉约的拒绝了,国庆节人山人海也就罢了,去广州的路上还塞车,根本不值得去,何况我也不想去打搅他们的二人世界,去做一个闪光的人。

\n

我对她的先生一点都不熟悉,准确来说只在图片上见到过,根本没有与其本人打过交道。

\n

这个也是我拒绝去的理由。

\n

这辈子也不太可能有交集。

\n

在我们堂兄弟之中目前除了我没有结婚意外也就只有几个很小的没有结婚了。

\n

大部分比我小的堂弟都已经生了二胎。

\n

对此我觉得我应该是比不赢的了。

\n","site":{"data":{}},"more":"

说实在话年近三十的压力真的有点大,没有结婚,也没什么存款,买不起车也买不起房,虽然不啃老,但是日子过的也不大理想。

\n

家中的老人始终都觉得如果你不结婚那以后肯定就是娶不到老婆了。

\n

我曾经因为这个理由去相亲,去面试,让本来不是很擅长与人打交道的我很是尴尬。

\n

当然结果是显而易见的,都没成功。 最近小草莓要结婚了。

\n

小草莓与我相识已经有十年了吧,当初就是在我维护的论坛上认识的妹子。

\n

不由得感叹时间真的快。

\n

小草莓是个软妹子。

\n

二次元少女。

\n

呃,姑且还算是少女吧。

\n

我虽然宅,但是我不混二次元,所以我对动漫啊日语啊都不熟悉。

\n

有时候觉得这么一大把年纪了还在混二次元真的是件很羞耻的事情。

\n

国庆节小草莓约我去广州陪她玩耍,我内心是拒绝的,所以我就婉约的拒绝了,国庆节人山人海也就罢了,去广州的路上还塞车,根本不值得去,何况我也不想去打搅他们的二人世界,去做一个闪光的人。

\n

我对她的先生一点都不熟悉,准确来说只在图片上见到过,根本没有与其本人打过交道。

\n

这个也是我拒绝去的理由。

\n

这辈子也不太可能有交集。

\n

在我们堂兄弟之中目前除了我没有结婚意外也就只有几个很小的没有结婚了。

\n

大部分比我小的堂弟都已经生了二胎。

\n

对此我觉得我应该是比不赢的了。

\n"},{"title":"周二","excerpt":"","abbrlink":31481,"date":"2011-10-18T01:53:51.000Z","_content":"\n2011年11月18日,星期二,天气晴。 \n\n我承认我变得更加懒惰。\n\n几乎没有时间更新博客。 \n\n主要是没什么写的欲望。 \n\n我在玩腾讯的游戏《[H2](http://h2.181p.com)》。\n\n仿梦幻西游的回合制游戏。 \n\n四大种族貌似大话,但是种族技能却貌似梦幻。 \n\n有独特的玩法,但是还是觉得这样的游戏会很累。 \n\n每个人都有自己强大起来的欲望。 \n\n要点技能要极品装备极品宝宝。 \n\n这些都要时间要力气。 \n\n所以。 \n\n我真的投入了一些精力。\n\n但是也累了。 \n\n这些都不是娱乐至上的游戏。 \n\n还不如玩玩三国杀玩玩龙之谷呢。 \n\nPS,下午两点南香里巴士站工商银行旁面试。\n\n---\n\n更新于2023年6月\n\n这个游戏最终还是上线运营了两年,然后停止运营匆匆了事了.\n\n上线时候的名字似乎叫 QQ仙灵 \n\n很拉胯的名字让人没有想玩的欲望.\n\n甚至还没有当年的回合制网友梦幻聊斋 或者 梦幻红楼 梦幻古龙此类的更有吸睛的能力\n\n再加上腾讯只想让人氪金,一点都不考虑游戏的趣味性.\n\n看看梦幻西游经久不衰,氪金的大有人在,可为什么还是有那么多人玩.\n\n最主要的就是经济体系的收支平衡.\n\n游戏中所有道具的产出和消耗是平衡的.\n\n如果产出太多的货币无法消耗,自然就是通货膨胀,物价飞涨,普通玩家没有体验而逐渐放弃.\n","source":"_posts/周二.md","raw":"---\ntitle: 周二\ntags:\n - H2\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 31481\ndate: 2011-10-18 09:53:51\n---\n\n2011年11月18日,星期二,天气晴。 \n\n我承认我变得更加懒惰。\n\n几乎没有时间更新博客。 \n\n主要是没什么写的欲望。 \n\n我在玩腾讯的游戏《[H2](http://h2.181p.com)》。\n\n仿梦幻西游的回合制游戏。 \n\n四大种族貌似大话,但是种族技能却貌似梦幻。 \n\n有独特的玩法,但是还是觉得这样的游戏会很累。 \n\n每个人都有自己强大起来的欲望。 \n\n要点技能要极品装备极品宝宝。 \n\n这些都要时间要力气。 \n\n所以。 \n\n我真的投入了一些精力。\n\n但是也累了。 \n\n这些都不是娱乐至上的游戏。 \n\n还不如玩玩三国杀玩玩龙之谷呢。 \n\nPS,下午两点南香里巴士站工商银行旁面试。\n\n---\n\n更新于2023年6月\n\n这个游戏最终还是上线运营了两年,然后停止运营匆匆了事了.\n\n上线时候的名字似乎叫 QQ仙灵 \n\n很拉胯的名字让人没有想玩的欲望.\n\n甚至还没有当年的回合制网友梦幻聊斋 或者 梦幻红楼 梦幻古龙此类的更有吸睛的能力\n\n再加上腾讯只想让人氪金,一点都不考虑游戏的趣味性.\n\n看看梦幻西游经久不衰,氪金的大有人在,可为什么还是有那么多人玩.\n\n最主要的就是经济体系的收支平衡.\n\n游戏中所有道具的产出和消耗是平衡的.\n\n如果产出太多的货币无法消耗,自然就是通货膨胀,物价飞涨,普通玩家没有体验而逐渐放弃.\n","slug":"周二","published":1,"updated":"2023-09-30T02:59:46.520Z","_id":"cln4obyh200dqoko0hanoeoxo","comments":1,"layout":"post","photos":[],"link":"","content":"

2011年11月18日,星期二,天气晴。

\n

我承认我变得更加懒惰。

\n

几乎没有时间更新博客。

\n

主要是没什么写的欲望。

\n

我在玩腾讯的游戏《H2》。

\n

仿梦幻西游的回合制游戏。

\n

四大种族貌似大话,但是种族技能却貌似梦幻。

\n

有独特的玩法,但是还是觉得这样的游戏会很累。

\n

每个人都有自己强大起来的欲望。

\n

要点技能要极品装备极品宝宝。

\n

这些都要时间要力气。

\n

所以。

\n

我真的投入了一些精力。

\n

但是也累了。

\n

这些都不是娱乐至上的游戏。

\n

还不如玩玩三国杀玩玩龙之谷呢。

\n

PS,下午两点南香里巴士站工商银行旁面试。

\n
\n

更新于2023年6月

\n

这个游戏最终还是上线运营了两年,然后停止运营匆匆了事了.

\n

上线时候的名字似乎叫 QQ仙灵

\n

很拉胯的名字让人没有想玩的欲望.

\n

甚至还没有当年的回合制网友梦幻聊斋 或者 梦幻红楼 梦幻古龙此类的更有吸睛的能力

\n

再加上腾讯只想让人氪金,一点都不考虑游戏的趣味性.

\n

看看梦幻西游经久不衰,氪金的大有人在,可为什么还是有那么多人玩.

\n

最主要的就是经济体系的收支平衡.

\n

游戏中所有道具的产出和消耗是平衡的.

\n

如果产出太多的货币无法消耗,自然就是通货膨胀,物价飞涨,普通玩家没有体验而逐渐放弃.

\n","site":{"data":{}},"more":"

2011年11月18日,星期二,天气晴。

\n

我承认我变得更加懒惰。

\n

几乎没有时间更新博客。

\n

主要是没什么写的欲望。

\n

我在玩腾讯的游戏《H2》。

\n

仿梦幻西游的回合制游戏。

\n

四大种族貌似大话,但是种族技能却貌似梦幻。

\n

有独特的玩法,但是还是觉得这样的游戏会很累。

\n

每个人都有自己强大起来的欲望。

\n

要点技能要极品装备极品宝宝。

\n

这些都要时间要力气。

\n

所以。

\n

我真的投入了一些精力。

\n

但是也累了。

\n

这些都不是娱乐至上的游戏。

\n

还不如玩玩三国杀玩玩龙之谷呢。

\n

PS,下午两点南香里巴士站工商银行旁面试。

\n
\n

更新于2023年6月

\n

这个游戏最终还是上线运营了两年,然后停止运营匆匆了事了.

\n

上线时候的名字似乎叫 QQ仙灵

\n

很拉胯的名字让人没有想玩的欲望.

\n

甚至还没有当年的回合制网友梦幻聊斋 或者 梦幻红楼 梦幻古龙此类的更有吸睛的能力

\n

再加上腾讯只想让人氪金,一点都不考虑游戏的趣味性.

\n

看看梦幻西游经久不衰,氪金的大有人在,可为什么还是有那么多人玩.

\n

最主要的就是经济体系的收支平衡.

\n

游戏中所有道具的产出和消耗是平衡的.

\n

如果产出太多的货币无法消耗,自然就是通货膨胀,物价飞涨,普通玩家没有体验而逐渐放弃.

\n"},{"title":"又是拳头","excerpt":"","abbrlink":24539,"date":"2016-11-18T04:56:15.000Z","_content":"\n中午吃饭的时候就在想,人类最早的时候是先有语言呢还是先有文字。 \n\n至于史学家这么考证暂且不管,说说我的思路。 \n\n最早的人类因为吃到了好吃的熟食或者渴望温暖与光明,所以学会了用火。 \n\n吃了熟食之后发现自己拳头特别有力量,可以号令其他人。(参考动物世界) \n\n这时候是没有语言的,大家都是瞎比划。(嗷嗷嗷,参考猩猩) \n\n人们学会了养殖。\n\n要计数,这才有了最早的算筹。\n\n历史书上写的应该是绳子,后来发现绳子太脆弱,就改成刻在石头上。 \n\n这应该是最早的文字。 \n\n中国大部分文字其实都是象形文字,大约就是像什么画下来表示。 \n\n至于这个读音嘛,大概就是一个部落一种理解,每个部落的发音都不太一样。\n\n后来才有了多音字。\n\n就是因为发音不统一造成的。 \n\n说道这里可能有人会以为我跑题了。 \n\n其实并没有,这一切都是跟拳头有关的。\n\n因为拳头,造就了阶级。\n\n因为拳头强迫人们学习。\n\n以及统一。(秦始皇真的很伟大) \n\n现在的人都说秦始皇暴虐,其实他就是为了千秋万代的统治才这样做。 \n\n说到这里,其实这一切都是为了便于统治。 \n\n推广儒家的思想,君子动口不动手,大家都做了君子,只动口,不动手。\n\n都不反抗,都不惹是生非,岂不是就天下太平了。\n\n统治者不就最喜欢看到这样的结果么。 \n\n还是那句话,拳头大的说了算。 \n\n而文明也是如此。\n\n侠以武犯禁,但是和平从来都是武力争取来的.","source":"_posts/又是拳头.md","raw":"---\ntitle: 又是拳头\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 24539\ndate: 2016-11-18 12:56:15\n---\n\n中午吃饭的时候就在想,人类最早的时候是先有语言呢还是先有文字。 \n\n至于史学家这么考证暂且不管,说说我的思路。 \n\n最早的人类因为吃到了好吃的熟食或者渴望温暖与光明,所以学会了用火。 \n\n吃了熟食之后发现自己拳头特别有力量,可以号令其他人。(参考动物世界) \n\n这时候是没有语言的,大家都是瞎比划。(嗷嗷嗷,参考猩猩) \n\n人们学会了养殖。\n\n要计数,这才有了最早的算筹。\n\n历史书上写的应该是绳子,后来发现绳子太脆弱,就改成刻在石头上。 \n\n这应该是最早的文字。 \n\n中国大部分文字其实都是象形文字,大约就是像什么画下来表示。 \n\n至于这个读音嘛,大概就是一个部落一种理解,每个部落的发音都不太一样。\n\n后来才有了多音字。\n\n就是因为发音不统一造成的。 \n\n说道这里可能有人会以为我跑题了。 \n\n其实并没有,这一切都是跟拳头有关的。\n\n因为拳头,造就了阶级。\n\n因为拳头强迫人们学习。\n\n以及统一。(秦始皇真的很伟大) \n\n现在的人都说秦始皇暴虐,其实他就是为了千秋万代的统治才这样做。 \n\n说到这里,其实这一切都是为了便于统治。 \n\n推广儒家的思想,君子动口不动手,大家都做了君子,只动口,不动手。\n\n都不反抗,都不惹是生非,岂不是就天下太平了。\n\n统治者不就最喜欢看到这样的结果么。 \n\n还是那句话,拳头大的说了算。 \n\n而文明也是如此。\n\n侠以武犯禁,但是和平从来都是武力争取来的.","slug":"又是拳头","published":1,"updated":"2023-09-30T02:59:46.520Z","_id":"cln4obyh300dtoko02up90jo7","comments":1,"layout":"post","photos":[],"link":"","content":"

中午吃饭的时候就在想,人类最早的时候是先有语言呢还是先有文字。

\n

至于史学家这么考证暂且不管,说说我的思路。

\n

最早的人类因为吃到了好吃的熟食或者渴望温暖与光明,所以学会了用火。

\n

吃了熟食之后发现自己拳头特别有力量,可以号令其他人。(参考动物世界)

\n

这时候是没有语言的,大家都是瞎比划。(嗷嗷嗷,参考猩猩)

\n

人们学会了养殖。

\n

要计数,这才有了最早的算筹。

\n

历史书上写的应该是绳子,后来发现绳子太脆弱,就改成刻在石头上。

\n

这应该是最早的文字。

\n

中国大部分文字其实都是象形文字,大约就是像什么画下来表示。

\n

至于这个读音嘛,大概就是一个部落一种理解,每个部落的发音都不太一样。

\n

后来才有了多音字。

\n

就是因为发音不统一造成的。

\n

说道这里可能有人会以为我跑题了。

\n

其实并没有,这一切都是跟拳头有关的。

\n

因为拳头,造就了阶级。

\n

因为拳头强迫人们学习。

\n

以及统一。(秦始皇真的很伟大)

\n

现在的人都说秦始皇暴虐,其实他就是为了千秋万代的统治才这样做。

\n

说到这里,其实这一切都是为了便于统治。

\n

推广儒家的思想,君子动口不动手,大家都做了君子,只动口,不动手。

\n

都不反抗,都不惹是生非,岂不是就天下太平了。

\n

统治者不就最喜欢看到这样的结果么。

\n

还是那句话,拳头大的说了算。

\n

而文明也是如此。

\n

侠以武犯禁,但是和平从来都是武力争取来的.

\n","site":{"data":{}},"more":"

中午吃饭的时候就在想,人类最早的时候是先有语言呢还是先有文字。

\n

至于史学家这么考证暂且不管,说说我的思路。

\n

最早的人类因为吃到了好吃的熟食或者渴望温暖与光明,所以学会了用火。

\n

吃了熟食之后发现自己拳头特别有力量,可以号令其他人。(参考动物世界)

\n

这时候是没有语言的,大家都是瞎比划。(嗷嗷嗷,参考猩猩)

\n

人们学会了养殖。

\n

要计数,这才有了最早的算筹。

\n

历史书上写的应该是绳子,后来发现绳子太脆弱,就改成刻在石头上。

\n

这应该是最早的文字。

\n

中国大部分文字其实都是象形文字,大约就是像什么画下来表示。

\n

至于这个读音嘛,大概就是一个部落一种理解,每个部落的发音都不太一样。

\n

后来才有了多音字。

\n

就是因为发音不统一造成的。

\n

说道这里可能有人会以为我跑题了。

\n

其实并没有,这一切都是跟拳头有关的。

\n

因为拳头,造就了阶级。

\n

因为拳头强迫人们学习。

\n

以及统一。(秦始皇真的很伟大)

\n

现在的人都说秦始皇暴虐,其实他就是为了千秋万代的统治才这样做。

\n

说到这里,其实这一切都是为了便于统治。

\n

推广儒家的思想,君子动口不动手,大家都做了君子,只动口,不动手。

\n

都不反抗,都不惹是生非,岂不是就天下太平了。

\n

统治者不就最喜欢看到这样的结果么。

\n

还是那句话,拳头大的说了算。

\n

而文明也是如此。

\n

侠以武犯禁,但是和平从来都是武力争取来的.

\n"},{"title":"周日","excerpt":"","abbrlink":13444,"date":"2016-05-29T14:37:32.000Z","_content":"\n许久没有记录什么了,突然想起还有博客这回事,就准备写点什么。 \n\n最近在听许巍的《生活不止眼前的苟且》。 \n\n感觉高晓松还是挺有才的,值得一赞。 \n\n毕竟听了那么多年的同桌的你。\n\n---\n\n2023年6月更新\n\n矮大紧被打成公知.\n\n黄磊人设崩塌...\n\n等等等\n\n明星终究还是会褪去光环.\n\n落入尘埃之中.\n\n本就是凡人 何必装成天上的仙儿呢","source":"_posts/周日.md","raw":"---\ntitle: 周日\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 13444\ndate: 2016-05-29 22:37:32\n---\n\n许久没有记录什么了,突然想起还有博客这回事,就准备写点什么。 \n\n最近在听许巍的《生活不止眼前的苟且》。 \n\n感觉高晓松还是挺有才的,值得一赞。 \n\n毕竟听了那么多年的同桌的你。\n\n---\n\n2023年6月更新\n\n矮大紧被打成公知.\n\n黄磊人设崩塌...\n\n等等等\n\n明星终究还是会褪去光环.\n\n落入尘埃之中.\n\n本就是凡人 何必装成天上的仙儿呢","slug":"周日","published":1,"updated":"2023-09-30T02:59:46.520Z","_id":"cln4obyh300dxoko0aq8n03yw","comments":1,"layout":"post","photos":[],"link":"","content":"

许久没有记录什么了,突然想起还有博客这回事,就准备写点什么。

\n

最近在听许巍的《生活不止眼前的苟且》。

\n

感觉高晓松还是挺有才的,值得一赞。

\n

毕竟听了那么多年的同桌的你。

\n
\n

2023年6月更新

\n

矮大紧被打成公知.

\n

黄磊人设崩塌…

\n

等等等

\n

明星终究还是会褪去光环.

\n

落入尘埃之中.

\n

本就是凡人 何必装成天上的仙儿呢

\n","site":{"data":{}},"more":"

许久没有记录什么了,突然想起还有博客这回事,就准备写点什么。

\n

最近在听许巍的《生活不止眼前的苟且》。

\n

感觉高晓松还是挺有才的,值得一赞。

\n

毕竟听了那么多年的同桌的你。

\n
\n

2023年6月更新

\n

矮大紧被打成公知.

\n

黄磊人设崩塌…

\n

等等等

\n

明星终究还是会褪去光环.

\n

落入尘埃之中.

\n

本就是凡人 何必装成天上的仙儿呢

\n"},{"title":"圣诞节","excerpt":"","abbrlink":19175,"date":"2017-12-25T01:52:06.000Z","_content":"\n又是一年的圣诞节,对于这种洋节日,我们这些80后接受度还是很高的。 \n特别是在高中时代。\n我怀念那段时光。 \n有些在读书的小朋友可能会问,为什么这些大人怀念的都是当初上学时候的事情?\n明明上学一点都不好玩。 \n我不会告诉他们,学生时代是最美好的时代。\n有单纯,热血,没有功利,分是非对错,有理想,有梦想。 \n因为现实真的会教做人。\n我学会了慢慢的丢了节操,忘记了梦想,分不清对错,只追逐利益。 \n我可能会借口说,都是为了生活。 \n我喜欢的歌手朴树,去参加综艺节目的时候,别人问他,你为什么要来参加这样的节目呢?\n他回答,我最近比较需要钱。 \n就是这么直接简单的一个人。\n当年也是红极一时的歌手,从来不参加综艺节目的他,也不得不妥协,向着现实低头。 \n很多评论家说,如今的社会越来越浮躁,丢失信仰,争名逐利。\n一切向钱看。\n这一切都是悲哀的。\n却是无法改变的。 \n人总要生活的吧。\n朴树这样说。 \n圣诞节里本不该说这样的话题。\n是我跑偏了。 \n圣诞节快乐!我许久不见的朋友们!","source":"_posts/圣诞节.md","raw":"---\ntitle: 圣诞节\ntags:\n - 圣诞节\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 19175\ndate: 2017-12-25 09:52:06\n---\n\n又是一年的圣诞节,对于这种洋节日,我们这些80后接受度还是很高的。 \n特别是在高中时代。\n我怀念那段时光。 \n有些在读书的小朋友可能会问,为什么这些大人怀念的都是当初上学时候的事情?\n明明上学一点都不好玩。 \n我不会告诉他们,学生时代是最美好的时代。\n有单纯,热血,没有功利,分是非对错,有理想,有梦想。 \n因为现实真的会教做人。\n我学会了慢慢的丢了节操,忘记了梦想,分不清对错,只追逐利益。 \n我可能会借口说,都是为了生活。 \n我喜欢的歌手朴树,去参加综艺节目的时候,别人问他,你为什么要来参加这样的节目呢?\n他回答,我最近比较需要钱。 \n就是这么直接简单的一个人。\n当年也是红极一时的歌手,从来不参加综艺节目的他,也不得不妥协,向着现实低头。 \n很多评论家说,如今的社会越来越浮躁,丢失信仰,争名逐利。\n一切向钱看。\n这一切都是悲哀的。\n却是无法改变的。 \n人总要生活的吧。\n朴树这样说。 \n圣诞节里本不该说这样的话题。\n是我跑偏了。 \n圣诞节快乐!我许久不见的朋友们!","slug":"圣诞节","published":1,"updated":"2023-09-30T02:59:46.520Z","_id":"cln4obyh400e0oko0e4rr7rn9","comments":1,"layout":"post","photos":[],"link":"","content":"

又是一年的圣诞节,对于这种洋节日,我们这些80后接受度还是很高的。
特别是在高中时代。
我怀念那段时光。
有些在读书的小朋友可能会问,为什么这些大人怀念的都是当初上学时候的事情?
明明上学一点都不好玩。
我不会告诉他们,学生时代是最美好的时代。
有单纯,热血,没有功利,分是非对错,有理想,有梦想。
因为现实真的会教做人。
我学会了慢慢的丢了节操,忘记了梦想,分不清对错,只追逐利益。
我可能会借口说,都是为了生活。
我喜欢的歌手朴树,去参加综艺节目的时候,别人问他,你为什么要来参加这样的节目呢?
他回答,我最近比较需要钱。
就是这么直接简单的一个人。
当年也是红极一时的歌手,从来不参加综艺节目的他,也不得不妥协,向着现实低头。
很多评论家说,如今的社会越来越浮躁,丢失信仰,争名逐利。
一切向钱看。
这一切都是悲哀的。
却是无法改变的。
人总要生活的吧。
朴树这样说。
圣诞节里本不该说这样的话题。
是我跑偏了。
圣诞节快乐!我许久不见的朋友们!

\n","site":{"data":{}},"more":"

又是一年的圣诞节,对于这种洋节日,我们这些80后接受度还是很高的。
特别是在高中时代。
我怀念那段时光。
有些在读书的小朋友可能会问,为什么这些大人怀念的都是当初上学时候的事情?
明明上学一点都不好玩。
我不会告诉他们,学生时代是最美好的时代。
有单纯,热血,没有功利,分是非对错,有理想,有梦想。
因为现实真的会教做人。
我学会了慢慢的丢了节操,忘记了梦想,分不清对错,只追逐利益。
我可能会借口说,都是为了生活。
我喜欢的歌手朴树,去参加综艺节目的时候,别人问他,你为什么要来参加这样的节目呢?
他回答,我最近比较需要钱。
就是这么直接简单的一个人。
当年也是红极一时的歌手,从来不参加综艺节目的他,也不得不妥协,向着现实低头。
很多评论家说,如今的社会越来越浮躁,丢失信仰,争名逐利。
一切向钱看。
这一切都是悲哀的。
却是无法改变的。
人总要生活的吧。
朴树这样说。
圣诞节里本不该说这样的话题。
是我跑偏了。
圣诞节快乐!我许久不见的朋友们!

\n"},{"title":"如何在Fly.io部署Memos","abbrlink":"88a97a51","date":"2023-08-14T16:00:00.000Z","cover":null,"_content":" \n## 项目\nhttps://github.com/hu3rror/memos-on-fly\n## 准备工作\n\n- 注册FLY.IO \n用以部署memos\n- 注册B2C \nhttps://www.backblaze.com/cloud-storage\n 用以同步备份memos数据库\n 新建BUCKET,并获取``和``\n\n\n## 安装flyctl\nInstall flyctl \n以WINDOWS为例\n```\npwsh -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n其他系统请参照官方\n## 新建APP\n初始化\n```\nflyctl launch\n```\n按照提示选择会生成一个FLY.TOML文件\n\n## 编辑FLY.TOML\n添加以下\n```\n[build]\n image = \"ghcr.io/hu3rror/memos-litestream:latest\"\n#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest\n#使用官方镜像可以删掉env的部分\n[env]\n # Details see: https://litestream.io/guides/backblaze/\n LITESTREAM_REPLICA_BUCKET = \"B2C桶名称\" # change to your litestream bucket name\n LITESTREAM_REPLICA_ENDPOINT = \"s3.us-east-005.backblazeb2.com\" # change to your litestream endpoint url\n LITESTREAM_REPLICA_PATH = \"memos_prod.db\" # keep the default or change to whatever path you want\n\n[[mounts]]\n source = \"memos_data\"\n destination = \"/var/opt/memos\"\n\n[http_service]\n internal_port = 5230\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 0\n```\n## 添加持久卷\n```\nflyctl volumes create memos_data --region hkg --size 1\n```\n## 密钥\n将B2存储的密钥添加到fly的密钥存储中,使用官方镜像可以忽略此步骤\n```\nflyctl secrets set LITESTREAM_ACCESS_KEY_ID=\"\" LITESTREAM_SECRET_ACCESS_KEY=\"\"\n```\n## 部署\n```\nflyctl deploy\n```\n## 演示地址\nhttps://memosim.fly.dev/\n绑定域名演示\nhttps://imad.top\n","source":"_posts/在Fly.io部署Memos.md","raw":"---\ntitle: 如何在Fly.io部署Memos\ntags: Memos\ncategories: 分享\nabbrlink: 88a97a51\ndate: 2023-08-15 00:00:00\ncover:\n---\n \n## 项目\nhttps://github.com/hu3rror/memos-on-fly\n## 准备工作\n\n- 注册FLY.IO \n用以部署memos\n- 注册B2C \nhttps://www.backblaze.com/cloud-storage\n 用以同步备份memos数据库\n 新建BUCKET,并获取``和``\n\n\n## 安装flyctl\nInstall flyctl \n以WINDOWS为例\n```\npwsh -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n其他系统请参照官方\n## 新建APP\n初始化\n```\nflyctl launch\n```\n按照提示选择会生成一个FLY.TOML文件\n\n## 编辑FLY.TOML\n添加以下\n```\n[build]\n image = \"ghcr.io/hu3rror/memos-litestream:latest\"\n#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest\n#使用官方镜像可以删掉env的部分\n[env]\n # Details see: https://litestream.io/guides/backblaze/\n LITESTREAM_REPLICA_BUCKET = \"B2C桶名称\" # change to your litestream bucket name\n LITESTREAM_REPLICA_ENDPOINT = \"s3.us-east-005.backblazeb2.com\" # change to your litestream endpoint url\n LITESTREAM_REPLICA_PATH = \"memos_prod.db\" # keep the default or change to whatever path you want\n\n[[mounts]]\n source = \"memos_data\"\n destination = \"/var/opt/memos\"\n\n[http_service]\n internal_port = 5230\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 0\n```\n## 添加持久卷\n```\nflyctl volumes create memos_data --region hkg --size 1\n```\n## 密钥\n将B2存储的密钥添加到fly的密钥存储中,使用官方镜像可以忽略此步骤\n```\nflyctl secrets set LITESTREAM_ACCESS_KEY_ID=\"\" LITESTREAM_SECRET_ACCESS_KEY=\"\"\n```\n## 部署\n```\nflyctl deploy\n```\n## 演示地址\nhttps://memosim.fly.dev/\n绑定域名演示\nhttps://imad.top\n","slug":"在Fly.io部署Memos","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyh500e3oko061ca3uey","comments":1,"layout":"post","photos":[],"link":"","content":"

项目

https://github.com/hu3rror/memos-on-fly

\n

准备工作

\n

安装flyctl

Install flyctl
以WINDOWS为例

\n
1
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n

其他系统请参照官方

\n

新建APP

初始化

\n
1
flyctl launch
\n

按照提示选择会生成一个FLY.TOML文件

\n

编辑FLY.TOML

添加以下

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[build]
image = "ghcr.io/hu3rror/memos-litestream:latest"
#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest
#使用官方镜像可以删掉env的部分
[env]
# Details see: https://litestream.io/guides/backblaze/
LITESTREAM_REPLICA_BUCKET = "B2C桶名称" # change to your litestream bucket name
LITESTREAM_REPLICA_ENDPOINT = "s3.us-east-005.backblazeb2.com" # change to your litestream endpoint url
LITESTREAM_REPLICA_PATH = "memos_prod.db" # keep the default or change to whatever path you want

[[mounts]]
source = "memos_data"
destination = "/var/opt/memos"

[http_service]
internal_port = 5230
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 0
\n

添加持久卷

1
flyctl volumes create memos_data --region hkg --size 1
\n

密钥

将B2存储的密钥添加到fly的密钥存储中,使用官方镜像可以忽略此步骤

\n
1
flyctl secrets set LITESTREAM_ACCESS_KEY_ID="<keyId>" LITESTREAM_SECRET_ACCESS_KEY="<applicationKey>"
\n

部署

1
flyctl deploy
\n

演示地址

https://memosim.fly.dev/
绑定域名演示
https://imad.top

\n","site":{"data":{}},"excerpt":"","more":"

项目

https://github.com/hu3rror/memos-on-fly

\n

准备工作

\n

安装flyctl

Install flyctl
以WINDOWS为例

\n
1
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n

其他系统请参照官方

\n

新建APP

初始化

\n
1
flyctl launch
\n

按照提示选择会生成一个FLY.TOML文件

\n

编辑FLY.TOML

添加以下

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[build]
image = "ghcr.io/hu3rror/memos-litestream:latest"
#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest
#使用官方镜像可以删掉env的部分
[env]
# Details see: https://litestream.io/guides/backblaze/
LITESTREAM_REPLICA_BUCKET = "B2C桶名称" # change to your litestream bucket name
LITESTREAM_REPLICA_ENDPOINT = "s3.us-east-005.backblazeb2.com" # change to your litestream endpoint url
LITESTREAM_REPLICA_PATH = "memos_prod.db" # keep the default or change to whatever path you want

[[mounts]]
source = "memos_data"
destination = "/var/opt/memos"

[http_service]
internal_port = 5230
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 0
\n

添加持久卷

1
flyctl volumes create memos_data --region hkg --size 1
\n

密钥

将B2存储的密钥添加到fly的密钥存储中,使用官方镜像可以忽略此步骤

\n
1
flyctl secrets set LITESTREAM_ACCESS_KEY_ID="<keyId>" LITESTREAM_SECRET_ACCESS_KEY="<applicationKey>"
\n

部署

1
flyctl deploy
\n

演示地址

https://memosim.fly.dev/
绑定域名演示
https://imad.top

\n"},{"title":"在fly.io部署artalk评论系统","published":1,"abbrlink":"c80a64e9","date":"2023-08-15T01:37:00.000Z","cover":null,"_content":"众所周知`Fly.io`是一个免费的SAAS平台\n提供三个内存为256MB的服务器,总3G硬盘空间.\n为防止滥用,需要绑定信用卡.\n## 准备\n安装官方的命令行工具flyctl\n\n## 初始化\n```\nflyctl launch\n```\n根据提示创建一个app\n\n## 创建一个1G的硬盘\n1G的硬盘用来储存评论数据绰绰有余了\n```\nflyctl volumes create artalk_data --region hkg --size 1\n```\n## 编辑FLY.TOML\n\n```\n#根据自动生成的FLY.TOML文件修改\napp = \"atim\" \nprimary_region = \"hkg\"\n\n[build]\n image = \"artalk/artalk-go\"\n\n[http_service]\n internal_port = 23366\n force_https = true\n auto_stop_machines = true\n auto_start_machines = true\n min_machines_running = 0\n processes = [\"app\"]\n\n[[mounts]]\n source = \"artalk_data\"\n destination = \"/data\"\n\n[experimental]\n vm = true\n```\n## 在 fly.toml 文件目录执行\n```\nflyctl ssh console\n```\n创建一个管理员账号\n```\n./artalk admin\n```\n如需重启则执行\n```\nflyctl apps restart\n```\n","source":"_posts/在fly.io部署artalk评论系统.md","raw":"---\ntitle: 在fly.io部署artalk评论系统\ntags:\n - artalk\npublished: true\ncategories: 推荐\nabbrlink: c80a64e9\ndate: 2023-08-15 09:37:00\ncover:\n---\n众所周知`Fly.io`是一个免费的SAAS平台\n提供三个内存为256MB的服务器,总3G硬盘空间.\n为防止滥用,需要绑定信用卡.\n## 准备\n安装官方的命令行工具flyctl\n\n## 初始化\n```\nflyctl launch\n```\n根据提示创建一个app\n\n## 创建一个1G的硬盘\n1G的硬盘用来储存评论数据绰绰有余了\n```\nflyctl volumes create artalk_data --region hkg --size 1\n```\n## 编辑FLY.TOML\n\n```\n#根据自动生成的FLY.TOML文件修改\napp = \"atim\" \nprimary_region = \"hkg\"\n\n[build]\n image = \"artalk/artalk-go\"\n\n[http_service]\n internal_port = 23366\n force_https = true\n auto_stop_machines = true\n auto_start_machines = true\n min_machines_running = 0\n processes = [\"app\"]\n\n[[mounts]]\n source = \"artalk_data\"\n destination = \"/data\"\n\n[experimental]\n vm = true\n```\n## 在 fly.toml 文件目录执行\n```\nflyctl ssh console\n```\n创建一个管理员账号\n```\n./artalk admin\n```\n如需重启则执行\n```\nflyctl apps restart\n```\n","slug":"在fly.io部署artalk评论系统","updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyh500e7oko08s7t4jc0","comments":1,"layout":"post","photos":[],"link":"","content":"

众所周知Fly.io是一个免费的SAAS平台
提供三个内存为256MB的服务器,总3G硬盘空间.
为防止滥用,需要绑定信用卡.

\n

准备

安装官方的命令行工具flyctl

\n

初始化

1
flyctl launch
\n

根据提示创建一个app

\n

创建一个1G的硬盘

1G的硬盘用来储存评论数据绰绰有余了

\n
1
flyctl volumes create artalk_data --region hkg --size 1
\n

编辑FLY.TOML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#根据自动生成的FLY.TOML文件修改
app = "atim"
primary_region = "hkg"

[build]
image = "artalk/artalk-go"

[http_service]
internal_port = 23366
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ["app"]

[[mounts]]
source = "artalk_data"
destination = "/data"

[experimental]
vm = true
\n

在 fly.toml 文件目录执行

1
flyctl ssh console
\n

创建一个管理员账号

\n
1
./artalk admin
\n

如需重启则执行

\n
1
flyctl apps restart
\n","site":{"data":{}},"excerpt":"","more":"

众所周知Fly.io是一个免费的SAAS平台
提供三个内存为256MB的服务器,总3G硬盘空间.
为防止滥用,需要绑定信用卡.

\n

准备

安装官方的命令行工具flyctl

\n

初始化

1
flyctl launch
\n

根据提示创建一个app

\n

创建一个1G的硬盘

1G的硬盘用来储存评论数据绰绰有余了

\n
1
flyctl volumes create artalk_data --region hkg --size 1
\n

编辑FLY.TOML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#根据自动生成的FLY.TOML文件修改
app = "atim"
primary_region = "hkg"

[build]
image = "artalk/artalk-go"

[http_service]
internal_port = 23366
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ["app"]

[[mounts]]
source = "artalk_data"
destination = "/data"

[experimental]
vm = true
\n

在 fly.toml 文件目录执行

1
flyctl ssh console
\n

创建一个管理员账号

\n
1
./artalk admin
\n

如需重启则执行

\n
1
flyctl apps restart
\n"},{"title":"在fly.io部署Gotosocial","abbrlink":"9597b72","date":"2023-08-17T10:55:46.000Z","_content":"\n## 关于Gotosocial\n\nGoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。\n\n## 准备\n\n- 注册 Fly.io 账号,并绑卡(避免滥用);\n- 注册 Cloudflare 并启用 R2,启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。\n\n## 安装 flyctl\n\n- Linux\n\n```\ncurl -L https://fly.io/install.sh | sh\n```\n\n- macOS\n\n```\ncurl -L https://fly.io/install.sh | sh\n```\n\n- Windows,需要开启 RemoteSigned: 管理员运行\n\n```\n Set-ExecutionPolicy -ExecutionPolicy RemoteSigned\n```\n\n```\npowershell -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n\n## 登录\n\n```\nflyctl auth login\n\n# 若登录失败使用\n# flyctl auth login -i \n# 输入账号密码进行登录\n```\n\n## 创建APP\n\n`YOURAPPNAME`更改为自己希望设置的名称\n\n```\nflyctl launch --name YOURAPPNAME --image=superseriousbusiness/gotosocial:latest --region hkg --no-deploy\n```\n\n## 创建储存卷\n\n```\nflyctl volumes create social_data --region hkg --size 1\n```\n\n## 编辑配置\n\n编辑根目录下的 `fly.toml` 配置文件,参考下方\n\n```\napp = \"gotos\" ## 自定义名称\nprimary_region = \"hkg\" ##服务器节点,当前为香港\n\n[experimental]\n vm = true\n\n[build]\n image = \"superseriousbusiness/gotosocial:latest\"\n\n[env]\n GTS_DB_ADDRESS = \"/gotosocial/storage/sqlite.db\"\n GTS_DB_TLS_MODE = \"enable\"\n GTS_DB_TYPE = \"sqlite\"\n GTS_HOST = \"GTS的域名\"\n GTS_LETSENCRYPT_ENABLED = \"false\"\n GTS_STORAGE_BACKEND = \"s3\"\n GTS_STORAGE_S3_BUCKET = \"BUCKET名称\"\n GTS_STORAGE_S3_ENDPOINT = \"#S3 API\"\n GTS_STORAGE_S3_ACCESS_KEY = \"#api-tokens\"\n GTS_STORAGE_S3_SECRET_KEY = \"#api-tokens\"\n GTS_STORAGE_S3_PROXY = \"true\"\n # 添加时区为UTC+8\n TZ = \"Asia/Chongqing\"\n\n[[mounts]]\n source = \"social_data\"\n destination = \"/gotosocial/storage\"\n\n[http_service]\n internal_port = 8080\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 1\n processes = [\"app\"]\n```\n\n以上配置中`GTS_STORAGE_S3_ENDPOINT`不需要带`https:`和最后的`/BUCKET名称`\n\n## 部署\n\n```\nflyctl deploy\n```\n\n启动成功后会显示一个URL,能成功访问则代表部署成功。\n\n## 创建用户和管理员\n\n在 `fly.toml `文件目录执行\n\n```\nflyctl ssh console\n```\n\n- 创建用户\n\n```\n/gotosocial/gotosocial admin account create --username YOUR_USERNAME --email YOUR@EMAIL.COM --password 'SOME_VERY_GOOD_PASSWD'\n```\n\n`YOUR_USERNAME`为用户名\n`YOUR@EMAIL.COM`为邮箱\n`SOME_VERY_GOOD_PASSWD`为密码,需设置足够复杂,太简单会提示密码不够安全,需重新设置\n\n- 设置管理员\n\n```\n/gotosocial/gotosocial admin account promote --username YOUR_USERNAME\n```\n\n## 演示\n\nhttps://m.ima.cm\n\nhttps://m.ima.cm/@jkjoy\n\n## 下载数据库\n在 `fly.toml `文件目录执行\n```\nflyctl sftp get /gotosocial/storage/sqlite.db\n```\n","source":"_posts/在fly.io部署Gotosocial.md","raw":"---\ntitle: 在fly.io部署Gotosocial\ncategories:\n - 分享\ntags: \n - Gotosocial\n - fly.io\n - 部署\nabbrlink: 9597b72\ndate: 2023-08-17 18:55:46\n\n---\n\n## 关于Gotosocial\n\nGoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。\n\n## 准备\n\n- 注册 Fly.io 账号,并绑卡(避免滥用);\n- 注册 Cloudflare 并启用 R2,启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。\n\n## 安装 flyctl\n\n- Linux\n\n```\ncurl -L https://fly.io/install.sh | sh\n```\n\n- macOS\n\n```\ncurl -L https://fly.io/install.sh | sh\n```\n\n- Windows,需要开启 RemoteSigned: 管理员运行\n\n```\n Set-ExecutionPolicy -ExecutionPolicy RemoteSigned\n```\n\n```\npowershell -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n\n## 登录\n\n```\nflyctl auth login\n\n# 若登录失败使用\n# flyctl auth login -i \n# 输入账号密码进行登录\n```\n\n## 创建APP\n\n`YOURAPPNAME`更改为自己希望设置的名称\n\n```\nflyctl launch --name YOURAPPNAME --image=superseriousbusiness/gotosocial:latest --region hkg --no-deploy\n```\n\n## 创建储存卷\n\n```\nflyctl volumes create social_data --region hkg --size 1\n```\n\n## 编辑配置\n\n编辑根目录下的 `fly.toml` 配置文件,参考下方\n\n```\napp = \"gotos\" ## 自定义名称\nprimary_region = \"hkg\" ##服务器节点,当前为香港\n\n[experimental]\n vm = true\n\n[build]\n image = \"superseriousbusiness/gotosocial:latest\"\n\n[env]\n GTS_DB_ADDRESS = \"/gotosocial/storage/sqlite.db\"\n GTS_DB_TLS_MODE = \"enable\"\n GTS_DB_TYPE = \"sqlite\"\n GTS_HOST = \"GTS的域名\"\n GTS_LETSENCRYPT_ENABLED = \"false\"\n GTS_STORAGE_BACKEND = \"s3\"\n GTS_STORAGE_S3_BUCKET = \"BUCKET名称\"\n GTS_STORAGE_S3_ENDPOINT = \"#S3 API\"\n GTS_STORAGE_S3_ACCESS_KEY = \"#api-tokens\"\n GTS_STORAGE_S3_SECRET_KEY = \"#api-tokens\"\n GTS_STORAGE_S3_PROXY = \"true\"\n # 添加时区为UTC+8\n TZ = \"Asia/Chongqing\"\n\n[[mounts]]\n source = \"social_data\"\n destination = \"/gotosocial/storage\"\n\n[http_service]\n internal_port = 8080\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 1\n processes = [\"app\"]\n```\n\n以上配置中`GTS_STORAGE_S3_ENDPOINT`不需要带`https:`和最后的`/BUCKET名称`\n\n## 部署\n\n```\nflyctl deploy\n```\n\n启动成功后会显示一个URL,能成功访问则代表部署成功。\n\n## 创建用户和管理员\n\n在 `fly.toml `文件目录执行\n\n```\nflyctl ssh console\n```\n\n- 创建用户\n\n```\n/gotosocial/gotosocial admin account create --username YOUR_USERNAME --email YOUR@EMAIL.COM --password 'SOME_VERY_GOOD_PASSWD'\n```\n\n`YOUR_USERNAME`为用户名\n`YOUR@EMAIL.COM`为邮箱\n`SOME_VERY_GOOD_PASSWD`为密码,需设置足够复杂,太简单会提示密码不够安全,需重新设置\n\n- 设置管理员\n\n```\n/gotosocial/gotosocial admin account promote --username YOUR_USERNAME\n```\n\n## 演示\n\nhttps://m.ima.cm\n\nhttps://m.ima.cm/@jkjoy\n\n## 下载数据库\n在 `fly.toml `文件目录执行\n```\nflyctl sftp get /gotosocial/storage/sqlite.db\n```\n","slug":"在fly.io部署Gotosocial","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyh600eaoko02f4m5jpj","comments":1,"layout":"post","photos":[],"link":"","content":"

关于Gotosocial

GoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。

\n

准备

    \n
  • 注册 Fly.io 账号,并绑卡(避免滥用);
  • \n
  • 注册 Cloudflare 并启用 R2,启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。
  • \n
\n

安装 flyctl

    \n
  • Linux
  • \n
\n
1
curl -L https://fly.io/install.sh | sh
\n\n
    \n
  • macOS
  • \n
\n
1
curl -L https://fly.io/install.sh | sh
\n\n
    \n
  • Windows,需要开启 RemoteSigned: 管理员运行
  • \n
\n
1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
\n\n
1
powershell -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n\n

登录

1
2
3
4
5
flyctl auth login

# 若登录失败使用
# flyctl auth login -i
# 输入账号密码进行登录
\n\n

创建APP

YOURAPPNAME更改为自己希望设置的名称

\n
1
flyctl launch --name YOURAPPNAME --image=superseriousbusiness/gotosocial:latest --region hkg --no-deploy
\n\n

创建储存卷

1
flyctl volumes create social_data --region hkg --size 1
\n\n

编辑配置

编辑根目录下的 fly.toml 配置文件,参考下方

\n
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
app = "gotos" ## 自定义名称
primary_region = "hkg" ##服务器节点,当前为香港

[experimental]
vm = true

[build]
image = "superseriousbusiness/gotosocial:latest"

[env]
GTS_DB_ADDRESS = "/gotosocial/storage/sqlite.db"
GTS_DB_TLS_MODE = "enable"
GTS_DB_TYPE = "sqlite"
GTS_HOST = "GTS的域名"
GTS_LETSENCRYPT_ENABLED = "false"
GTS_STORAGE_BACKEND = "s3"
GTS_STORAGE_S3_BUCKET = "BUCKET名称"
GTS_STORAGE_S3_ENDPOINT = "#S3 API"
GTS_STORAGE_S3_ACCESS_KEY = "#api-tokens"
GTS_STORAGE_S3_SECRET_KEY = "#api-tokens"
GTS_STORAGE_S3_PROXY = "true"
# 添加时区为UTC+8
TZ = "Asia/Chongqing"

[[mounts]]
source = "social_data"
destination = "/gotosocial/storage"

[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 1
processes = ["app"]
\n\n

以上配置中GTS_STORAGE_S3_ENDPOINT不需要带https:和最后的/BUCKET名称

\n

部署

1
flyctl deploy
\n\n

启动成功后会显示一个URL,能成功访问则代表部署成功。

\n

创建用户和管理员

fly.toml 文件目录执行

\n
1
flyctl ssh console
\n\n
    \n
  • 创建用户
  • \n
\n
1
/gotosocial/gotosocial admin account create --username YOUR_USERNAME --email YOUR@EMAIL.COM --password 'SOME_VERY_GOOD_PASSWD'
\n\n

YOUR_USERNAME为用户名
YOUR@EMAIL.COM为邮箱
SOME_VERY_GOOD_PASSWD为密码,需设置足够复杂,太简单会提示密码不够安全,需重新设置

\n
    \n
  • 设置管理员
  • \n
\n
1
/gotosocial/gotosocial admin account promote --username YOUR_USERNAME
\n\n

演示

https://m.ima.cm

\n

https://m.ima.cm/@jkjoy

\n

下载数据库

fly.toml 文件目录执行

\n
1
flyctl sftp get /gotosocial/storage/sqlite.db
\n","site":{"data":{}},"excerpt":"","more":"

关于Gotosocial

GoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。

\n

准备

    \n
  • 注册 Fly.io 账号,并绑卡(避免滥用);
  • \n
  • 注册 Cloudflare 并启用 R2,启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。
  • \n
\n

安装 flyctl

    \n
  • Linux
  • \n
\n
1
curl -L https://fly.io/install.sh | sh
\n\n
    \n
  • macOS
  • \n
\n
1
curl -L https://fly.io/install.sh | sh
\n\n
    \n
  • Windows,需要开启 RemoteSigned: 管理员运行
  • \n
\n
1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
\n\n
1
powershell -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n\n

登录

1
2
3
4
5
flyctl auth login

# 若登录失败使用
# flyctl auth login -i
# 输入账号密码进行登录
\n\n

创建APP

YOURAPPNAME更改为自己希望设置的名称

\n
1
flyctl launch --name YOURAPPNAME --image=superseriousbusiness/gotosocial:latest --region hkg --no-deploy
\n\n

创建储存卷

1
flyctl volumes create social_data --region hkg --size 1
\n\n

编辑配置

编辑根目录下的 fly.toml 配置文件,参考下方

\n
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
app = "gotos" ## 自定义名称
primary_region = "hkg" ##服务器节点,当前为香港

[experimental]
vm = true

[build]
image = "superseriousbusiness/gotosocial:latest"

[env]
GTS_DB_ADDRESS = "/gotosocial/storage/sqlite.db"
GTS_DB_TLS_MODE = "enable"
GTS_DB_TYPE = "sqlite"
GTS_HOST = "GTS的域名"
GTS_LETSENCRYPT_ENABLED = "false"
GTS_STORAGE_BACKEND = "s3"
GTS_STORAGE_S3_BUCKET = "BUCKET名称"
GTS_STORAGE_S3_ENDPOINT = "#S3 API"
GTS_STORAGE_S3_ACCESS_KEY = "#api-tokens"
GTS_STORAGE_S3_SECRET_KEY = "#api-tokens"
GTS_STORAGE_S3_PROXY = "true"
# 添加时区为UTC+8
TZ = "Asia/Chongqing"

[[mounts]]
source = "social_data"
destination = "/gotosocial/storage"

[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 1
processes = ["app"]
\n\n

以上配置中GTS_STORAGE_S3_ENDPOINT不需要带https:和最后的/BUCKET名称

\n

部署

1
flyctl deploy
\n\n

启动成功后会显示一个URL,能成功访问则代表部署成功。

\n

创建用户和管理员

fly.toml 文件目录执行

\n
1
flyctl ssh console
\n\n
    \n
  • 创建用户
  • \n
\n
1
/gotosocial/gotosocial admin account create --username YOUR_USERNAME --email YOUR@EMAIL.COM --password 'SOME_VERY_GOOD_PASSWD'
\n\n

YOUR_USERNAME为用户名
YOUR@EMAIL.COM为邮箱
SOME_VERY_GOOD_PASSWD为密码,需设置足够复杂,太简单会提示密码不够安全,需重新设置

\n
    \n
  • 设置管理员
  • \n
\n
1
/gotosocial/gotosocial admin account promote --username YOUR_USERNAME
\n\n

演示

https://m.ima.cm

\n

https://m.ima.cm/@jkjoy

\n

下载数据库

fly.toml 文件目录执行

\n
1
flyctl sftp get /gotosocial/storage/sqlite.db
\n"},{"title":"女子","excerpt":"","abbrlink":41745,"date":"2018-10-18T04:45:59.000Z","_content":"(文,璟)\n她一直是清淡寡欲的女子。\n\n失去心潮起伏的力息。\n\n对周遭事物不免疏离傲慢。\n\n难得的释放天真,也无人知晓。她兀自盛放,凋零。\n\n即便得到,也觉乏味至极。\n\n怨念丛生,无以缺口喷薄,便是一再缄默。\n\n在阴暗低湿的房间,导演一出独幕剧,乐此不疲。\n\n她低吟浅唱,谁也不曾听到。\n\n她患得患失,历尽繁华开落。\n\n时常暗自流泪,无声无息,大滴大滴的没入手心。\n \n且不愿与任何人分享这稀薄波动。\n \n曾对死亡惊惧,莫明颤抖,如今也不能从容应对。 \n \n \n念他时,情绪一触即发,失去理智,抽离表情。\n\n喜于自言自语,编撰各种情节哄骗自己。\n\n也是甘心承受,默然相随,换来连绵起伏的生之牵连。\n\n她如此明了这归属,却无处安身。\n\n亦知这追逐,皆是捕风,亦是虚空。 \n\n连夜的梦魇,白昼的欢颜,原是千般累积的记忆。\n\n她深挚情愿,沿途歌声嘹亮。\n\n她看着身边一个个流离的路人,愈是奔弃,愈是离奇。\n\n各自走向了哪里,最后停留在哪里,她默许任何人的离去。\n\n因知道,末途太拥挤,只容得自己。 \n\n对待缺失的记忆,是徘徊于认领与遗失的边界。\n\n白白流失力气。\n\n本来一切就好似透明。\n\n她于是,走失。 \n\n她目睹这场光的损落与重生,渐次麻木迟钝。 \n\n某个瞬间,或许一侧身。便已落泪。","source":"_posts/女子.md","raw":"---\ntitle: 女子\ntags:\n - 女子\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 41745\ndate: 2018-10-18 12:45:59\n---\n(文,璟)\n她一直是清淡寡欲的女子。\n\n失去心潮起伏的力息。\n\n对周遭事物不免疏离傲慢。\n\n难得的释放天真,也无人知晓。她兀自盛放,凋零。\n\n即便得到,也觉乏味至极。\n\n怨念丛生,无以缺口喷薄,便是一再缄默。\n\n在阴暗低湿的房间,导演一出独幕剧,乐此不疲。\n\n她低吟浅唱,谁也不曾听到。\n\n她患得患失,历尽繁华开落。\n\n时常暗自流泪,无声无息,大滴大滴的没入手心。\n \n且不愿与任何人分享这稀薄波动。\n \n曾对死亡惊惧,莫明颤抖,如今也不能从容应对。 \n \n \n念他时,情绪一触即发,失去理智,抽离表情。\n\n喜于自言自语,编撰各种情节哄骗自己。\n\n也是甘心承受,默然相随,换来连绵起伏的生之牵连。\n\n她如此明了这归属,却无处安身。\n\n亦知这追逐,皆是捕风,亦是虚空。 \n\n连夜的梦魇,白昼的欢颜,原是千般累积的记忆。\n\n她深挚情愿,沿途歌声嘹亮。\n\n她看着身边一个个流离的路人,愈是奔弃,愈是离奇。\n\n各自走向了哪里,最后停留在哪里,她默许任何人的离去。\n\n因知道,末途太拥挤,只容得自己。 \n\n对待缺失的记忆,是徘徊于认领与遗失的边界。\n\n白白流失力气。\n\n本来一切就好似透明。\n\n她于是,走失。 \n\n她目睹这场光的损落与重生,渐次麻木迟钝。 \n\n某个瞬间,或许一侧身。便已落泪。","slug":"女子","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyh700eeoko0c2cc6kbe","comments":1,"layout":"post","photos":[],"link":"","content":"

(文,璟)
她一直是清淡寡欲的女子。

\n

失去心潮起伏的力息。

\n

对周遭事物不免疏离傲慢。

\n

难得的释放天真,也无人知晓。她兀自盛放,凋零。

\n

即便得到,也觉乏味至极。

\n

怨念丛生,无以缺口喷薄,便是一再缄默。

\n

在阴暗低湿的房间,导演一出独幕剧,乐此不疲。

\n

她低吟浅唱,谁也不曾听到。

\n

她患得患失,历尽繁华开落。

\n

时常暗自流泪,无声无息,大滴大滴的没入手心。

\n

且不愿与任何人分享这稀薄波动。

\n

曾对死亡惊惧,莫明颤抖,如今也不能从容应对。

\n

念他时,情绪一触即发,失去理智,抽离表情。

\n

喜于自言自语,编撰各种情节哄骗自己。

\n

也是甘心承受,默然相随,换来连绵起伏的生之牵连。

\n

她如此明了这归属,却无处安身。

\n

亦知这追逐,皆是捕风,亦是虚空。

\n

连夜的梦魇,白昼的欢颜,原是千般累积的记忆。

\n

她深挚情愿,沿途歌声嘹亮。

\n

她看着身边一个个流离的路人,愈是奔弃,愈是离奇。

\n

各自走向了哪里,最后停留在哪里,她默许任何人的离去。

\n

因知道,末途太拥挤,只容得自己。

\n

对待缺失的记忆,是徘徊于认领与遗失的边界。

\n

白白流失力气。

\n

本来一切就好似透明。

\n

她于是,走失。

\n

她目睹这场光的损落与重生,渐次麻木迟钝。

\n

某个瞬间,或许一侧身。便已落泪。

\n","site":{"data":{}},"more":"

(文,璟)
她一直是清淡寡欲的女子。

\n

失去心潮起伏的力息。

\n

对周遭事物不免疏离傲慢。

\n

难得的释放天真,也无人知晓。她兀自盛放,凋零。

\n

即便得到,也觉乏味至极。

\n

怨念丛生,无以缺口喷薄,便是一再缄默。

\n

在阴暗低湿的房间,导演一出独幕剧,乐此不疲。

\n

她低吟浅唱,谁也不曾听到。

\n

她患得患失,历尽繁华开落。

\n

时常暗自流泪,无声无息,大滴大滴的没入手心。

\n

且不愿与任何人分享这稀薄波动。

\n

曾对死亡惊惧,莫明颤抖,如今也不能从容应对。

\n

念他时,情绪一触即发,失去理智,抽离表情。

\n

喜于自言自语,编撰各种情节哄骗自己。

\n

也是甘心承受,默然相随,换来连绵起伏的生之牵连。

\n

她如此明了这归属,却无处安身。

\n

亦知这追逐,皆是捕风,亦是虚空。

\n

连夜的梦魇,白昼的欢颜,原是千般累积的记忆。

\n

她深挚情愿,沿途歌声嘹亮。

\n

她看着身边一个个流离的路人,愈是奔弃,愈是离奇。

\n

各自走向了哪里,最后停留在哪里,她默许任何人的离去。

\n

因知道,末途太拥挤,只容得自己。

\n

对待缺失的记忆,是徘徊于认领与遗失的边界。

\n

白白流失力气。

\n

本来一切就好似透明。

\n

她于是,走失。

\n

她目睹这场光的损落与重生,渐次麻木迟钝。

\n

某个瞬间,或许一侧身。便已落泪。

\n"},{"title":"如何在Fly.io部署typecho","abbrlink":"8084c141","date":"2023-09-05T16:00:00.000Z","cover":null,"_content":" \n## 使用项目\nhttps://github.com/ttys3/typecho-docker\n## 准备工作\n\n- 注册FLY.IO \n用以部署typecho\n\n## 安装flyctl\nInstall flyctl \n以WINDOWS为例\n```\npwsh -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n其他系统请参照官方\n## 新建APP\n初始化\n```\nflyctl launch\n```\n按照提示选择会生成一个FLY.TOML文件\n\n## 编辑FLY.TOML\n添加以下\n```\n# fly.toml app configuration file generated for gotos on 2023-08-12T19:36:14+08:00\n#\n# See https://fly.io/docs/reference/configuration/ for information about how to use this file.\n#\n\napp = \"typecho\"\nprimary_region = \"hkg\"\n\n[experimental]\n vm = true\n\n[build]\n image = \"80x86/typecho:latest\"\n\n[env]\n PHP_MAX_EXECUTION_TIME = 600\n PHP_TZ = \"Asia/Shanghai\"\n \n[[mounts]]\n source = \"typecho_data\"\n destination = \"/data\"\n\n[http_service]\n internal_port = 80\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 1\n processes = [\"app\"]\n```\n## 添加持久卷\n```\nflyctl volumes create typecho_data --region hkg --size 1\n```\n## 部署\n```\nflyctl deploy\n```\n## 演示地址\n\nhttps://avnvu.fly.dev/\n\n","source":"_posts/如何快速在fly.io上部署typecho.md","raw":"---\ntitle: 如何在Fly.io部署typecho\ntags: typecho\ncategories: 分享\nabbrlink: 8084c141\ndate: 2023-09-06 00:00:00\ncover:\n---\n \n## 使用项目\nhttps://github.com/ttys3/typecho-docker\n## 准备工作\n\n- 注册FLY.IO \n用以部署typecho\n\n## 安装flyctl\nInstall flyctl \n以WINDOWS为例\n```\npwsh -Command \"iwr https://fly.io/install.ps1 -useb | iex\"\n```\n其他系统请参照官方\n## 新建APP\n初始化\n```\nflyctl launch\n```\n按照提示选择会生成一个FLY.TOML文件\n\n## 编辑FLY.TOML\n添加以下\n```\n# fly.toml app configuration file generated for gotos on 2023-08-12T19:36:14+08:00\n#\n# See https://fly.io/docs/reference/configuration/ for information about how to use this file.\n#\n\napp = \"typecho\"\nprimary_region = \"hkg\"\n\n[experimental]\n vm = true\n\n[build]\n image = \"80x86/typecho:latest\"\n\n[env]\n PHP_MAX_EXECUTION_TIME = 600\n PHP_TZ = \"Asia/Shanghai\"\n \n[[mounts]]\n source = \"typecho_data\"\n destination = \"/data\"\n\n[http_service]\n internal_port = 80\n force_https = true\n auto_stop_machines = false\n auto_start_machines = true\n min_machines_running = 1\n processes = [\"app\"]\n```\n## 添加持久卷\n```\nflyctl volumes create typecho_data --region hkg --size 1\n```\n## 部署\n```\nflyctl deploy\n```\n## 演示地址\n\nhttps://avnvu.fly.dev/\n\n","slug":"如何快速在fly.io上部署typecho","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyh800ehoko043fs54g2","comments":1,"layout":"post","photos":[],"link":"","content":"

使用项目

https://github.com/ttys3/typecho-docker

\n

准备工作

    \n
  • 注册FLY.IO
    用以部署typecho
  • \n
\n

安装flyctl

Install flyctl
以WINDOWS为例

\n
1
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n

其他系统请参照官方

\n

新建APP

初始化

\n
1
flyctl launch
\n

按照提示选择会生成一个FLY.TOML文件

\n

编辑FLY.TOML

添加以下

\n
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
# fly.toml app configuration file generated for gotos on 2023-08-12T19:36:14+08:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#

app = "typecho"
primary_region = "hkg"

[experimental]
vm = true

[build]
image = "80x86/typecho:latest"

[env]
PHP_MAX_EXECUTION_TIME = 600
PHP_TZ = "Asia/Shanghai"

[[mounts]]
source = "typecho_data"
destination = "/data"

[http_service]
internal_port = 80
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 1
processes = ["app"]
\n

添加持久卷

1
flyctl volumes create typecho_data --region hkg --size 1
\n

部署

1
flyctl deploy
\n

演示地址

https://avnvu.fly.dev/

\n","site":{"data":{}},"excerpt":"","more":"

使用项目

https://github.com/ttys3/typecho-docker

\n

准备工作

    \n
  • 注册FLY.IO
    用以部署typecho
  • \n
\n

安装flyctl

Install flyctl
以WINDOWS为例

\n
1
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
\n

其他系统请参照官方

\n

新建APP

初始化

\n
1
flyctl launch
\n

按照提示选择会生成一个FLY.TOML文件

\n

编辑FLY.TOML

添加以下

\n
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
# fly.toml app configuration file generated for gotos on 2023-08-12T19:36:14+08:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#

app = "typecho"
primary_region = "hkg"

[experimental]
vm = true

[build]
image = "80x86/typecho:latest"

[env]
PHP_MAX_EXECUTION_TIME = 600
PHP_TZ = "Asia/Shanghai"

[[mounts]]
source = "typecho_data"
destination = "/data"

[http_service]
internal_port = 80
force_https = true
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 1
processes = ["app"]
\n

添加持久卷

1
flyctl volumes create typecho_data --region hkg --size 1
\n

部署

1
flyctl deploy
\n

演示地址

https://avnvu.fly.dev/

\n"},{"title":"平安夜","excerpt":"","abbrlink":44545,"date":"2011-12-24T13:33:51.000Z","_content":"\n平安夜、 接近2011的尾声,明日加班。","source":"_posts/平安夜.md","raw":"---\ntitle: 平安夜\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 44545\ndate: 2011-12-24 21:33:51\n---\n\n平安夜、 接近2011的尾声,明日加班。","slug":"平安夜","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyh900ekoko03fm38moi","comments":1,"layout":"post","photos":[],"link":"","content":"

平安夜、 接近2011的尾声,明日加班。

\n","site":{"data":{}},"more":"

平安夜、 接近2011的尾声,明日加班。

\n"},{"title":"得之我幸失之我命","excerpt":"","abbrlink":31751,"date":"2017-12-27T02:51:24.000Z","_content":"\n前些时候在相亲微博上认识了一个湖北的妹子。 \n\n人很漂亮,是我喜欢的类型。 \n\n可我总是感觉自己没有太大的动力去追求这个女孩子。 \n\n我自己把原因归咎于自我认知良好。 \n\n换而言之,不够自信。 \n\n实在是觉得自己不够优秀。 \n\n可又很喜欢这个女孩子。 \n\n每天在微信上聊两句。 \n\n总是感觉自己不应该这样。 \n\n有点无所适从。 \n\n我看过很多心灵鸡汤。 \n\n有说如果爱她就给她自由。 \n\n或者祝她幸福此类的。 \n\n我觉得这都是屁话。 \n\n爱是矛盾的。 \n\n有占有,也有奉献。 \n\n两情相悦这种事情是随缘的。 \n\n一见钟情是看脸的。 \n\n说到底我还是为自己不够主动追求女孩子找了个理由。","source":"_posts/得之我幸失之我命.md","raw":"---\ntitle: 得之我幸失之我命\ntags:\n - 爱情\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 31751\ndate: 2017-12-27 10:51:24\n---\n\n前些时候在相亲微博上认识了一个湖北的妹子。 \n\n人很漂亮,是我喜欢的类型。 \n\n可我总是感觉自己没有太大的动力去追求这个女孩子。 \n\n我自己把原因归咎于自我认知良好。 \n\n换而言之,不够自信。 \n\n实在是觉得自己不够优秀。 \n\n可又很喜欢这个女孩子。 \n\n每天在微信上聊两句。 \n\n总是感觉自己不应该这样。 \n\n有点无所适从。 \n\n我看过很多心灵鸡汤。 \n\n有说如果爱她就给她自由。 \n\n或者祝她幸福此类的。 \n\n我觉得这都是屁话。 \n\n爱是矛盾的。 \n\n有占有,也有奉献。 \n\n两情相悦这种事情是随缘的。 \n\n一见钟情是看脸的。 \n\n说到底我还是为自己不够主动追求女孩子找了个理由。","slug":"得之我幸失之我命","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyha00enoko04qe92oak","comments":1,"layout":"post","photos":[],"link":"","content":"

前些时候在相亲微博上认识了一个湖北的妹子。

\n

人很漂亮,是我喜欢的类型。

\n

可我总是感觉自己没有太大的动力去追求这个女孩子。

\n

我自己把原因归咎于自我认知良好。

\n

换而言之,不够自信。

\n

实在是觉得自己不够优秀。

\n

可又很喜欢这个女孩子。

\n

每天在微信上聊两句。

\n

总是感觉自己不应该这样。

\n

有点无所适从。

\n

我看过很多心灵鸡汤。

\n

有说如果爱她就给她自由。

\n

或者祝她幸福此类的。

\n

我觉得这都是屁话。

\n

爱是矛盾的。

\n

有占有,也有奉献。

\n

两情相悦这种事情是随缘的。

\n

一见钟情是看脸的。

\n

说到底我还是为自己不够主动追求女孩子找了个理由。

\n","site":{"data":{}},"more":"

前些时候在相亲微博上认识了一个湖北的妹子。

\n

人很漂亮,是我喜欢的类型。

\n

可我总是感觉自己没有太大的动力去追求这个女孩子。

\n

我自己把原因归咎于自我认知良好。

\n

换而言之,不够自信。

\n

实在是觉得自己不够优秀。

\n

可又很喜欢这个女孩子。

\n

每天在微信上聊两句。

\n

总是感觉自己不应该这样。

\n

有点无所适从。

\n

我看过很多心灵鸡汤。

\n

有说如果爱她就给她自由。

\n

或者祝她幸福此类的。

\n

我觉得这都是屁话。

\n

爱是矛盾的。

\n

有占有,也有奉献。

\n

两情相悦这种事情是随缘的。

\n

一见钟情是看脸的。

\n

说到底我还是为自己不够主动追求女孩子找了个理由。

\n"},{"title":"拳头","excerpt":"","abbrlink":56831,"date":"2016-11-12T03:58:08.000Z","_content":"\n拳头才是真理 \n所有的知识都是拳头教会我们的 \n譬如知法守礼 \n譬如如何做一个谦谦君子 \n当你说君子动口不动手时 \n内心是拒绝的 \n只是因为自己没有更强大的拳头 \n所有的规则都是拳头制定的 \n要么使用自己的拳头反抗 \n要么屈服于别人的拳头 \n所以我认为拳头说的是对的 \n拳头是真理","source":"_posts/拳头.md","raw":"---\ntitle: 拳头\ntags:\n - 拳头\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 56831\ndate: 2016-11-12 11:58:08\n---\n\n拳头才是真理 \n所有的知识都是拳头教会我们的 \n譬如知法守礼 \n譬如如何做一个谦谦君子 \n当你说君子动口不动手时 \n内心是拒绝的 \n只是因为自己没有更强大的拳头 \n所有的规则都是拳头制定的 \n要么使用自己的拳头反抗 \n要么屈服于别人的拳头 \n所以我认为拳头说的是对的 \n拳头是真理","slug":"拳头","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyhb00eroko0f4qacnho","comments":1,"layout":"post","photos":[],"link":"","content":"

拳头才是真理
所有的知识都是拳头教会我们的
譬如知法守礼
譬如如何做一个谦谦君子
当你说君子动口不动手时
内心是拒绝的
只是因为自己没有更强大的拳头
所有的规则都是拳头制定的
要么使用自己的拳头反抗
要么屈服于别人的拳头
所以我认为拳头说的是对的
拳头是真理

\n","site":{"data":{}},"more":"

拳头才是真理
所有的知识都是拳头教会我们的
譬如知法守礼
譬如如何做一个谦谦君子
当你说君子动口不动手时
内心是拒绝的
只是因为自己没有更强大的拳头
所有的规则都是拳头制定的
要么使用自己的拳头反抗
要么屈服于别人的拳头
所以我认为拳头说的是对的
拳头是真理

\n"},{"title":"我们是如何变得平庸","excerpt":"","abbrlink":"953b5667","date":"2016-11-30T04:52:05.000Z","_content":"\n**我们为何渐渐平庸** \n\n我并不清楚别人是如何走向平庸,我只能说说自己。 \n\n我觉得自己就是个平庸的人。\n\n高不成也低不就。\n\n始终厮混在社会的底层。 \n\n我用“混”来形容现在的生活,就是因为自己得过且过的心态。\n\n我曾读过很多心灵鸡汤,也从书中看过很多历史事迹,从媒体上了解过很多成功人士的成功历程。 \n\n而我发现自己不能功成名就只能默默无闻,只是因为自己缺乏毅力,遇事怯懦,而且对现实无能为力,缺少创想。 \n\n我一直都是在走一条大道,大多数人选择亦或者被迫走的路。 \n\n那一少部分人走的小路以及捷径我是没办法见识到。\n\n这跟生长的环境有关。无法改变。\n\n虽然我不相信王侯将相宁有种,可现实如此。 \n\n我觉得向现实低头这是一种很悲观的心态。\n\n也可以理解为这是我为自己寻找的借口。 \n\n我正是这样每天为自己的犯错甚至懒惰找各种借口所以自己才变得越来越平庸。 \n\n谁人不想活得精彩。\n\n成功的人只不过是少数。 \n\n大多数人只是想活着而已。 \n\n嗯,这不过是我的借口罢了。","source":"_posts/我们是如何变得平庸.md","raw":"---\ntitle: 我们是如何变得平庸\ntags:\n - 平庸\n - 我\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 953b5667\ndate: 2016-11-30 12:52:05\n---\n\n**我们为何渐渐平庸** \n\n我并不清楚别人是如何走向平庸,我只能说说自己。 \n\n我觉得自己就是个平庸的人。\n\n高不成也低不就。\n\n始终厮混在社会的底层。 \n\n我用“混”来形容现在的生活,就是因为自己得过且过的心态。\n\n我曾读过很多心灵鸡汤,也从书中看过很多历史事迹,从媒体上了解过很多成功人士的成功历程。 \n\n而我发现自己不能功成名就只能默默无闻,只是因为自己缺乏毅力,遇事怯懦,而且对现实无能为力,缺少创想。 \n\n我一直都是在走一条大道,大多数人选择亦或者被迫走的路。 \n\n那一少部分人走的小路以及捷径我是没办法见识到。\n\n这跟生长的环境有关。无法改变。\n\n虽然我不相信王侯将相宁有种,可现实如此。 \n\n我觉得向现实低头这是一种很悲观的心态。\n\n也可以理解为这是我为自己寻找的借口。 \n\n我正是这样每天为自己的犯错甚至懒惰找各种借口所以自己才变得越来越平庸。 \n\n谁人不想活得精彩。\n\n成功的人只不过是少数。 \n\n大多数人只是想活着而已。 \n\n嗯,这不过是我的借口罢了。","slug":"我们是如何变得平庸","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyhb00euoko0fwkeeu7o","comments":1,"layout":"post","photos":[],"link":"","content":"

我们为何渐渐平庸

\n

我并不清楚别人是如何走向平庸,我只能说说自己。

\n

我觉得自己就是个平庸的人。

\n

高不成也低不就。

\n

始终厮混在社会的底层。

\n

我用“混”来形容现在的生活,就是因为自己得过且过的心态。

\n

我曾读过很多心灵鸡汤,也从书中看过很多历史事迹,从媒体上了解过很多成功人士的成功历程。

\n

而我发现自己不能功成名就只能默默无闻,只是因为自己缺乏毅力,遇事怯懦,而且对现实无能为力,缺少创想。

\n

我一直都是在走一条大道,大多数人选择亦或者被迫走的路。

\n

那一少部分人走的小路以及捷径我是没办法见识到。

\n

这跟生长的环境有关。无法改变。

\n

虽然我不相信王侯将相宁有种,可现实如此。

\n

我觉得向现实低头这是一种很悲观的心态。

\n

也可以理解为这是我为自己寻找的借口。

\n

我正是这样每天为自己的犯错甚至懒惰找各种借口所以自己才变得越来越平庸。

\n

谁人不想活得精彩。

\n

成功的人只不过是少数。

\n

大多数人只是想活着而已。

\n

嗯,这不过是我的借口罢了。

\n","site":{"data":{}},"more":"

我们为何渐渐平庸

\n

我并不清楚别人是如何走向平庸,我只能说说自己。

\n

我觉得自己就是个平庸的人。

\n

高不成也低不就。

\n

始终厮混在社会的底层。

\n

我用“混”来形容现在的生活,就是因为自己得过且过的心态。

\n

我曾读过很多心灵鸡汤,也从书中看过很多历史事迹,从媒体上了解过很多成功人士的成功历程。

\n

而我发现自己不能功成名就只能默默无闻,只是因为自己缺乏毅力,遇事怯懦,而且对现实无能为力,缺少创想。

\n

我一直都是在走一条大道,大多数人选择亦或者被迫走的路。

\n

那一少部分人走的小路以及捷径我是没办法见识到。

\n

这跟生长的环境有关。无法改变。

\n

虽然我不相信王侯将相宁有种,可现实如此。

\n

我觉得向现实低头这是一种很悲观的心态。

\n

也可以理解为这是我为自己寻找的借口。

\n

我正是这样每天为自己的犯错甚至懒惰找各种借口所以自己才变得越来越平庸。

\n

谁人不想活得精彩。

\n

成功的人只不过是少数。

\n

大多数人只是想活着而已。

\n

嗯,这不过是我的借口罢了。

\n"},{"title":"我的梦想","excerpt":"","abbrlink":"ee2b2a8c","date":"2011-09-05T11:38:13.000Z","_content":"\n我有一个很大的梦想,就是每天都可以睡觉睡到自然醒。 \n\n我有一个小小的幸福,就是每天都可以和我心爱的人一起生活。 \n\n没有烦恼没有争吵。 \n\n我有一个很大的愿望,就是每天都可以听到你们的笑声。 \n\n我有一个小小的心愿,就是每天都可以和我亲爱的人一起生活。 \n\n没有隔阂没有纷扰。 \n\n孟子说,鱼与熊掌不可兼得。 \n\n于是我的梦想无法实现,幸福无法掌握,愿望彻底落空,心愿没有念想。 \n\n我多希望自己可以做到完美。 \n\n有钱有势有车有房。 \n\n我想没有人不希望这样。\n\n这得付出多大的努力才可以? \n\n这得付出多少努力才可以从我这样的情况进化成那样完美的形态? \n\n估计就跟猴子变成人一样得需要漫长的几万年吧。 \n\n我不可能夸夸其谈说努力努力。 \n\n我没有那样锐利的锋芒,没有那冲破一切的精神。 \n\n我只能成为《老男孩》中那平凡到渣的无数人中的其中之一。 \n\n如此。而已。","source":"_posts/我的梦想.md","raw":"---\ntitle: 我的梦想\ntags:\n - 平凡\n - 梦想\n - 生活\n - 生活\n - 老男孩\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: ee2b2a8c\ndate: 2011-09-05 19:38:13\n---\n\n我有一个很大的梦想,就是每天都可以睡觉睡到自然醒。 \n\n我有一个小小的幸福,就是每天都可以和我心爱的人一起生活。 \n\n没有烦恼没有争吵。 \n\n我有一个很大的愿望,就是每天都可以听到你们的笑声。 \n\n我有一个小小的心愿,就是每天都可以和我亲爱的人一起生活。 \n\n没有隔阂没有纷扰。 \n\n孟子说,鱼与熊掌不可兼得。 \n\n于是我的梦想无法实现,幸福无法掌握,愿望彻底落空,心愿没有念想。 \n\n我多希望自己可以做到完美。 \n\n有钱有势有车有房。 \n\n我想没有人不希望这样。\n\n这得付出多大的努力才可以? \n\n这得付出多少努力才可以从我这样的情况进化成那样完美的形态? \n\n估计就跟猴子变成人一样得需要漫长的几万年吧。 \n\n我不可能夸夸其谈说努力努力。 \n\n我没有那样锐利的锋芒,没有那冲破一切的精神。 \n\n我只能成为《老男孩》中那平凡到渣的无数人中的其中之一。 \n\n如此。而已。","slug":"我的梦想","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyhc00eyoko0h93khtt7","comments":1,"layout":"post","photos":[],"link":"","content":"

我有一个很大的梦想,就是每天都可以睡觉睡到自然醒。

\n

我有一个小小的幸福,就是每天都可以和我心爱的人一起生活。

\n

没有烦恼没有争吵。

\n

我有一个很大的愿望,就是每天都可以听到你们的笑声。

\n

我有一个小小的心愿,就是每天都可以和我亲爱的人一起生活。

\n

没有隔阂没有纷扰。

\n

孟子说,鱼与熊掌不可兼得。

\n

于是我的梦想无法实现,幸福无法掌握,愿望彻底落空,心愿没有念想。

\n

我多希望自己可以做到完美。

\n

有钱有势有车有房。

\n

我想没有人不希望这样。

\n

这得付出多大的努力才可以?

\n

这得付出多少努力才可以从我这样的情况进化成那样完美的形态?

\n

估计就跟猴子变成人一样得需要漫长的几万年吧。

\n

我不可能夸夸其谈说努力努力。

\n

我没有那样锐利的锋芒,没有那冲破一切的精神。

\n

我只能成为《老男孩》中那平凡到渣的无数人中的其中之一。

\n

如此。而已。

\n","site":{"data":{}},"more":"

我有一个很大的梦想,就是每天都可以睡觉睡到自然醒。

\n

我有一个小小的幸福,就是每天都可以和我心爱的人一起生活。

\n

没有烦恼没有争吵。

\n

我有一个很大的愿望,就是每天都可以听到你们的笑声。

\n

我有一个小小的心愿,就是每天都可以和我亲爱的人一起生活。

\n

没有隔阂没有纷扰。

\n

孟子说,鱼与熊掌不可兼得。

\n

于是我的梦想无法实现,幸福无法掌握,愿望彻底落空,心愿没有念想。

\n

我多希望自己可以做到完美。

\n

有钱有势有车有房。

\n

我想没有人不希望这样。

\n

这得付出多大的努力才可以?

\n

这得付出多少努力才可以从我这样的情况进化成那样完美的形态?

\n

估计就跟猴子变成人一样得需要漫长的几万年吧。

\n

我不可能夸夸其谈说努力努力。

\n

我没有那样锐利的锋芒,没有那冲破一切的精神。

\n

我只能成为《老男孩》中那平凡到渣的无数人中的其中之一。

\n

如此。而已。

\n"},{"title":"搬瓦工VPS桌面监控工具BandwagongVPS_controller","excerpt":"","abbrlink":42100,"date":"2018-07-15T04:25:57.000Z","_content":"\n## 预览\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/org/2018/07/2018070802142057.png)\n\n## 使用\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/org/2018/07/2018070802141179.png) 在搬瓦工VPS 管理后台获得 API 填写即可\n\n## 下载地址\n\n[本地下载](https://down.asbid.cn/Windows/BandwagongVPS_controller.exe \"本地下载\")","source":"_posts/搬瓦工VPS桌面监控工具BandwagongVPS-controller.md","raw":"---\ntitle: 搬瓦工VPS桌面监控工具BandwagongVPS_controller\ntags:\n - VPS\n - VPS\n - 搬瓦工\nexcerpt: ''\ncategories:\n - 分享\nabbrlink: 42100\ndate: 2018-07-15 12:25:57\n---\n\n## 预览\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/org/2018/07/2018070802142057.png)\n\n## 使用\n\n![](https://mrwen.oss-cn-shanghai.aliyuncs.com/org/2018/07/2018070802141179.png) 在搬瓦工VPS 管理后台获得 API 填写即可\n\n## 下载地址\n\n[本地下载](https://down.asbid.cn/Windows/BandwagongVPS_controller.exe \"本地下载\")","slug":"搬瓦工VPS桌面监控工具BandwagongVPS-controller","published":1,"updated":"2023-09-30T02:59:46.521Z","_id":"cln4obyhf00f1oko0051d659o","comments":1,"layout":"post","photos":[],"link":"","content":"

预览

\n

使用

在搬瓦工VPS 管理后台获得 API 填写即可

\n

下载地址

本地下载

\n","site":{"data":{}},"more":"

预览

\n

使用

在搬瓦工VPS 管理后台获得 API 填写即可

\n

下载地址

本地下载

\n"},{"title":"搬瓦工bandwagonhost vps新手使用教程","excerpt":"","abbrlink":7743,"date":"2016-10-28T10:42:44.000Z","_content":"\n## 搬瓦工官网地址无法登陆\n\n目前搬瓦工官网地址无法直接访问,官方给出了镜像地址,请通过镜像地址管理vps。 \n\n官方镜像地址:[http://bwh88.net](http://bwh88.net/aff.php?aff=65816)\n\n## 登入kiwiVM控制面板\n\n买好搬瓦工banwagonhost vps之后,一般会在开通邮件里给出登陆的地址及账号密码,登陆之后会看到如下界面 \n\n点击Services–My Services选项卡,来到如下页面 \n\n点击kiwiVM control panel,进入后台管理界面 \n\n\n## 重装系统\n\n首先在Main Controls 找到 Actions:,并点击stop \n\n然后点击 Install new OS,重装系统,\n这里以debian-6.0-x86为例,选中,点击reload,\n开始重装,很快就会重装好。 \n\n\n## 获取vps远程登录信息\n\n\n这里需要记录vps的ip地址,SSH端口,及系统密码方便我们使用putty远程管理vps。\n 如果不会使用putty,可以参看这篇文章\n [使用putty远程管理vps](https://blog.sunpeiwen.com/linux/shi-yong-putty-yuan-cheng-guan-li-vps-chu-ji/) \n ip地址及SSH端口:在Main Control里可以找到。 \n\n 系统密码: 点击Root Password Modification,系统会生成一串密码,记录下该密码\n\n\n## 更换ip\n\n有时会遇到ip被屏蔽的状况,这是可以考虑换一个ip,换ip的话有两种方法:\n1)向客服提交ticket,让他给你换;\n2)在后台切换。我给大家介绍下怎么自行切换ip。 \n进入到Migrate To another DC,出现如下界面\n\n 值得注意的是它一般有多个机房位置可供切换:亚利桑那(位于西海岸)、洛杉矶(位于西海岸)、弗罗里达、荷兰等。\n 为了达到切换ip的目的,我们可以先切换机房至其他机房,然后再切换回来,这时一般ip就会更换了。\n 切换机房时间很快,而且不会影响到vps里的数据,大可以放心。\n\n 本人使用的就是搬瓦工的VPS\n bbs.xiaoxiao.su","source":"_posts/搬瓦工bandwagonhost-vps新手使用教程.md","raw":"---\ntitle: 搬瓦工bandwagonhost vps新手使用教程\ntags:\n - VPS\n - 搬瓦工\n - 教程\nexcerpt: ''\ncategories:\n - 分享 \nabbrlink: 7743\ndate: 2016-10-28 18:42:44\n---\n\n## 搬瓦工官网地址无法登陆\n\n目前搬瓦工官网地址无法直接访问,官方给出了镜像地址,请通过镜像地址管理vps。 \n\n官方镜像地址:[http://bwh88.net](http://bwh88.net/aff.php?aff=65816)\n\n## 登入kiwiVM控制面板\n\n买好搬瓦工banwagonhost vps之后,一般会在开通邮件里给出登陆的地址及账号密码,登陆之后会看到如下界面 \n\n点击Services–My Services选项卡,来到如下页面 \n\n点击kiwiVM control panel,进入后台管理界面 \n\n\n## 重装系统\n\n首先在Main Controls 找到 Actions:,并点击stop \n\n然后点击 Install new OS,重装系统,\n这里以debian-6.0-x86为例,选中,点击reload,\n开始重装,很快就会重装好。 \n\n\n## 获取vps远程登录信息\n\n\n这里需要记录vps的ip地址,SSH端口,及系统密码方便我们使用putty远程管理vps。\n 如果不会使用putty,可以参看这篇文章\n [使用putty远程管理vps](https://blog.sunpeiwen.com/linux/shi-yong-putty-yuan-cheng-guan-li-vps-chu-ji/) \n ip地址及SSH端口:在Main Control里可以找到。 \n\n 系统密码: 点击Root Password Modification,系统会生成一串密码,记录下该密码\n\n\n## 更换ip\n\n有时会遇到ip被屏蔽的状况,这是可以考虑换一个ip,换ip的话有两种方法:\n1)向客服提交ticket,让他给你换;\n2)在后台切换。我给大家介绍下怎么自行切换ip。 \n进入到Migrate To another DC,出现如下界面\n\n 值得注意的是它一般有多个机房位置可供切换:亚利桑那(位于西海岸)、洛杉矶(位于西海岸)、弗罗里达、荷兰等。\n 为了达到切换ip的目的,我们可以先切换机房至其他机房,然后再切换回来,这时一般ip就会更换了。\n 切换机房时间很快,而且不会影响到vps里的数据,大可以放心。\n\n 本人使用的就是搬瓦工的VPS\n bbs.xiaoxiao.su","slug":"搬瓦工bandwagonhost-vps新手使用教程","published":1,"updated":"2023-09-30T02:59:46.522Z","_id":"cln4obyhg00f4oko0c91sbrhj","comments":1,"layout":"post","photos":[],"link":"","content":"

搬瓦工官网地址无法登陆

目前搬瓦工官网地址无法直接访问,官方给出了镜像地址,请通过镜像地址管理vps。

\n

官方镜像地址:http://bwh88.net

\n

登入kiwiVM控制面板

买好搬瓦工banwagonhost vps之后,一般会在开通邮件里给出登陆的地址及账号密码,登陆之后会看到如下界面

\n

点击Services–My Services选项卡,来到如下页面

\n

点击kiwiVM control panel,进入后台管理界面

\n

重装系统

首先在Main Controls 找到 Actions:,并点击stop

\n

然后点击 Install new OS,重装系统,
这里以debian-6.0-x86为例,选中,点击reload,
开始重装,很快就会重装好。

\n

获取vps远程登录信息

这里需要记录vps的ip地址,SSH端口,及系统密码方便我们使用putty远程管理vps。
如果不会使用putty,可以参看这篇文章
使用putty远程管理vps
ip地址及SSH端口:在Main Control里可以找到。

\n

系统密码: 点击Root Password Modification,系统会生成一串密码,记录下该密码

\n

更换ip

有时会遇到ip被屏蔽的状况,这是可以考虑换一个ip,换ip的话有两种方法:
1)向客服提交ticket,让他给你换;
2)在后台切换。我给大家介绍下怎么自行切换ip。
进入到Migrate To another DC,出现如下界面

\n

值得注意的是它一般有多个机房位置可供切换:亚利桑那(位于西海岸)、洛杉矶(位于西海岸)、弗罗里达、荷兰等。
为了达到切换ip的目的,我们可以先切换机房至其他机房,然后再切换回来,这时一般ip就会更换了。
切换机房时间很快,而且不会影响到vps里的数据,大可以放心。

\n

本人使用的就是搬瓦工的VPS
bbs.xiaoxiao.su

\n","site":{"data":{}},"more":"

搬瓦工官网地址无法登陆

目前搬瓦工官网地址无法直接访问,官方给出了镜像地址,请通过镜像地址管理vps。

\n

官方镜像地址:http://bwh88.net

\n

登入kiwiVM控制面板

买好搬瓦工banwagonhost vps之后,一般会在开通邮件里给出登陆的地址及账号密码,登陆之后会看到如下界面

\n

点击Services–My Services选项卡,来到如下页面

\n

点击kiwiVM control panel,进入后台管理界面

\n

重装系统

首先在Main Controls 找到 Actions:,并点击stop

\n

然后点击 Install new OS,重装系统,
这里以debian-6.0-x86为例,选中,点击reload,
开始重装,很快就会重装好。

\n

获取vps远程登录信息

这里需要记录vps的ip地址,SSH端口,及系统密码方便我们使用putty远程管理vps。
如果不会使用putty,可以参看这篇文章
使用putty远程管理vps
ip地址及SSH端口:在Main Control里可以找到。

\n

系统密码: 点击Root Password Modification,系统会生成一串密码,记录下该密码

\n

更换ip

有时会遇到ip被屏蔽的状况,这是可以考虑换一个ip,换ip的话有两种方法:
1)向客服提交ticket,让他给你换;
2)在后台切换。我给大家介绍下怎么自行切换ip。
进入到Migrate To another DC,出现如下界面

\n

值得注意的是它一般有多个机房位置可供切换:亚利桑那(位于西海岸)、洛杉矶(位于西海岸)、弗罗里达、荷兰等。
为了达到切换ip的目的,我们可以先切换机房至其他机房,然后再切换回来,这时一般ip就会更换了。
切换机房时间很快,而且不会影响到vps里的数据,大可以放心。

\n

本人使用的就是搬瓦工的VPS
bbs.xiaoxiao.su

\n"},{"title":"新的一年2017","excerpt":"","abbrlink":4388,"date":"2016-12-31T19:33:41.000Z","_content":"\n今天是2017的第一天。 祝大家元旦快乐。 ps感谢小草莓为我申请的阿里云 最近博客所在服务器老是宕机。服务器内存看起来不太够,需要升级了应该。 过完年再换","source":"_posts/新的一年2017.md","raw":"---\ntitle: 新的一年2017\ntags:\n - 元旦\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 4388\ndate: 2017-01-01 03:33:41\n---\n\n今天是2017的第一天。 祝大家元旦快乐。 ps感谢小草莓为我申请的阿里云 最近博客所在服务器老是宕机。服务器内存看起来不太够,需要升级了应该。 过完年再换","slug":"新的一年2017","published":1,"updated":"2023-09-30T02:59:46.522Z","_id":"cln4obyhg00f8oko0dpxihe04","comments":1,"layout":"post","photos":[],"link":"","content":"

今天是2017的第一天。 祝大家元旦快乐。 ps感谢小草莓为我申请的阿里云 最近博客所在服务器老是宕机。服务器内存看起来不太够,需要升级了应该。 过完年再换

\n","site":{"data":{}},"more":"

今天是2017的第一天。 祝大家元旦快乐。 ps感谢小草莓为我申请的阿里云 最近博客所在服务器老是宕机。服务器内存看起来不太够,需要升级了应该。 过完年再换

\n"},{"title":"杀手,无与伦比的自由","excerpt":"","abbrlink":19765,"date":"2011-08-30T09:17:34.000Z","_content":"\nMR.NEVER DIE的传奇。 当苍叶还是苍叶时,他活得不自由,到哪都有人向他讨债,后来还被关在小厕所里一个星期,所以他渴望自由,所以当苍叶变成“Mr Never Die”时,他在身上刺满各种文字的自由,他讨厌任何会束缚到自己的地方,他住别人的吃别人的随时拍拍屁股走人,不必担心会有何牵挂,他在高楼之间暴走,天地间仿佛没有什么可以阻挡他的自由。非常非常的形式化的自由,越是如此,内心越颠狂,苍叶真的在坠机时彻底“死”了,所以他会活活打死自己前女友,退化成一只拥有异能的狂暴的兽。 他认为自己是不死的人。是一个高级的已经死过的人。\n\n从最初的“阳台上的波斯湾”,“登峰造极的杰作”,“夙兴夜寐的犯罪”,“追逐媒体的犯罪”,“流离寻岸的花”,到如今的“无与伦比的自由”。杀手系列的故事不尽然本本精彩,却总让人期待。记得在杀手铁块那一本的最后,有预告,其一就是MR NEVERDIE,还有杀手,太极,还有一个F。西门曾说过有一个能与G匹敌,是不是F呢,很期待后作。 在《流离寻岸的花》的最后,〈杀手,无与伦比的自由〉号称是要用最剽悍的热血止住眼泪。看罢全文,并没有很热血,更没有想哭泣的欲望,那个预告,于我而言,是打了折扣的。但不可否认,杀手,Mr Never Die仍将成为杀手系列的一个经典。与以往不同的是,小说以直叙为主,把一个原本有点懦弱胆怯的被害人“死”过一次,重生后成为不死传说的疯狂杀手的过程详实的记录了下来。不热血,与《功夫》与《猎命师》比起来真的太不热血了,有的只是疯狂与变态。 杀手界默认的三大法则与职业道德成为此书探讨的重点。不管是杀手,读者还是作者本人,都不满足于只看一个个风格各异的杀手执行任务的点滴过程,事物的本质更为穿透人心。 看着邹哥与九十九在死神餐厅(OR洒吧)里聊着各自手下的几名杀手,聊着业界公认的三大法则与职业道德,心中平端生出几许唏嘘。 死神泰利的大雨夜,十七级超强台风登陆的那一天,很多的事撞在了一起,很缜密的布局,牵涉甚广,刀大运筹帷幄,同时构思N个故事,并且都让每个故事互相影响、发生角色流动,这种跨越许多故事的平行架构能力,除非是万中选一的奇才否则绝对办不到啊! 在那一个白天,杀手月将叶素芬干掉,豺狼与月对决取胜,欧阳盆栽与九十九连手将叛徒小刘干掉。王董被跳楼的猫胎人砸死。晚上,欧阳盆栽登上了豪华邮轮,与赌神一决胜负。是夜,冷面佛与琅铛大仔双双殒命。铁块和小恩的仇得报了,欧阳盆栽和他女友的仇也得报了,不管是邹哥派出去的杀手还是赌神下的单,总之,故事告一段落了。看了后来的再去翻看前面的,会更为佩服九把刀写故事的能力,真是万中选一的奇才啊!环环相扣,几乎没什么破绽。","source":"_posts/杀手,无与伦比的自由.md","raw":"---\ntitle: 杀手,无与伦比的自由\ntags:\n - MR.NEVERDIE\n - 九把刀\n - 无与伦比的自由\n - 杀手\n - 笔记\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 19765\ndate: 2011-08-30 17:17:34\n---\n\nMR.NEVER DIE的传奇。 当苍叶还是苍叶时,他活得不自由,到哪都有人向他讨债,后来还被关在小厕所里一个星期,所以他渴望自由,所以当苍叶变成“Mr Never Die”时,他在身上刺满各种文字的自由,他讨厌任何会束缚到自己的地方,他住别人的吃别人的随时拍拍屁股走人,不必担心会有何牵挂,他在高楼之间暴走,天地间仿佛没有什么可以阻挡他的自由。非常非常的形式化的自由,越是如此,内心越颠狂,苍叶真的在坠机时彻底“死”了,所以他会活活打死自己前女友,退化成一只拥有异能的狂暴的兽。 他认为自己是不死的人。是一个高级的已经死过的人。\n\n从最初的“阳台上的波斯湾”,“登峰造极的杰作”,“夙兴夜寐的犯罪”,“追逐媒体的犯罪”,“流离寻岸的花”,到如今的“无与伦比的自由”。杀手系列的故事不尽然本本精彩,却总让人期待。记得在杀手铁块那一本的最后,有预告,其一就是MR NEVERDIE,还有杀手,太极,还有一个F。西门曾说过有一个能与G匹敌,是不是F呢,很期待后作。 在《流离寻岸的花》的最后,〈杀手,无与伦比的自由〉号称是要用最剽悍的热血止住眼泪。看罢全文,并没有很热血,更没有想哭泣的欲望,那个预告,于我而言,是打了折扣的。但不可否认,杀手,Mr Never Die仍将成为杀手系列的一个经典。与以往不同的是,小说以直叙为主,把一个原本有点懦弱胆怯的被害人“死”过一次,重生后成为不死传说的疯狂杀手的过程详实的记录了下来。不热血,与《功夫》与《猎命师》比起来真的太不热血了,有的只是疯狂与变态。 杀手界默认的三大法则与职业道德成为此书探讨的重点。不管是杀手,读者还是作者本人,都不满足于只看一个个风格各异的杀手执行任务的点滴过程,事物的本质更为穿透人心。 看着邹哥与九十九在死神餐厅(OR洒吧)里聊着各自手下的几名杀手,聊着业界公认的三大法则与职业道德,心中平端生出几许唏嘘。 死神泰利的大雨夜,十七级超强台风登陆的那一天,很多的事撞在了一起,很缜密的布局,牵涉甚广,刀大运筹帷幄,同时构思N个故事,并且都让每个故事互相影响、发生角色流动,这种跨越许多故事的平行架构能力,除非是万中选一的奇才否则绝对办不到啊! 在那一个白天,杀手月将叶素芬干掉,豺狼与月对决取胜,欧阳盆栽与九十九连手将叛徒小刘干掉。王董被跳楼的猫胎人砸死。晚上,欧阳盆栽登上了豪华邮轮,与赌神一决胜负。是夜,冷面佛与琅铛大仔双双殒命。铁块和小恩的仇得报了,欧阳盆栽和他女友的仇也得报了,不管是邹哥派出去的杀手还是赌神下的单,总之,故事告一段落了。看了后来的再去翻看前面的,会更为佩服九把刀写故事的能力,真是万中选一的奇才啊!环环相扣,几乎没什么破绽。","slug":"杀手,无与伦比的自由","published":1,"updated":"2023-09-30T02:59:46.522Z","_id":"cln4obyhh00fboko02q2x30mc","comments":1,"layout":"post","photos":[],"link":"","content":"

MR.NEVER DIE的传奇。 当苍叶还是苍叶时,他活得不自由,到哪都有人向他讨债,后来还被关在小厕所里一个星期,所以他渴望自由,所以当苍叶变成“Mr Never Die”时,他在身上刺满各种文字的自由,他讨厌任何会束缚到自己的地方,他住别人的吃别人的随时拍拍屁股走人,不必担心会有何牵挂,他在高楼之间暴走,天地间仿佛没有什么可以阻挡他的自由。非常非常的形式化的自由,越是如此,内心越颠狂,苍叶真的在坠机时彻底“死”了,所以他会活活打死自己前女友,退化成一只拥有异能的狂暴的兽。 他认为自己是不死的人。是一个高级的已经死过的人。

\n\n

从最初的“阳台上的波斯湾”,“登峰造极的杰作”,“夙兴夜寐的犯罪”,“追逐媒体的犯罪”,“流离寻岸的花”,到如今的“无与伦比的自由”。杀手系列的故事不尽然本本精彩,却总让人期待。记得在杀手铁块那一本的最后,有预告,其一就是MR NEVERDIE,还有杀手,太极,还有一个F。西门曾说过有一个能与G匹敌,是不是F呢,很期待后作。 在《流离寻岸的花》的最后,〈杀手,无与伦比的自由〉号称是要用最剽悍的热血止住眼泪。看罢全文,并没有很热血,更没有想哭泣的欲望,那个预告,于我而言,是打了折扣的。但不可否认,杀手,Mr Never Die仍将成为杀手系列的一个经典。与以往不同的是,小说以直叙为主,把一个原本有点懦弱胆怯的被害人“死”过一次,重生后成为不死传说的疯狂杀手的过程详实的记录了下来。不热血,与《功夫》与《猎命师》比起来真的太不热血了,有的只是疯狂与变态。 杀手界默认的三大法则与职业道德成为此书探讨的重点。不管是杀手,读者还是作者本人,都不满足于只看一个个风格各异的杀手执行任务的点滴过程,事物的本质更为穿透人心。 看着邹哥与九十九在死神餐厅(OR洒吧)里聊着各自手下的几名杀手,聊着业界公认的三大法则与职业道德,心中平端生出几许唏嘘。 死神泰利的大雨夜,十七级超强台风登陆的那一天,很多的事撞在了一起,很缜密的布局,牵涉甚广,刀大运筹帷幄,同时构思N个故事,并且都让每个故事互相影响、发生角色流动,这种跨越许多故事的平行架构能力,除非是万中选一的奇才否则绝对办不到啊! 在那一个白天,杀手月将叶素芬干掉,豺狼与月对决取胜,欧阳盆栽与九十九连手将叛徒小刘干掉。王董被跳楼的猫胎人砸死。晚上,欧阳盆栽登上了豪华邮轮,与赌神一决胜负。是夜,冷面佛与琅铛大仔双双殒命。铁块和小恩的仇得报了,欧阳盆栽和他女友的仇也得报了,不管是邹哥派出去的杀手还是赌神下的单,总之,故事告一段落了。看了后来的再去翻看前面的,会更为佩服九把刀写故事的能力,真是万中选一的奇才啊!环环相扣,几乎没什么破绽。

\n","site":{"data":{}},"more":"

MR.NEVER DIE的传奇。 当苍叶还是苍叶时,他活得不自由,到哪都有人向他讨债,后来还被关在小厕所里一个星期,所以他渴望自由,所以当苍叶变成“Mr Never Die”时,他在身上刺满各种文字的自由,他讨厌任何会束缚到自己的地方,他住别人的吃别人的随时拍拍屁股走人,不必担心会有何牵挂,他在高楼之间暴走,天地间仿佛没有什么可以阻挡他的自由。非常非常的形式化的自由,越是如此,内心越颠狂,苍叶真的在坠机时彻底“死”了,所以他会活活打死自己前女友,退化成一只拥有异能的狂暴的兽。 他认为自己是不死的人。是一个高级的已经死过的人。

\n\n

从最初的“阳台上的波斯湾”,“登峰造极的杰作”,“夙兴夜寐的犯罪”,“追逐媒体的犯罪”,“流离寻岸的花”,到如今的“无与伦比的自由”。杀手系列的故事不尽然本本精彩,却总让人期待。记得在杀手铁块那一本的最后,有预告,其一就是MR NEVERDIE,还有杀手,太极,还有一个F。西门曾说过有一个能与G匹敌,是不是F呢,很期待后作。 在《流离寻岸的花》的最后,〈杀手,无与伦比的自由〉号称是要用最剽悍的热血止住眼泪。看罢全文,并没有很热血,更没有想哭泣的欲望,那个预告,于我而言,是打了折扣的。但不可否认,杀手,Mr Never Die仍将成为杀手系列的一个经典。与以往不同的是,小说以直叙为主,把一个原本有点懦弱胆怯的被害人“死”过一次,重生后成为不死传说的疯狂杀手的过程详实的记录了下来。不热血,与《功夫》与《猎命师》比起来真的太不热血了,有的只是疯狂与变态。 杀手界默认的三大法则与职业道德成为此书探讨的重点。不管是杀手,读者还是作者本人,都不满足于只看一个个风格各异的杀手执行任务的点滴过程,事物的本质更为穿透人心。 看着邹哥与九十九在死神餐厅(OR洒吧)里聊着各自手下的几名杀手,聊着业界公认的三大法则与职业道德,心中平端生出几许唏嘘。 死神泰利的大雨夜,十七级超强台风登陆的那一天,很多的事撞在了一起,很缜密的布局,牵涉甚广,刀大运筹帷幄,同时构思N个故事,并且都让每个故事互相影响、发生角色流动,这种跨越许多故事的平行架构能力,除非是万中选一的奇才否则绝对办不到啊! 在那一个白天,杀手月将叶素芬干掉,豺狼与月对决取胜,欧阳盆栽与九十九连手将叛徒小刘干掉。王董被跳楼的猫胎人砸死。晚上,欧阳盆栽登上了豪华邮轮,与赌神一决胜负。是夜,冷面佛与琅铛大仔双双殒命。铁块和小恩的仇得报了,欧阳盆栽和他女友的仇也得报了,不管是邹哥派出去的杀手还是赌神下的单,总之,故事告一段落了。看了后来的再去翻看前面的,会更为佩服九把刀写故事的能力,真是万中选一的奇才啊!环环相扣,几乎没什么破绽。

\n"},{"abbrlink":"8828c81e","date":"2023-06-13T06:25:30.714Z","excerpt":"...","title":"给Memos添加Artalk评论","updated":"2023-09-30T02:59:46.522Z","cover":null,"_content":"上文提到\n[给Memos添加Twikoo评论](/2023/507a5d86.html)\n\n\n2023.9.26更新提醒: memos升级到0.15.1后版本,本方法失效\n## 自定义脚本\n\n```\n// Artalk comments 2023.8.15更新\n// 用 JS 向页面中插入 JS\nfunction addArtalkJS() { \n var memosArtalk = document.createElement(\"script\");\n memosArtalk.src = `https://unpkg.com/artalk/dist/Artalk.js`;\n var artakPos = document.getElementsByTagName(\"script\")[0];\n artakPos.parentNode.insertBefore(memosArtalk, artakPos);\n};\n// div\nfunction startArtalk() {\n start = setInterval(function(){\n var artalkDom = document.getElementById('Comments') || '';\n var memoAt = document.querySelector('.memo-wrapper') || '';\n var memoLoading = document.querySelector('.action-button-container') || '';\n var memoLoadingA = document.querySelector('.action-button-container a') || '';\n if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && memoLoadingA){\n memoLoading.innerHTML = \"评论加载中……\"\n }\n if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && !artalkDom){\n addArtalkJS()\n if(memoAt){\n clearInterval(start)\n var cssLink = document.createElement(\"link\");\n cssLink.rel = \"stylesheet\";\n cssLink.href = \"https://unpkg.com/artalk/dist/Artalk.css\";\n document.head.appendChild(cssLink);\n memoAt.insertAdjacentHTML('afterend', '
');\n setTimeout(function() {\n Artalk.init({\n el: '#Comments',\n pageKey: location.pathname,\n pageTitle: document.title,\n server: 'https://atim.fly.dev',\n site: 'memos',\n darkMode: 'auto'\n });\n Artalk.on('list-loaded', function() {\n // console.log('评论加载完成');\n memoLoading.innerHTML = ''\n startArtalk();\n });\n }, 1000);\n }\n }\n //console.log(window.location.href);\n }, 1000)\n}\nstartArtalk();\n```\n\n## 自定义样式\n\n```\na.time-text:after { content: ' 评论 💬 '; }\n.atk-main-editor { margin-top: 20px; }\n\n```\n","source":"_posts/给Memos添加Artalk评论.md","raw":"---\nabbrlink: 8828c81e\ncategories:\n - - 分享\ndate: '2023-06-13T14:25:30.714383+08:00'\nexcerpt: ...\ntags:\n - Memos\ntitle: 给Memos添加Artalk评论\nupdated: '2023-8-13T14:28:41.53+8:0'\ncover:\n---\n上文提到\n[给Memos添加Twikoo评论](/2023/507a5d86.html)\n\n\n2023.9.26更新提醒: memos升级到0.15.1后版本,本方法失效\n## 自定义脚本\n\n```\n// Artalk comments 2023.8.15更新\n// 用 JS 向页面中插入 JS\nfunction addArtalkJS() { \n var memosArtalk = document.createElement(\"script\");\n memosArtalk.src = `https://unpkg.com/artalk/dist/Artalk.js`;\n var artakPos = document.getElementsByTagName(\"script\")[0];\n artakPos.parentNode.insertBefore(memosArtalk, artakPos);\n};\n// div\nfunction startArtalk() {\n start = setInterval(function(){\n var artalkDom = document.getElementById('Comments') || '';\n var memoAt = document.querySelector('.memo-wrapper') || '';\n var memoLoading = document.querySelector('.action-button-container') || '';\n var memoLoadingA = document.querySelector('.action-button-container a') || '';\n if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && memoLoadingA){\n memoLoading.innerHTML = \"评论加载中……\"\n }\n if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && !artalkDom){\n addArtalkJS()\n if(memoAt){\n clearInterval(start)\n var cssLink = document.createElement(\"link\");\n cssLink.rel = \"stylesheet\";\n cssLink.href = \"https://unpkg.com/artalk/dist/Artalk.css\";\n document.head.appendChild(cssLink);\n memoAt.insertAdjacentHTML('afterend', '
');\n setTimeout(function() {\n Artalk.init({\n el: '#Comments',\n pageKey: location.pathname,\n pageTitle: document.title,\n server: 'https://atim.fly.dev',\n site: 'memos',\n darkMode: 'auto'\n });\n Artalk.on('list-loaded', function() {\n // console.log('评论加载完成');\n memoLoading.innerHTML = ''\n startArtalk();\n });\n }, 1000);\n }\n }\n //console.log(window.location.href);\n }, 1000)\n}\nstartArtalk();\n```\n\n## 自定义样式\n\n```\na.time-text:after { content: ' 评论 💬 '; }\n.atk-main-editor { margin-top: 20px; }\n\n```\n","slug":"给Memos添加Artalk评论","published":1,"_id":"cln4obyhh00ffoko0fofe62zd","comments":1,"layout":"post","photos":[],"link":"","content":"

上文提到
给Memos添加Twikoo评论

\n

2023.9.26更新提醒: memos升级到0.15.1后版本,本方法失效

\n

自定义脚本

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
// Artalk comments 2023.8.15更新
// 用 JS 向页面中插入 JS
function addArtalkJS() {
var memosArtalk = document.createElement("script");
memosArtalk.src = `https://unpkg.com/artalk/dist/Artalk.js`;
var artakPos = document.getElementsByTagName("script")[0];
artakPos.parentNode.insertBefore(memosArtalk, artakPos);
};
// div
function startArtalk() {
start = setInterval(function(){
var artalkDom = document.getElementById('Comments') || '';
var memoAt = document.querySelector('.memo-wrapper') || '';
var memoLoading = document.querySelector('.action-button-container') || '';
var memoLoadingA = document.querySelector('.action-button-container a') || '';
if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && memoLoadingA){
memoLoading.innerHTML = "评论加载中……"
}
if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && !artalkDom){
addArtalkJS()
if(memoAt){
clearInterval(start)
var cssLink = document.createElement("link");
cssLink.rel = "stylesheet";
cssLink.href = "https://unpkg.com/artalk/dist/Artalk.css";
document.head.appendChild(cssLink);
memoAt.insertAdjacentHTML('afterend', '<div id="Comments"></div>');
setTimeout(function() {
Artalk.init({
el: '#Comments',
pageKey: location.pathname,
pageTitle: document.title,
server: 'https://atim.fly.dev',
site: 'memos',
darkMode: 'auto'
});
Artalk.on('list-loaded', function() {
// console.log('评论加载完成');
memoLoading.innerHTML = ''
startArtalk();
});
}, 1000);
}
}
//console.log(window.location.href);
}, 1000)
}
startArtalk();
\n\n

自定义样式

1
2
3
a.time-text:after { content: '   评论 💬 '; }
.atk-main-editor { margin-top: 20px; }

\n","site":{"data":{}},"more":"

上文提到
给Memos添加Twikoo评论

\n

2023.9.26更新提醒: memos升级到0.15.1后版本,本方法失效

\n

自定义脚本

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
// Artalk comments 2023.8.15更新
// 用 JS 向页面中插入 JS
function addArtalkJS() {
var memosArtalk = document.createElement("script");
memosArtalk.src = `https://unpkg.com/artalk/dist/Artalk.js`;
var artakPos = document.getElementsByTagName("script")[0];
artakPos.parentNode.insertBefore(memosArtalk, artakPos);
};
// div
function startArtalk() {
start = setInterval(function(){
var artalkDom = document.getElementById('Comments') || '';
var memoAt = document.querySelector('.memo-wrapper') || '';
var memoLoading = document.querySelector('.action-button-container') || '';
var memoLoadingA = document.querySelector('.action-button-container a') || '';
if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && memoLoadingA){
memoLoading.innerHTML = "评论加载中……"
}
if(window.location.href.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && !artalkDom){
addArtalkJS()
if(memoAt){
clearInterval(start)
var cssLink = document.createElement("link");
cssLink.rel = "stylesheet";
cssLink.href = "https://unpkg.com/artalk/dist/Artalk.css";
document.head.appendChild(cssLink);
memoAt.insertAdjacentHTML('afterend', '<div id="Comments"></div>');
setTimeout(function() {
Artalk.init({
el: '#Comments',
pageKey: location.pathname,
pageTitle: document.title,
server: 'https://atim.fly.dev',
site: 'memos',
darkMode: 'auto'
});
Artalk.on('list-loaded', function() {
// console.log('评论加载完成');
memoLoading.innerHTML = ''
startArtalk();
});
}, 1000);
}
}
//console.log(window.location.href);
}, 1000)
}
startArtalk();
\n\n

自定义样式

1
2
3
a.time-text:after { content: '   评论 💬 '; }
.atk-main-editor { margin-top: 20px; }

\n"},{"title":"现实就是这么现实","excerpt":"","abbrlink":53315,"date":"2011-08-06T09:20:54.000Z","_content":"\n我今年24了,属于大龄未婚青年了。\n\n 在我们村子里这都属于奇闻轶事了。\n \n 就是在那样一个仍然有封建思想残留的小村子里,我已然年迈的父亲找人说媒给我安排了相亲。\n \n相亲不是今年才流行来的,而是一直从遥远到不知道什么朝代流传下来的。\n \n我的老一辈,我的同辈,甚至我的小辈都注定要把这个模式延续下去。 \n \n在父母的催说下我开始了我纠结的相亲之路。 \n \n相亲是现实的,他关系到婚姻,他关系到子孙后代,他关系到家族兴旺,他关系到历史更迭。\n \n是这样的。我没有任何夸张。 \n \n相亲的过程是矛盾而纠结的,有新鲜刺激,有仓皇失措。 \n \n我总得找一个我喜欢的人来相爱来相守来相伴到死吧。\n \n所以,尽管我相亲的数量在增加但成功率一直没有丝毫见涨。 \n \n我很灰心。总结起来有如下几点我没有做到。 \n \n第一、彩礼。如今的我没有积蓄没有任何突出的收入。如何能拿出近10W的礼金? \n \n第二、房子。我没有丝毫的信心在我死之前可以买到一套房。 \n \n第三、车。四个轮子的车没有。车马炮的车倒是有。 \n \n第四、事业。糊口可以富足就永远也谈不上。 \n \n就是这样的现实。\n \n相亲就是在这样的问题问答当中开始又结束。 \n \n仓促的见面又仓促的各奔东西,在各自的记忆中丝毫不会留下半分的印象。 \n \n这个社会理想永远是遥远的不可实现的。 \n \n就是这么的现实。 \n \n今天是七夕。\n \n祝福大家有情人终究分手。有钱人终成眷属。","source":"_posts/现实就是这么现实.md","raw":"---\ntitle: 现实就是这么现实\ntags:\n - 七夕\n - 情人节\n - 现实\n - 生活\n - 相亲\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 53315\ndate: 2011-08-06 17:20:54\n---\n\n我今年24了,属于大龄未婚青年了。\n\n 在我们村子里这都属于奇闻轶事了。\n \n 就是在那样一个仍然有封建思想残留的小村子里,我已然年迈的父亲找人说媒给我安排了相亲。\n \n相亲不是今年才流行来的,而是一直从遥远到不知道什么朝代流传下来的。\n \n我的老一辈,我的同辈,甚至我的小辈都注定要把这个模式延续下去。 \n \n在父母的催说下我开始了我纠结的相亲之路。 \n \n相亲是现实的,他关系到婚姻,他关系到子孙后代,他关系到家族兴旺,他关系到历史更迭。\n \n是这样的。我没有任何夸张。 \n \n相亲的过程是矛盾而纠结的,有新鲜刺激,有仓皇失措。 \n \n我总得找一个我喜欢的人来相爱来相守来相伴到死吧。\n \n所以,尽管我相亲的数量在增加但成功率一直没有丝毫见涨。 \n \n我很灰心。总结起来有如下几点我没有做到。 \n \n第一、彩礼。如今的我没有积蓄没有任何突出的收入。如何能拿出近10W的礼金? \n \n第二、房子。我没有丝毫的信心在我死之前可以买到一套房。 \n \n第三、车。四个轮子的车没有。车马炮的车倒是有。 \n \n第四、事业。糊口可以富足就永远也谈不上。 \n \n就是这样的现实。\n \n相亲就是在这样的问题问答当中开始又结束。 \n \n仓促的见面又仓促的各奔东西,在各自的记忆中丝毫不会留下半分的印象。 \n \n这个社会理想永远是遥远的不可实现的。 \n \n就是这么的现实。 \n \n今天是七夕。\n \n祝福大家有情人终究分手。有钱人终成眷属。","slug":"现实就是这么现实","published":1,"updated":"2023-09-30T02:59:46.522Z","_id":"cln4obyhi00fioko0d3mecfeg","comments":1,"layout":"post","photos":[],"link":"","content":"

我今年24了,属于大龄未婚青年了。

\n

在我们村子里这都属于奇闻轶事了。

\n

就是在那样一个仍然有封建思想残留的小村子里,我已然年迈的父亲找人说媒给我安排了相亲。

\n

相亲不是今年才流行来的,而是一直从遥远到不知道什么朝代流传下来的。

\n

我的老一辈,我的同辈,甚至我的小辈都注定要把这个模式延续下去。

\n

在父母的催说下我开始了我纠结的相亲之路。

\n

相亲是现实的,他关系到婚姻,他关系到子孙后代,他关系到家族兴旺,他关系到历史更迭。

\n

是这样的。我没有任何夸张。

\n

相亲的过程是矛盾而纠结的,有新鲜刺激,有仓皇失措。

\n

我总得找一个我喜欢的人来相爱来相守来相伴到死吧。

\n

所以,尽管我相亲的数量在增加但成功率一直没有丝毫见涨。

\n

我很灰心。总结起来有如下几点我没有做到。

\n

第一、彩礼。如今的我没有积蓄没有任何突出的收入。如何能拿出近10W的礼金?

\n

第二、房子。我没有丝毫的信心在我死之前可以买到一套房。

\n

第三、车。四个轮子的车没有。车马炮的车倒是有。

\n

第四、事业。糊口可以富足就永远也谈不上。

\n

就是这样的现实。

\n

相亲就是在这样的问题问答当中开始又结束。

\n

仓促的见面又仓促的各奔东西,在各自的记忆中丝毫不会留下半分的印象。

\n

这个社会理想永远是遥远的不可实现的。

\n

就是这么的现实。

\n

今天是七夕。

\n

祝福大家有情人终究分手。有钱人终成眷属。

\n","site":{"data":{}},"more":"

我今年24了,属于大龄未婚青年了。

\n

在我们村子里这都属于奇闻轶事了。

\n

就是在那样一个仍然有封建思想残留的小村子里,我已然年迈的父亲找人说媒给我安排了相亲。

\n

相亲不是今年才流行来的,而是一直从遥远到不知道什么朝代流传下来的。

\n

我的老一辈,我的同辈,甚至我的小辈都注定要把这个模式延续下去。

\n

在父母的催说下我开始了我纠结的相亲之路。

\n

相亲是现实的,他关系到婚姻,他关系到子孙后代,他关系到家族兴旺,他关系到历史更迭。

\n

是这样的。我没有任何夸张。

\n

相亲的过程是矛盾而纠结的,有新鲜刺激,有仓皇失措。

\n

我总得找一个我喜欢的人来相爱来相守来相伴到死吧。

\n

所以,尽管我相亲的数量在增加但成功率一直没有丝毫见涨。

\n

我很灰心。总结起来有如下几点我没有做到。

\n

第一、彩礼。如今的我没有积蓄没有任何突出的收入。如何能拿出近10W的礼金?

\n

第二、房子。我没有丝毫的信心在我死之前可以买到一套房。

\n

第三、车。四个轮子的车没有。车马炮的车倒是有。

\n

第四、事业。糊口可以富足就永远也谈不上。

\n

就是这样的现实。

\n

相亲就是在这样的问题问答当中开始又结束。

\n

仓促的见面又仓促的各奔东西,在各自的记忆中丝毫不会留下半分的印象。

\n

这个社会理想永远是遥远的不可实现的。

\n

就是这么的现实。

\n

今天是七夕。

\n

祝福大家有情人终究分手。有钱人终成眷属。

\n"},{"title":"编译AppleALC出现错误","excerpt":"","abbrlink":7142,"date":"2022-05-28T23:01:10.000Z","_content":"\n> In subcomponent: /Users/admin/Library/Developer/Xcode/DerivedData/AppleALC-fqueikknxpxowubueomyyxuwlnmg/Build/Products/Debug/AppleALC.kext/Contents/PlugIns/PinConfigs.kext/Contents/Info.plist.md5 Command CodeSign failed with a nonzero exit code\n\n解决办法\n\nOther Code Signing Flags添加参数--deep","source":"_posts/编译AppleALC出现错误.md","raw":"---\ntitle: 编译AppleALC出现错误\ntags:\n - AppleALC\n - macOS\n - xcode\n - 笔记\nexcerpt: ''\ncategories:\n - 分享 \nabbrlink: 7142\ndate: 2022-05-29 07:01:10\n---\n\n> In subcomponent: /Users/admin/Library/Developer/Xcode/DerivedData/AppleALC-fqueikknxpxowubueomyyxuwlnmg/Build/Products/Debug/AppleALC.kext/Contents/PlugIns/PinConfigs.kext/Contents/Info.plist.md5 Command CodeSign failed with a nonzero exit code\n\n解决办法\n\nOther Code Signing Flags添加参数--deep","slug":"编译AppleALC出现错误","published":1,"updated":"2023-09-30T02:59:46.522Z","_id":"cln4obyhi00fmoko0b6jtb4fq","comments":1,"layout":"post","photos":[],"link":"","content":"
\n

In subcomponent: /Users/admin/Library/Developer/Xcode/DerivedData/AppleALC-fqueikknxpxowubueomyyxuwlnmg/Build/Products/Debug/AppleALC.kext/Contents/PlugIns/PinConfigs.kext/Contents/Info.plist.md5 Command CodeSign failed with a nonzero exit code

\n
\n

解决办法

\n

Other Code Signing Flags添加参数–deep

\n","site":{"data":{}},"more":"
\n

In subcomponent: /Users/admin/Library/Developer/Xcode/DerivedData/AppleALC-fqueikknxpxowubueomyyxuwlnmg/Build/Products/Debug/AppleALC.kext/Contents/PlugIns/PinConfigs.kext/Contents/Info.plist.md5 Command CodeSign failed with a nonzero exit code

\n
\n

解决办法

\n

Other Code Signing Flags添加参数–deep

\n"},{"abbrlink":"507a5d86","date":"2023-06-13T05:40:54.534Z","excerpt":"...","title":"给Memos添加Twikoo评论","updated":"2023-09-30T02:59:46.522Z","cover":null,"_content":"2023.9.26 更新.memos升级0.15.1版本后无法使用\n\n代码来自于@[林木木](https://immmmm.com/memos-with-twikoo/)\n\n## 自定义脚本\n\n```json\n//添加 twikoo 评论 v2023.06.10\nvar twikooENV = 'https://twikoo.jiong.us/'\nfunction addTwikooJS() { \n var memosTwikoo = document.createElement(\"script\");\n memosTwikoo.src = `https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js`;\n var tws = document.getElementsByTagName(\"script\")[0];\n tws.parentNode.insertBefore(memosTwikoo, tws);\n};\nfunction addComIcon(){\n var memoTwIcons = document.querySelectorAll('.time-text') || '';\n if(memoTwIcons){\n for(var i=0;i < memoTwIcons.length;i++){\n //if(memoTwIcon[i].hasChildNodes == false){\n memoTwIcons[i].insertAdjacentHTML('afterbegin', '
');\n //}\n }\n }\n};\nfunction startTwikoo() {\n start = setInterval(function(){\n var twikooDom = document.getElementById('twikoo') || '';\n var memoTw = document.querySelector('.memo-wrapper') || '';\n var memoLoading = document.querySelector('.action-button-container') || '';\n var memoLoadingA = document.querySelector('.action-button-container a') || '';\n var memoTwIcons = document.querySelectorAll('.time-text .twicon') || '';\n var nowHref = window.location.href;\n if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && memoLoadingA){\n memoLoading.innerHTML = \"评论加载中……\"\n }\n if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && !twikooDom){\n addTwikooJS()\n if(memoTw){\n clearInterval(start)\n memoTw.insertAdjacentHTML('afterend', '
');\n setTimeout(function() {\n twikoo.init({\n envId: twikooENV,\n el: '#mtcomment',\n path: nowHref.replace(/^(.*\\/m\\/[0-9]+).*$/,'$1'),\n onCommentLoaded: function () {\n //console.log('评论加载完成');\n memoLoading.innerHTML = ''\n startTwikoo()\n }\n })\n }, 1000)\n }\n }\n if(nowHref.replace(/^.*\\/(explore).*$/,'$1') == \"explore\" || nowHref.replace(/^.*\\/(u).*$/,'$1') == \"u\"){\n memoTwIcons.forEach(memoTwIcon => {memoTwIcon.remove();});\n addComIcon()\n //console.log('图标添加成功');\n }\n //console.log(window.location.href);\n }, 1000)\n}\nstartTwikoo();\n```\n\n## 自定义样式\n\n```\n#twikoo{padding: 1rem;background-color: rgb(63,63,70);margin: 1rem 0;border-radius: .5rem;color: #fff !important;}\n.twicon{position: absolute;right: 1rem;}\n.btns-container.space-x-2{margin-right:1.5rem;}\n.action-button-container{color: #e5e7eb;}\n.action-button-container a{display:none !important;}\n```","source":"_posts/给Memos添加Twikoo评论.md","raw":"---\nabbrlink: 507a5d86\ncategories:\n - - 分享\ndate: '2023-06-13T13:40:54.534656+08:00'\nexcerpt: ...\ntags:\n - Memos\n - Twikoo\ntitle: 给Memos添加Twikoo评论\nupdated: '2023-6-13T13:53:48.150+8:0'\ncover:\n---\n2023.9.26 更新.memos升级0.15.1版本后无法使用\n\n代码来自于@[林木木](https://immmmm.com/memos-with-twikoo/)\n\n## 自定义脚本\n\n```json\n//添加 twikoo 评论 v2023.06.10\nvar twikooENV = 'https://twikoo.jiong.us/'\nfunction addTwikooJS() { \n var memosTwikoo = document.createElement(\"script\");\n memosTwikoo.src = `https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js`;\n var tws = document.getElementsByTagName(\"script\")[0];\n tws.parentNode.insertBefore(memosTwikoo, tws);\n};\nfunction addComIcon(){\n var memoTwIcons = document.querySelectorAll('.time-text') || '';\n if(memoTwIcons){\n for(var i=0;i < memoTwIcons.length;i++){\n //if(memoTwIcon[i].hasChildNodes == false){\n memoTwIcons[i].insertAdjacentHTML('afterbegin', '
');\n //}\n }\n }\n};\nfunction startTwikoo() {\n start = setInterval(function(){\n var twikooDom = document.getElementById('twikoo') || '';\n var memoTw = document.querySelector('.memo-wrapper') || '';\n var memoLoading = document.querySelector('.action-button-container') || '';\n var memoLoadingA = document.querySelector('.action-button-container a') || '';\n var memoTwIcons = document.querySelectorAll('.time-text .twicon') || '';\n var nowHref = window.location.href;\n if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && memoLoadingA){\n memoLoading.innerHTML = \"评论加载中……\"\n }\n if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == \"m\" && !twikooDom){\n addTwikooJS()\n if(memoTw){\n clearInterval(start)\n memoTw.insertAdjacentHTML('afterend', '
');\n setTimeout(function() {\n twikoo.init({\n envId: twikooENV,\n el: '#mtcomment',\n path: nowHref.replace(/^(.*\\/m\\/[0-9]+).*$/,'$1'),\n onCommentLoaded: function () {\n //console.log('评论加载完成');\n memoLoading.innerHTML = ''\n startTwikoo()\n }\n })\n }, 1000)\n }\n }\n if(nowHref.replace(/^.*\\/(explore).*$/,'$1') == \"explore\" || nowHref.replace(/^.*\\/(u).*$/,'$1') == \"u\"){\n memoTwIcons.forEach(memoTwIcon => {memoTwIcon.remove();});\n addComIcon()\n //console.log('图标添加成功');\n }\n //console.log(window.location.href);\n }, 1000)\n}\nstartTwikoo();\n```\n\n## 自定义样式\n\n```\n#twikoo{padding: 1rem;background-color: rgb(63,63,70);margin: 1rem 0;border-radius: .5rem;color: #fff !important;}\n.twicon{position: absolute;right: 1rem;}\n.btns-container.space-x-2{margin-right:1.5rem;}\n.action-button-container{color: #e5e7eb;}\n.action-button-container a{display:none !important;}\n```","slug":"给Memos添加Twikoo评论","published":1,"_id":"cln4obyhi00fpoko08kqtatpb","comments":1,"layout":"post","photos":[],"link":"","content":"

2023.9.26 更新.memos升级0.15.1版本后无法使用

\n

代码来自于@林木木

\n

自定义脚本

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
//添加 twikoo 评论 v2023.06.10
var twikooENV = 'https://twikoo.jiong.us/'
function addTwikooJS() {
var memosTwikoo = document.createElement("script");
memosTwikoo.src = `https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js`;
var tws = document.getElementsByTagName("script")[0];
tws.parentNode.insertBefore(memosTwikoo, tws);
};
function addComIcon(){
var memoTwIcons = document.querySelectorAll('.time-text') || '';
if(memoTwIcons){
for(var i=0;i < memoTwIcons.length;i++){
//if(memoTwIcon[i].hasChildNodes == false){
memoTwIcons[i].insertAdjacentHTML('afterbegin', '<div class="twicon"><svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M896 138.667H128c-38.4 0-64 25.6-64 64v544c0 38.4 25.6 64 64 64h128v128c83.2 0 166.4-44.8 256-128h384c38.4 0 64-25.6 64-64v-544c0-38.4-25.6-64-64-64zm0 608H486.4l-19.2 19.2c-51.2 51.2-102.4 83.2-147.2 96v-115.2H128v-544h768v544z" fill="#8a8a8a"/><path d="M256 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM448 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM640 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0z" fill="#8a8a8a"/></svg></div>');
//}
}
}
};
function startTwikoo() {
start = setInterval(function(){
var twikooDom = document.getElementById('twikoo') || '';
var memoTw = document.querySelector('.memo-wrapper') || '';
var memoLoading = document.querySelector('.action-button-container') || '';
var memoLoadingA = document.querySelector('.action-button-container a') || '';
var memoTwIcons = document.querySelectorAll('.time-text .twicon') || '';
var nowHref = window.location.href;
if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && memoLoadingA){
memoLoading.innerHTML = "评论加载中……"
}
if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && !twikooDom){
addTwikooJS()
if(memoTw){
clearInterval(start)
memoTw.insertAdjacentHTML('afterend', '<div id="mtcomment"></div>');
setTimeout(function() {
twikoo.init({
envId: twikooENV,
el: '#mtcomment',
path: nowHref.replace(/^(.*\\/m\\/[0-9]+).*$/,'$1'),
onCommentLoaded: function () {
//console.log('评论加载完成');
memoLoading.innerHTML = ''
startTwikoo()
}
})
}, 1000)
}
}
if(nowHref.replace(/^.*\\/(explore).*$/,'$1') == "explore" || nowHref.replace(/^.*\\/(u).*$/,'$1') == "u"){
memoTwIcons.forEach(memoTwIcon => {memoTwIcon.remove();});
addComIcon()
//console.log('图标添加成功');
}
//console.log(window.location.href);
}, 1000)
}
startTwikoo();
\n\n

自定义样式

1
2
3
4
5
#twikoo{padding: 1rem;background-color: rgb(63,63,70);margin: 1rem 0;border-radius: .5rem;color: #fff !important;}
.twicon{position: absolute;right: 1rem;}
.btns-container.space-x-2{margin-right:1.5rem;}
.action-button-container{color: #e5e7eb;}
.action-button-container a{display:none !important;}
","site":{"data":{}},"more":"

2023.9.26 更新.memos升级0.15.1版本后无法使用

\n

代码来自于@林木木

\n

自定义脚本

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
//添加 twikoo 评论 v2023.06.10
var twikooENV = 'https://twikoo.jiong.us/'
function addTwikooJS() {
var memosTwikoo = document.createElement("script");
memosTwikoo.src = `https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js`;
var tws = document.getElementsByTagName("script")[0];
tws.parentNode.insertBefore(memosTwikoo, tws);
};
function addComIcon(){
var memoTwIcons = document.querySelectorAll('.time-text') || '';
if(memoTwIcons){
for(var i=0;i < memoTwIcons.length;i++){
//if(memoTwIcon[i].hasChildNodes == false){
memoTwIcons[i].insertAdjacentHTML('afterbegin', '<div class="twicon"><svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M896 138.667H128c-38.4 0-64 25.6-64 64v544c0 38.4 25.6 64 64 64h128v128c83.2 0 166.4-44.8 256-128h384c38.4 0 64-25.6 64-64v-544c0-38.4-25.6-64-64-64zm0 608H486.4l-19.2 19.2c-51.2 51.2-102.4 83.2-147.2 96v-115.2H128v-544h768v544z" fill="#8a8a8a"/><path d="M256 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM448 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM640 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0z" fill="#8a8a8a"/></svg></div>');
//}
}
}
};
function startTwikoo() {
start = setInterval(function(){
var twikooDom = document.getElementById('twikoo') || '';
var memoTw = document.querySelector('.memo-wrapper') || '';
var memoLoading = document.querySelector('.action-button-container') || '';
var memoLoadingA = document.querySelector('.action-button-container a') || '';
var memoTwIcons = document.querySelectorAll('.time-text .twicon') || '';
var nowHref = window.location.href;
if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && memoLoadingA){
memoLoading.innerHTML = "评论加载中……"
}
if( nowHref.replace(/^.*\\/(m)\\/.*$/,'$1') == "m" && !twikooDom){
addTwikooJS()
if(memoTw){
clearInterval(start)
memoTw.insertAdjacentHTML('afterend', '<div id="mtcomment"></div>');
setTimeout(function() {
twikoo.init({
envId: twikooENV,
el: '#mtcomment',
path: nowHref.replace(/^(.*\\/m\\/[0-9]+).*$/,'$1'),
onCommentLoaded: function () {
//console.log('评论加载完成');
memoLoading.innerHTML = ''
startTwikoo()
}
})
}, 1000)
}
}
if(nowHref.replace(/^.*\\/(explore).*$/,'$1') == "explore" || nowHref.replace(/^.*\\/(u).*$/,'$1') == "u"){
memoTwIcons.forEach(memoTwIcon => {memoTwIcon.remove();});
addComIcon()
//console.log('图标添加成功');
}
//console.log(window.location.href);
}, 1000)
}
startTwikoo();
\n\n

自定义样式

1
2
3
4
5
#twikoo{padding: 1rem;background-color: rgb(63,63,70);margin: 1rem 0;border-radius: .5rem;color: #fff !important;}
.twicon{position: absolute;right: 1rem;}
.btns-container.space-x-2{margin-right:1.5rem;}
.action-button-container{color: #e5e7eb;}
.action-button-container a{display:none !important;}
"},{"title":"群晖CPU和内存占满的排查记录","published":1,"abbrlink":"bc338f20","date":"2023-07-07T07:57:00.000Z","cover":null,"_content":"## 起因 \n最近一段时间群晖老是CPU和内存满载,桌面安装的套件自动停止 \n一开始我认为是迅雷NAS版的问题,可是重装几次问题依旧.\n## 排查 \n打开菜单-`资源监控`-`任务管理器` \n发现虚拟机的CPU占用了80%,于是卸载虚拟机的套件.重启.\n问题依旧.\n继续查看`任务管理器`.\n发现`video station`内存占用9G以上,回想起自己曾经安装过`video station`的刮削补丁.\n于是,卸载补丁,重启\n完美解决.\n## 总结\n不要安装一些以为很有用的第三方补丁.\n其实没什么用.\n还会造成一些莫名其妙的问题.\nNAS还是稳定为主,不折腾了.\n","source":"_posts/群晖CPU和内存占用过高的排查记录.md","raw":"---\ntitle: 群晖CPU和内存占满的排查记录\ntags:\n - 群晖\npublished: true\ncategories: 分享\nabbrlink: bc338f20\ndate: 2023-07-07 15:57:00\ncover:\n---\n## 起因 \n最近一段时间群晖老是CPU和内存满载,桌面安装的套件自动停止 \n一开始我认为是迅雷NAS版的问题,可是重装几次问题依旧.\n## 排查 \n打开菜单-`资源监控`-`任务管理器` \n发现虚拟机的CPU占用了80%,于是卸载虚拟机的套件.重启.\n问题依旧.\n继续查看`任务管理器`.\n发现`video station`内存占用9G以上,回想起自己曾经安装过`video station`的刮削补丁.\n于是,卸载补丁,重启\n完美解决.\n## 总结\n不要安装一些以为很有用的第三方补丁.\n其实没什么用.\n还会造成一些莫名其妙的问题.\nNAS还是稳定为主,不折腾了.\n","slug":"群晖CPU和内存占用过高的排查记录","updated":"2023-09-30T02:59:46.522Z","_id":"cln4obyhj00fsoko05rs764v5","comments":1,"layout":"post","photos":[],"link":"","content":"

起因

最近一段时间群晖老是CPU和内存满载,桌面安装的套件自动停止
一开始我认为是迅雷NAS版的问题,可是重装几次问题依旧.

\n

排查

打开菜单-资源监控-任务管理器
发现虚拟机的CPU占用了80%,于是卸载虚拟机的套件.重启.
问题依旧.
继续查看任务管理器.
发现video station内存占用9G以上,回想起自己曾经安装过video station的刮削补丁.
于是,卸载补丁,重启
完美解决.

\n

总结

不要安装一些以为很有用的第三方补丁.
其实没什么用.
还会造成一些莫名其妙的问题.
NAS还是稳定为主,不折腾了.

\n","site":{"data":{}},"excerpt":"","more":"

起因

最近一段时间群晖老是CPU和内存满载,桌面安装的套件自动停止
一开始我认为是迅雷NAS版的问题,可是重装几次问题依旧.

\n

排查

打开菜单-资源监控-任务管理器
发现虚拟机的CPU占用了80%,于是卸载虚拟机的套件.重启.
问题依旧.
继续查看任务管理器.
发现video station内存占用9G以上,回想起自己曾经安装过video station的刮削补丁.
于是,卸载补丁,重启
完美解决.

\n

总结

不要安装一些以为很有用的第三方补丁.
其实没什么用.
还会造成一些莫名其妙的问题.
NAS还是稳定为主,不折腾了.

\n"},{"abbrlink":"63a51e75","cover":"https://blogcdn.asbid.cn/2023/06/06/1686013906.png","date":"2023-06-15T11:14:38.701Z","excerpt":"...","title":"群晖docker出现注册表无法访问的解决办法","updated":"2023-09-30T02:59:46.522Z","_content":"# 问题出现\n\n群晖docker升级到DSM7.2之后出现了新的问题,原本可以正常访问的群晖镜像仓库竟然无法访问了.\n原本启用注册表镜像URL就可以解决这个问题\n如今也无法使用这个解决方案了\n经过排查发现原来是因为docker仓库的域名被墙了.\n\n# 解决办法\n\n使用魔法.\n\n## 准备工作\n\n请参见 [`X-UI:支持多协议多用户的 xray 面板`](https://blog.asbid.cn/post/341.html)\n搭建一个代理服务,使用海外或者港台地区VPS\n\n## 开启群晖SSH\n\n![微信截图_20230606091022.png][1]\n\n## 使用SSH登录\n\n`ssh 用户名@群晖IP`登录\n例如\n\n```\nssh admin@192.168.31.100\n```\n\n输入密码,回车\n\n```\nsudo -i\n```\n\n输入密码,回车\n\n```\ndocker run -d \\\n--restart=always \\\n--privileged \\\n--network=host \\\n--name v2raya \\\n-v /volume2/docker/v2raya:/etc/v2raya \\ #此处/volume2/docker/v2raya为群晖目录改成自己的实际存放目录\nmzz2017/v2raya\n```\n\n使用docker部署v2ray\n部署成功就可以在docker的管理界面看到这个容器了.\n使用IP+端口2017登录web管理界面\n示例 192.168.31.100:2017\nsock代理端口为20170\nhttp代理端口为20171\n\n## 使用v2raya\n\n进入web管理界面点击创建\n填写代理资料\n![创建.png][2]\n填写完毕点击这里测试一下是否连通\n![photo_2023-06-06_09-22-32.jpg][3]\n![微信截图_20230606092047.png][4]\n![设置.png][5]\n设置完成后点击左上角的运行\n\n## 群晖设置\n\n打开控制面板-网络\n![群晖代理.png][6]\n保存即可\n\n\n[1]: https://blogcdn.asbid.cn/2023/06/06/1686013906.png\n[2]: https://blogcdn.asbid.cn/2023/06/06/1686014583.png\n[3]: https://blogcdn.asbid.cn/2023/06/06/1686014582.jpg\n[4]: https://blogcdn.asbid.cn/2023/06/06/1686014586.png\n[5]: https://blogcdn.asbid.cn/2023/06/06/1686014585.png\n[6]: https://blogcdn.asbid.cn/2023/06/06/1686015169.png\n","source":"_posts/群晖docker出现注册表无法访问的解决办法.md","raw":"---\nabbrlink: 63a51e75\ncategories:\n - - 分享\ncover: 'https://blogcdn.asbid.cn/2023/06/06/1686013906.png'\ndate: '2023-06-15T19:14:38.701492+08:00'\nexcerpt: ...\ntags:\n - 群晖\n - docker\ntitle: 群晖docker出现注册表无法访问的解决办法\nupdated: '2023-6-15T19:17:37.714+8:0'\n---\n# 问题出现\n\n群晖docker升级到DSM7.2之后出现了新的问题,原本可以正常访问的群晖镜像仓库竟然无法访问了.\n原本启用注册表镜像URL就可以解决这个问题\n如今也无法使用这个解决方案了\n经过排查发现原来是因为docker仓库的域名被墙了.\n\n# 解决办法\n\n使用魔法.\n\n## 准备工作\n\n请参见 [`X-UI:支持多协议多用户的 xray 面板`](https://blog.asbid.cn/post/341.html)\n搭建一个代理服务,使用海外或者港台地区VPS\n\n## 开启群晖SSH\n\n![微信截图_20230606091022.png][1]\n\n## 使用SSH登录\n\n`ssh 用户名@群晖IP`登录\n例如\n\n```\nssh admin@192.168.31.100\n```\n\n输入密码,回车\n\n```\nsudo -i\n```\n\n输入密码,回车\n\n```\ndocker run -d \\\n--restart=always \\\n--privileged \\\n--network=host \\\n--name v2raya \\\n-v /volume2/docker/v2raya:/etc/v2raya \\ #此处/volume2/docker/v2raya为群晖目录改成自己的实际存放目录\nmzz2017/v2raya\n```\n\n使用docker部署v2ray\n部署成功就可以在docker的管理界面看到这个容器了.\n使用IP+端口2017登录web管理界面\n示例 192.168.31.100:2017\nsock代理端口为20170\nhttp代理端口为20171\n\n## 使用v2raya\n\n进入web管理界面点击创建\n填写代理资料\n![创建.png][2]\n填写完毕点击这里测试一下是否连通\n![photo_2023-06-06_09-22-32.jpg][3]\n![微信截图_20230606092047.png][4]\n![设置.png][5]\n设置完成后点击左上角的运行\n\n## 群晖设置\n\n打开控制面板-网络\n![群晖代理.png][6]\n保存即可\n\n\n[1]: https://blogcdn.asbid.cn/2023/06/06/1686013906.png\n[2]: https://blogcdn.asbid.cn/2023/06/06/1686014583.png\n[3]: https://blogcdn.asbid.cn/2023/06/06/1686014582.jpg\n[4]: https://blogcdn.asbid.cn/2023/06/06/1686014586.png\n[5]: https://blogcdn.asbid.cn/2023/06/06/1686014585.png\n[6]: https://blogcdn.asbid.cn/2023/06/06/1686015169.png\n","slug":"群晖docker出现注册表无法访问的解决办法","published":1,"_id":"cln4obyhj00fvoko07p789xfu","comments":1,"layout":"post","photos":[],"link":"","content":"

问题出现

群晖docker升级到DSM7.2之后出现了新的问题,原本可以正常访问的群晖镜像仓库竟然无法访问了.
原本启用注册表镜像URL就可以解决这个问题
如今也无法使用这个解决方案了
经过排查发现原来是因为docker仓库的域名被墙了.

\n

解决办法

使用魔法.

\n

准备工作

请参见 X-UI:支持多协议多用户的 xray 面板
搭建一个代理服务,使用海外或者港台地区VPS

\n

开启群晖SSH

\"微信截图_20230606091022.png\"

\n

使用SSH登录

ssh 用户名@群晖IP登录
例如

\n
1
ssh admin@192.168.31.100
\n\n

输入密码,回车

\n
1
sudo -i
\n\n

输入密码,回车

\n
1
2
3
4
5
6
7
docker run -d \\
--restart=always \\
--privileged \\
--network=host \\
--name v2raya \\
-v /volume2/docker/v2raya:/etc/v2raya \\ #此处/volume2/docker/v2raya为群晖目录改成自己的实际存放目录
mzz2017/v2raya
\n\n

使用docker部署v2ray
部署成功就可以在docker的管理界面看到这个容器了.
使用IP+端口2017登录web管理界面
示例 192.168.31.100:2017
sock代理端口为20170
http代理端口为20171

\n

使用v2raya

进入web管理界面点击创建
填写代理资料
\"创建.png\"
填写完毕点击这里测试一下是否连通
\"photo_2023-06-06_09-22-32.jpg\"
\"微信截图_20230606092047.png\"
\"设置.png\"
设置完成后点击左上角的运行

\n

群晖设置

打开控制面板-网络
\"群晖代理.png\"
保存即可

\n","site":{"data":{}},"more":"

问题出现

群晖docker升级到DSM7.2之后出现了新的问题,原本可以正常访问的群晖镜像仓库竟然无法访问了.
原本启用注册表镜像URL就可以解决这个问题
如今也无法使用这个解决方案了
经过排查发现原来是因为docker仓库的域名被墙了.

\n

解决办法

使用魔法.

\n

准备工作

请参见 X-UI:支持多协议多用户的 xray 面板
搭建一个代理服务,使用海外或者港台地区VPS

\n

开启群晖SSH

\"微信截图_20230606091022.png\"

\n

使用SSH登录

ssh 用户名@群晖IP登录
例如

\n
1
ssh admin@192.168.31.100
\n\n

输入密码,回车

\n
1
sudo -i
\n\n

输入密码,回车

\n
1
2
3
4
5
6
7
docker run -d \\
--restart=always \\
--privileged \\
--network=host \\
--name v2raya \\
-v /volume2/docker/v2raya:/etc/v2raya \\ #此处/volume2/docker/v2raya为群晖目录改成自己的实际存放目录
mzz2017/v2raya
\n\n

使用docker部署v2ray
部署成功就可以在docker的管理界面看到这个容器了.
使用IP+端口2017登录web管理界面
示例 192.168.31.100:2017
sock代理端口为20170
http代理端口为20171

\n

使用v2raya

进入web管理界面点击创建
填写代理资料
\"创建.png\"
填写完毕点击这里测试一下是否连通
\"photo_2023-06-06_09-22-32.jpg\"
\"微信截图_20230606092047.png\"
\"设置.png\"
设置完成后点击左上角的运行

\n

群晖设置

打开控制面板-网络
\"群晖代理.png\"
保存即可

\n"},{"title":"荒唐 文,古龙","excerpt":"","abbrlink":5587,"date":"2017-01-27T16:50:21.000Z","_content":"\n荒唐 \n\n(文:古龙)\n\n --给愚蠢的我及聪明的狐\n\n\n我遇见的事远比最荒唐的梦更为离奇, \n\n有风的晚上我在无风的地方遇着了你;\n\n你烟般氤氲著的影子在窗上散而又聚, \n\n淡淡的月光穿透了你重重的宫绡罗衣。\n\n从此书斋外再不闻我夜半的朗朗书声, \n\n有的只是我和你的轻嗔浅笑低吟细语;\n\n一年后你忽然问我为何总是烂醉如泥, \n\n我笑了笑只因我没有向你诉说的勇气。\n\n我梦想你能有诛奸的剑供我任意挥舞, \n\n我渴望海一般的智慧和山一般的财富;\n\n日日夜夜我只望你能赐我权势和幸福, \n \n只因为那荒唐的聊斋故事我早已听熟。\n\n\n我竟忘了你的爱情便是我最大的幸福, \n\n也忘了没有爱情时我的寂寞萧索愁苦;\n\n有一日你笑著抛给我一枚如意的指环, \n\n告诉我它可为我带来我梦中企求之物。\n\n我狂喜着试验它是否真的有那般魔力, \n\n你却已冷笑着在银雾中袅娜随风逝去;\n\n于是我得到了智慧与财富却失去了你, \n\n于是我夜夜只有对着孤独的影子低泣。\n\n昨夜雨声里我又自梦见你的梦中醒来, \n\n我梦见你乘著朵多采的云霞羽衣飘逸;\n\n但是你只冷冷望我一眼便又乘云而去, \n\n我只有更恨自己不知对爱情多加珍惜。","source":"_posts/荒唐-文,古龙.md","raw":"---\ntitle: 荒唐 文,古龙\ntags:\n - 古龙\n - 生活\n - 荒唐\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 5587\ndate: 2017-01-28 00:50:21\n---\n\n荒唐 \n\n(文:古龙)\n\n --给愚蠢的我及聪明的狐\n\n\n我遇见的事远比最荒唐的梦更为离奇, \n\n有风的晚上我在无风的地方遇着了你;\n\n你烟般氤氲著的影子在窗上散而又聚, \n\n淡淡的月光穿透了你重重的宫绡罗衣。\n\n从此书斋外再不闻我夜半的朗朗书声, \n\n有的只是我和你的轻嗔浅笑低吟细语;\n\n一年后你忽然问我为何总是烂醉如泥, \n\n我笑了笑只因我没有向你诉说的勇气。\n\n我梦想你能有诛奸的剑供我任意挥舞, \n\n我渴望海一般的智慧和山一般的财富;\n\n日日夜夜我只望你能赐我权势和幸福, \n \n只因为那荒唐的聊斋故事我早已听熟。\n\n\n我竟忘了你的爱情便是我最大的幸福, \n\n也忘了没有爱情时我的寂寞萧索愁苦;\n\n有一日你笑著抛给我一枚如意的指环, \n\n告诉我它可为我带来我梦中企求之物。\n\n我狂喜着试验它是否真的有那般魔力, \n\n你却已冷笑着在银雾中袅娜随风逝去;\n\n于是我得到了智慧与财富却失去了你, \n\n于是我夜夜只有对着孤独的影子低泣。\n\n昨夜雨声里我又自梦见你的梦中醒来, \n\n我梦见你乘著朵多采的云霞羽衣飘逸;\n\n但是你只冷冷望我一眼便又乘云而去, \n\n我只有更恨自己不知对爱情多加珍惜。","slug":"荒唐-文,古龙","published":1,"updated":"2023-09-30T02:59:46.523Z","_id":"cln4obyhk00fyoko08mj1164d","comments":1,"layout":"post","photos":[],"link":"","content":"

荒唐

\n

(文:古龙)

\n

--给愚蠢的我及聪明的狐

\n

我遇见的事远比最荒唐的梦更为离奇,

\n

有风的晚上我在无风的地方遇着了你;

\n

你烟般氤氲著的影子在窗上散而又聚,

\n

淡淡的月光穿透了你重重的宫绡罗衣。

\n

从此书斋外再不闻我夜半的朗朗书声,

\n

有的只是我和你的轻嗔浅笑低吟细语;

\n

一年后你忽然问我为何总是烂醉如泥,

\n

我笑了笑只因我没有向你诉说的勇气。

\n

我梦想你能有诛奸的剑供我任意挥舞,

\n

我渴望海一般的智慧和山一般的财富;

\n

日日夜夜我只望你能赐我权势和幸福,

\n

只因为那荒唐的聊斋故事我早已听熟。

\n

我竟忘了你的爱情便是我最大的幸福,

\n

也忘了没有爱情时我的寂寞萧索愁苦;

\n

有一日你笑著抛给我一枚如意的指环,

\n

告诉我它可为我带来我梦中企求之物。

\n

我狂喜着试验它是否真的有那般魔力,

\n

你却已冷笑着在银雾中袅娜随风逝去;

\n

于是我得到了智慧与财富却失去了你,

\n

于是我夜夜只有对着孤独的影子低泣。

\n

昨夜雨声里我又自梦见你的梦中醒来,

\n

我梦见你乘著朵多采的云霞羽衣飘逸;

\n

但是你只冷冷望我一眼便又乘云而去,

\n

我只有更恨自己不知对爱情多加珍惜。

\n","site":{"data":{}},"more":"

荒唐

\n

(文:古龙)

\n

--给愚蠢的我及聪明的狐

\n

我遇见的事远比最荒唐的梦更为离奇,

\n

有风的晚上我在无风的地方遇着了你;

\n

你烟般氤氲著的影子在窗上散而又聚,

\n

淡淡的月光穿透了你重重的宫绡罗衣。

\n

从此书斋外再不闻我夜半的朗朗书声,

\n

有的只是我和你的轻嗔浅笑低吟细语;

\n

一年后你忽然问我为何总是烂醉如泥,

\n

我笑了笑只因我没有向你诉说的勇气。

\n

我梦想你能有诛奸的剑供我任意挥舞,

\n

我渴望海一般的智慧和山一般的财富;

\n

日日夜夜我只望你能赐我权势和幸福,

\n

只因为那荒唐的聊斋故事我早已听熟。

\n

我竟忘了你的爱情便是我最大的幸福,

\n

也忘了没有爱情时我的寂寞萧索愁苦;

\n

有一日你笑著抛给我一枚如意的指环,

\n

告诉我它可为我带来我梦中企求之物。

\n

我狂喜着试验它是否真的有那般魔力,

\n

你却已冷笑着在银雾中袅娜随风逝去;

\n

于是我得到了智慧与财富却失去了你,

\n

于是我夜夜只有对着孤独的影子低泣。

\n

昨夜雨声里我又自梦见你的梦中醒来,

\n

我梦见你乘著朵多采的云霞羽衣飘逸;

\n

但是你只冷冷望我一眼便又乘云而去,

\n

我只有更恨自己不知对爱情多加珍惜。

\n"},{"title":"老子与太上老君","excerpt":"","abbrlink":27137,"date":"2011-09-02T05:36:18.000Z","_content":"\n> 历史中的老子,姓李名耳字聃,又字伯阳,春秋时楚国苦县人。曾任周朝守藏室之史。主无为之说,后世以为道家始祖。孔子尝往问礼,著有《道德经》五千余言。现今社会各行业中,如:铁匠、煤窑匠、碗筷匠、磨刀匠、蹄铁匠等,皆祭拜老子为祖师爷。亦称 为伯阳、太上老君、老聃、老君、老子、老子道君、李伯阳、李老君。\n\n以上百度百科。 > 神话中的太上老君,全称“一气化三清太清居火赤天仙登太清境 玄气所成日神宝君道德天尊混元上帝”,简称“老君”。道教天神,传说中的道教教主,为三清之第三位。又称“道德天尊”、“混元老君”、“降生天尊”、“太清大帝”等。三清为玉清元始天尊、上清灵宝天尊、太清道德天尊。 在道教宫观“三清殿”,其塑像居左位,手执蒲扇。相传老君居住在太清圣境。《西游记》中,老君居“离恨天兜率宫”;《封神榜》中,则是“大罗天玄都洞八景宫”。\n\n以上依旧是无所不知的百度百科。 封神演义中曾说,盘古开天之后一缕精气所化为老子,元始天尊,通天教主。 老子主人教,元始掌阐教,通天握截教。 三教教主为应杀劫,共同制定封神榜。 凡封神榜上有姓名者皆封神拜将在天庭为官,受天规束缚。 太上老君为人教教主之尊怎可能在天庭供职。 而且为什么他法力差劲的连孙悟空都制服不了。 我严重怀疑这老头在隐藏实力。 可为什么呢?","source":"_posts/老子与太上老君.md","raw":"---\ntitle: 老子与太上老君\ntags:\n - 太上老君\n - 封神演义\n - 笔记\n - 老子\n - 西游记\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 27137\ndate: 2011-09-02 13:36:18\n---\n\n> 历史中的老子,姓李名耳字聃,又字伯阳,春秋时楚国苦县人。曾任周朝守藏室之史。主无为之说,后世以为道家始祖。孔子尝往问礼,著有《道德经》五千余言。现今社会各行业中,如:铁匠、煤窑匠、碗筷匠、磨刀匠、蹄铁匠等,皆祭拜老子为祖师爷。亦称 为伯阳、太上老君、老聃、老君、老子、老子道君、李伯阳、李老君。\n\n以上百度百科。 > 神话中的太上老君,全称“一气化三清太清居火赤天仙登太清境 玄气所成日神宝君道德天尊混元上帝”,简称“老君”。道教天神,传说中的道教教主,为三清之第三位。又称“道德天尊”、“混元老君”、“降生天尊”、“太清大帝”等。三清为玉清元始天尊、上清灵宝天尊、太清道德天尊。 在道教宫观“三清殿”,其塑像居左位,手执蒲扇。相传老君居住在太清圣境。《西游记》中,老君居“离恨天兜率宫”;《封神榜》中,则是“大罗天玄都洞八景宫”。\n\n以上依旧是无所不知的百度百科。 封神演义中曾说,盘古开天之后一缕精气所化为老子,元始天尊,通天教主。 老子主人教,元始掌阐教,通天握截教。 三教教主为应杀劫,共同制定封神榜。 凡封神榜上有姓名者皆封神拜将在天庭为官,受天规束缚。 太上老君为人教教主之尊怎可能在天庭供职。 而且为什么他法力差劲的连孙悟空都制服不了。 我严重怀疑这老头在隐藏实力。 可为什么呢?","slug":"老子与太上老君","published":1,"updated":"2023-09-30T02:59:46.523Z","_id":"cln4obyhl00g2oko0effdh6o6","comments":1,"layout":"post","photos":[],"link":"","content":"
\n

历史中的老子,姓李名耳字聃,又字伯阳,春秋时楚国苦县人。曾任周朝守藏室之史。主无为之说,后世以为道家始祖。孔子尝往问礼,著有《道德经》五千余言。现今社会各行业中,如:铁匠、煤窑匠、碗筷匠、磨刀匠、蹄铁匠等,皆祭拜老子为祖师爷。亦称 为伯阳、太上老君、老聃、老君、老子、老子道君、李伯阳、李老君。

\n
\n

以上百度百科。 > 神话中的太上老君,全称“一气化三清太清居火赤天仙登太清境 玄气所成日神宝君道德天尊混元上帝”,简称“老君”。道教天神,传说中的道教教主,为三清之第三位。又称“道德天尊”、“混元老君”、“降生天尊”、“太清大帝”等。三清为玉清元始天尊、上清灵宝天尊、太清道德天尊。 在道教宫观“三清殿”,其塑像居左位,手执蒲扇。相传老君居住在太清圣境。《西游记》中,老君居“离恨天兜率宫”;《封神榜》中,则是“大罗天玄都洞八景宫”。

\n

以上依旧是无所不知的百度百科。 封神演义中曾说,盘古开天之后一缕精气所化为老子,元始天尊,通天教主。 老子主人教,元始掌阐教,通天握截教。 三教教主为应杀劫,共同制定封神榜。 凡封神榜上有姓名者皆封神拜将在天庭为官,受天规束缚。 太上老君为人教教主之尊怎可能在天庭供职。 而且为什么他法力差劲的连孙悟空都制服不了。 我严重怀疑这老头在隐藏实力。 可为什么呢?

\n","site":{"data":{}},"more":"
\n

历史中的老子,姓李名耳字聃,又字伯阳,春秋时楚国苦县人。曾任周朝守藏室之史。主无为之说,后世以为道家始祖。孔子尝往问礼,著有《道德经》五千余言。现今社会各行业中,如:铁匠、煤窑匠、碗筷匠、磨刀匠、蹄铁匠等,皆祭拜老子为祖师爷。亦称 为伯阳、太上老君、老聃、老君、老子、老子道君、李伯阳、李老君。

\n
\n

以上百度百科。 > 神话中的太上老君,全称“一气化三清太清居火赤天仙登太清境 玄气所成日神宝君道德天尊混元上帝”,简称“老君”。道教天神,传说中的道教教主,为三清之第三位。又称“道德天尊”、“混元老君”、“降生天尊”、“太清大帝”等。三清为玉清元始天尊、上清灵宝天尊、太清道德天尊。 在道教宫观“三清殿”,其塑像居左位,手执蒲扇。相传老君居住在太清圣境。《西游记》中,老君居“离恨天兜率宫”;《封神榜》中,则是“大罗天玄都洞八景宫”。

\n

以上依旧是无所不知的百度百科。 封神演义中曾说,盘古开天之后一缕精气所化为老子,元始天尊,通天教主。 老子主人教,元始掌阐教,通天握截教。 三教教主为应杀劫,共同制定封神榜。 凡封神榜上有姓名者皆封神拜将在天庭为官,受天规束缚。 太上老君为人教教主之尊怎可能在天庭供职。 而且为什么他法力差劲的连孙悟空都制服不了。 我严重怀疑这老头在隐藏实力。 可为什么呢?

\n"},{"title":"西游记中的谜","excerpt":"","abbrlink":19164,"date":"2011-08-18T14:43:25.000Z","_content":"\n新版西游记已经开播,只看两集就觉得被雷到了。 \n\n最近在看西游记的吴本小说。 \n\n有些很奇妙的地方始终没能在书中找到答案。 \n\n一、水帘洞的来历、我感觉水帘洞不可能只是一个单纯的洞府。\n\n为何进去之后有石碗石椅石凳石瓢,还有:花果山福地,水帘洞洞天的对联。 \n\n二、须菩提祖师的来历。\n\n整部书中最深不可测的不是如来不是元始天尊不是老子,而是这位须菩提祖师。\n\n这位祖师能谈道论禅。\n\n连漫天星宿都无法战胜的齐天大圣孙悟空也不过只是在其门下修行了近十余年而已。 \n\n\n三、孙悟空的辈分是菩提祖师给的。\n\n为何猪八戒沙僧的辈分都是悟字辈呢。\n\n如果说唐僧是如来的弟子,悟空是唐僧的弟子。 \n\n那须菩提祖师又是谁呢。\n\n极有可能就是西方圣人之一的准提道人","source":"_posts/西游记中的谜.md","raw":"---\ntitle: 西游记中的谜\ntags:\n - 笔记\n - 西游记\n - 谜\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 19164\ndate: 2011-08-18 22:43:25\n---\n\n新版西游记已经开播,只看两集就觉得被雷到了。 \n\n最近在看西游记的吴本小说。 \n\n有些很奇妙的地方始终没能在书中找到答案。 \n\n一、水帘洞的来历、我感觉水帘洞不可能只是一个单纯的洞府。\n\n为何进去之后有石碗石椅石凳石瓢,还有:花果山福地,水帘洞洞天的对联。 \n\n二、须菩提祖师的来历。\n\n整部书中最深不可测的不是如来不是元始天尊不是老子,而是这位须菩提祖师。\n\n这位祖师能谈道论禅。\n\n连漫天星宿都无法战胜的齐天大圣孙悟空也不过只是在其门下修行了近十余年而已。 \n\n\n三、孙悟空的辈分是菩提祖师给的。\n\n为何猪八戒沙僧的辈分都是悟字辈呢。\n\n如果说唐僧是如来的弟子,悟空是唐僧的弟子。 \n\n那须菩提祖师又是谁呢。\n\n极有可能就是西方圣人之一的准提道人","slug":"西游记中的谜","published":1,"updated":"2023-09-30T02:59:46.523Z","_id":"cln4obyhl00g5oko09tei1t3o","comments":1,"layout":"post","photos":[],"link":"","content":"

新版西游记已经开播,只看两集就觉得被雷到了。

\n

最近在看西游记的吴本小说。

\n

有些很奇妙的地方始终没能在书中找到答案。

\n

一、水帘洞的来历、我感觉水帘洞不可能只是一个单纯的洞府。

\n

为何进去之后有石碗石椅石凳石瓢,还有:花果山福地,水帘洞洞天的对联。

\n

二、须菩提祖师的来历。

\n

整部书中最深不可测的不是如来不是元始天尊不是老子,而是这位须菩提祖师。

\n

这位祖师能谈道论禅。

\n

连漫天星宿都无法战胜的齐天大圣孙悟空也不过只是在其门下修行了近十余年而已。

\n

三、孙悟空的辈分是菩提祖师给的。

\n

为何猪八戒沙僧的辈分都是悟字辈呢。

\n

如果说唐僧是如来的弟子,悟空是唐僧的弟子。

\n

那须菩提祖师又是谁呢。

\n

极有可能就是西方圣人之一的准提道人

\n","site":{"data":{}},"more":"

新版西游记已经开播,只看两集就觉得被雷到了。

\n

最近在看西游记的吴本小说。

\n

有些很奇妙的地方始终没能在书中找到答案。

\n

一、水帘洞的来历、我感觉水帘洞不可能只是一个单纯的洞府。

\n

为何进去之后有石碗石椅石凳石瓢,还有:花果山福地,水帘洞洞天的对联。

\n

二、须菩提祖师的来历。

\n

整部书中最深不可测的不是如来不是元始天尊不是老子,而是这位须菩提祖师。

\n

这位祖师能谈道论禅。

\n

连漫天星宿都无法战胜的齐天大圣孙悟空也不过只是在其门下修行了近十余年而已。

\n

三、孙悟空的辈分是菩提祖师给的。

\n

为何猪八戒沙僧的辈分都是悟字辈呢。

\n

如果说唐僧是如来的弟子,悟空是唐僧的弟子。

\n

那须菩提祖师又是谁呢。

\n

极有可能就是西方圣人之一的准提道人

\n"},{"title":"记在8月","excerpt":"","abbrlink":54391,"date":"2011-08-31T05:26:32.000Z","_content":"\n我想说的是 春困夏乏秋无力,冬日正好眠。","source":"_posts/记在8月.md","raw":"---\ntitle: 记在8月\ntags:\n - 心情\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 54391\ndate: 2011-08-31 13:26:32\n---\n\n我想说的是 春困夏乏秋无力,冬日正好眠。","slug":"记在8月","published":1,"updated":"2023-09-30T02:59:46.523Z","_id":"cln4obyhm00g9oko08z1r71at","comments":1,"layout":"post","photos":[],"link":"","content":"

我想说的是 春困夏乏秋无力,冬日正好眠。

\n","site":{"data":{}},"more":"

我想说的是 春困夏乏秋无力,冬日正好眠。

\n"},{"title":"论坛社交的没落,终究是败给了时代","excerpt":"","abbrlink":15245,"date":"2017-04-17T11:23:09.000Z","_content":"\n时代永远属于先进者,新兴社交网络无可厚非是当今时代的宠儿。传统BBS社区的没落除了自身的缺陷和堕落,更多是输给了时代。曾经火爆一时的西祠、天涯、猫扑等传统论坛社区,是互联网的风向标,是新闻记者的新闻源,是网友的关注点,在这里也产生了大量互联网热门词语和段子,风头势如破竹。 传统论坛现衰落之气 事实上,时代在变,产品也在更新换代,企业或网站就像人的生命一样,皆有定数。就像诺基亚手机,我们不能说他变差了,而是时代变了,这就是它的定数。博客、论坛作为老一代的社交平台,已经显示出其衰落之气。 新兴社交软件的出现 还记得曾经火爆网络的猫扑网么,还记得风靡一时的西祠胡同么?还记得曾每天必上的天涯论坛么?当然,纵使它们的没落有自身的原因,但很大程度上是因为新形态产品的替代,比如以微博、微信为代表的移动社交网络,不仅改变了传统的互联网社交形态,而且对各行各业产生了不小的影响,而移动端产品大肆流行又抢走了PC端产品的用户。 移动互联时代的来临 究竟是一股什么势力,把国内这些大型传统BBS社区逼上绝路了呢? 短短几年,大屏手机的兴起,移动互联网的到来,诞生了以微信、微博为主的新兴社交平台的出现。现在用手机可以做一切你能够想到的事情,只要有一部智能手机,几乎可以足不出户地操控着日常生活的方方面面。手机显然成了生活中不可或缺的一部分,在社交方面,可以随时随地的分享自己的感受,随时随地的和朋友互动。随着移动互联网给大众带来的便利,改变了大众的阅读习惯,标志着信息碎片化时代的到来。再看传统BBS的长篇大论,显然是与时代脉络不在一个节奏上。于是移动社交成为当下最流行的网络社交形态,给传统BBS带来致命打击。在被微博、微信等新社交平台的夹击下,用户群体被分解得四零八落。 每个产品的发展都跟它所在的环境和时代有关系。猫扑、天涯的衰落是必然的。新模式革命旧模式是自然规律,虽然我们不舍,但在互联网的进化过程里却是无法避免的。","source":"_posts/论坛社交的没落,终究是败给了时代.md","raw":"---\ntitle: 论坛社交的没落,终究是败给了时代\ntags:\n - 生活\n - 社交\n - 论坛\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 15245\ndate: 2017-04-17 19:23:09\n---\n\n时代永远属于先进者,新兴社交网络无可厚非是当今时代的宠儿。传统BBS社区的没落除了自身的缺陷和堕落,更多是输给了时代。曾经火爆一时的西祠、天涯、猫扑等传统论坛社区,是互联网的风向标,是新闻记者的新闻源,是网友的关注点,在这里也产生了大量互联网热门词语和段子,风头势如破竹。 传统论坛现衰落之气 事实上,时代在变,产品也在更新换代,企业或网站就像人的生命一样,皆有定数。就像诺基亚手机,我们不能说他变差了,而是时代变了,这就是它的定数。博客、论坛作为老一代的社交平台,已经显示出其衰落之气。 新兴社交软件的出现 还记得曾经火爆网络的猫扑网么,还记得风靡一时的西祠胡同么?还记得曾每天必上的天涯论坛么?当然,纵使它们的没落有自身的原因,但很大程度上是因为新形态产品的替代,比如以微博、微信为代表的移动社交网络,不仅改变了传统的互联网社交形态,而且对各行各业产生了不小的影响,而移动端产品大肆流行又抢走了PC端产品的用户。 移动互联时代的来临 究竟是一股什么势力,把国内这些大型传统BBS社区逼上绝路了呢? 短短几年,大屏手机的兴起,移动互联网的到来,诞生了以微信、微博为主的新兴社交平台的出现。现在用手机可以做一切你能够想到的事情,只要有一部智能手机,几乎可以足不出户地操控着日常生活的方方面面。手机显然成了生活中不可或缺的一部分,在社交方面,可以随时随地的分享自己的感受,随时随地的和朋友互动。随着移动互联网给大众带来的便利,改变了大众的阅读习惯,标志着信息碎片化时代的到来。再看传统BBS的长篇大论,显然是与时代脉络不在一个节奏上。于是移动社交成为当下最流行的网络社交形态,给传统BBS带来致命打击。在被微博、微信等新社交平台的夹击下,用户群体被分解得四零八落。 每个产品的发展都跟它所在的环境和时代有关系。猫扑、天涯的衰落是必然的。新模式革命旧模式是自然规律,虽然我们不舍,但在互联网的进化过程里却是无法避免的。","slug":"论坛社交的没落,终究是败给了时代","published":1,"updated":"2023-09-30T02:59:46.523Z","_id":"cln4obyhm00gcoko081xv48y9","comments":1,"layout":"post","photos":[],"link":"","content":"

时代永远属于先进者,新兴社交网络无可厚非是当今时代的宠儿。传统BBS社区的没落除了自身的缺陷和堕落,更多是输给了时代。曾经火爆一时的西祠、天涯、猫扑等传统论坛社区,是互联网的风向标,是新闻记者的新闻源,是网友的关注点,在这里也产生了大量互联网热门词语和段子,风头势如破竹。 传统论坛现衰落之气 事实上,时代在变,产品也在更新换代,企业或网站就像人的生命一样,皆有定数。就像诺基亚手机,我们不能说他变差了,而是时代变了,这就是它的定数。博客、论坛作为老一代的社交平台,已经显示出其衰落之气。 新兴社交软件的出现 还记得曾经火爆网络的猫扑网么,还记得风靡一时的西祠胡同么?还记得曾每天必上的天涯论坛么?当然,纵使它们的没落有自身的原因,但很大程度上是因为新形态产品的替代,比如以微博、微信为代表的移动社交网络,不仅改变了传统的互联网社交形态,而且对各行各业产生了不小的影响,而移动端产品大肆流行又抢走了PC端产品的用户。 移动互联时代的来临 究竟是一股什么势力,把国内这些大型传统BBS社区逼上绝路了呢? 短短几年,大屏手机的兴起,移动互联网的到来,诞生了以微信、微博为主的新兴社交平台的出现。现在用手机可以做一切你能够想到的事情,只要有一部智能手机,几乎可以足不出户地操控着日常生活的方方面面。手机显然成了生活中不可或缺的一部分,在社交方面,可以随时随地的分享自己的感受,随时随地的和朋友互动。随着移动互联网给大众带来的便利,改变了大众的阅读习惯,标志着信息碎片化时代的到来。再看传统BBS的长篇大论,显然是与时代脉络不在一个节奏上。于是移动社交成为当下最流行的网络社交形态,给传统BBS带来致命打击。在被微博、微信等新社交平台的夹击下,用户群体被分解得四零八落。 每个产品的发展都跟它所在的环境和时代有关系。猫扑、天涯的衰落是必然的。新模式革命旧模式是自然规律,虽然我们不舍,但在互联网的进化过程里却是无法避免的。

\n","site":{"data":{}},"more":"

时代永远属于先进者,新兴社交网络无可厚非是当今时代的宠儿。传统BBS社区的没落除了自身的缺陷和堕落,更多是输给了时代。曾经火爆一时的西祠、天涯、猫扑等传统论坛社区,是互联网的风向标,是新闻记者的新闻源,是网友的关注点,在这里也产生了大量互联网热门词语和段子,风头势如破竹。 传统论坛现衰落之气 事实上,时代在变,产品也在更新换代,企业或网站就像人的生命一样,皆有定数。就像诺基亚手机,我们不能说他变差了,而是时代变了,这就是它的定数。博客、论坛作为老一代的社交平台,已经显示出其衰落之气。 新兴社交软件的出现 还记得曾经火爆网络的猫扑网么,还记得风靡一时的西祠胡同么?还记得曾每天必上的天涯论坛么?当然,纵使它们的没落有自身的原因,但很大程度上是因为新形态产品的替代,比如以微博、微信为代表的移动社交网络,不仅改变了传统的互联网社交形态,而且对各行各业产生了不小的影响,而移动端产品大肆流行又抢走了PC端产品的用户。 移动互联时代的来临 究竟是一股什么势力,把国内这些大型传统BBS社区逼上绝路了呢? 短短几年,大屏手机的兴起,移动互联网的到来,诞生了以微信、微博为主的新兴社交平台的出现。现在用手机可以做一切你能够想到的事情,只要有一部智能手机,几乎可以足不出户地操控着日常生活的方方面面。手机显然成了生活中不可或缺的一部分,在社交方面,可以随时随地的分享自己的感受,随时随地的和朋友互动。随着移动互联网给大众带来的便利,改变了大众的阅读习惯,标志着信息碎片化时代的到来。再看传统BBS的长篇大论,显然是与时代脉络不在一个节奏上。于是移动社交成为当下最流行的网络社交形态,给传统BBS带来致命打击。在被微博、微信等新社交平台的夹击下,用户群体被分解得四零八落。 每个产品的发展都跟它所在的环境和时代有关系。猫扑、天涯的衰落是必然的。新模式革命旧模式是自然规律,虽然我们不舍,但在互联网的进化过程里却是无法避免的。

\n"},{"title":"还有两天就过完2016","excerpt":"","abbrlink":62032,"date":"2016-12-29T14:35:23.000Z","_content":"\n值此辞旧迎新之际,祝大家。。。 鸡年大吉吧。\n![](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)\n\n 照片拍摄自珠海大道。","source":"_posts/还有两天就过完2016.md","raw":"---\ntitle: 还有两天就过完2016\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 62032\ndate: 2016-12-29 22:35:23\n---\n\n值此辞旧迎新之际,祝大家。。。 鸡年大吉吧。\n![](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)\n\n 照片拍摄自珠海大道。","slug":"还有两天就过完2016","published":1,"updated":"2023-09-30T02:59:46.524Z","_id":"cln4obyhn00gfoko05tafeumv","comments":1,"layout":"post","photos":[],"link":"","content":"

值此辞旧迎新之际,祝大家。。。 鸡年大吉吧。
](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)

\n

照片拍摄自珠海大道。

\n","site":{"data":{}},"more":"

值此辞旧迎新之际,祝大家。。。 鸡年大吉吧。
](https://www.wen.st/wp-content/uploads/2016/12/wp-image-460721531jpg.jpg)

\n

照片拍摄自珠海大道。

\n"},{"title":"路下如烟","excerpt":"","abbrlink":49268,"date":"2018-08-07T05:04:33.000Z","_content":"(文.璟)\n\n“我会不逼你戒烟。“ \n\n”哦,为什么呢?“ \n\n”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“ \n\n金菁喜欢穿有帽子的衣服, 她觉得戴上帽子很有安全感。\n\n她在大学的时候不喜欢跟人说话,圈子很小,她熟稔一切能自己做的事情,比如画画,比如看书,比如打游戏,比如去学校附近的小酒吧安静的坐一夜。\n\n她最喜欢酒吧里一个总穿着帽衫,头发略长的瘦瘦的男生唱的歌,不像那些装蛋的摇滚,难听的嗓音在夜里爆炸出很多玻璃碎痕,让原本烦闷的人更烦闷。\n\n那个男生唱的歌总是温柔的老歌,或者日本动漫里的歌曲。\n\n金菁喜欢这两种风格,一种治愈她,一种填满她。 \n\n有天夜里,帽衫男生下班,背着吉他走出酒吧。\n\n金菁戴上帽子跟着他,帽衫男生点了一根烟,金菁也点了一根烟。\n\n男生走进了金菁的大学,金菁也跟他走进去。\n\n帽衫男生回过头来看着她,她也直视着男生。\n\n帽衫男生站在月亮的阴影下,他说:我认识你。我叫戴笠。 \n\n戴笠说他很久就前就注意到金菁了,总在他演唱的时候坐在最远的卡座上。\n\n戴笠说他不是这个大学的,他只是有个好朋友在这里上学,他来这个城市混日子,住在他宿舍里。 \n\n戴笠说有一次看到金菁穿着樱木花道的印花T恤,他就唱了一首《灌篮高手》的主题曲。\n\n戴笠说秋天看到金菁穿一件印着寒冰射手的帽衫,他的心怦然一跳。\n\n戴笠不怎么爱说话,在一起了一个月,金菁也只记住这些比较重要的。 \n\n金菁给戴笠买了很多帽衫,他俩经常手牵手去网吧双排。\n\n戴笠打的很好,尤其是坦克式英雄,金菁还有课业,打游戏的时间不多,戴笠每晚唱到两三点,就会去网吧通宵到早上,然后闷头睡一天。\n\n他俩相处的时间多是黑夜,路灯下每个小摊,金菁都知道他们的味道。\n\n戴笠唱歌需要嗓子,可他又极度依赖烟,唱的时间越来越短。金菁期末考试周时,戴笠得了咽炎。 \n\n金菁仿佛从那个时候开始,变成了贤妻良母。她不去泡图书馆,也不去参加集体活动,她偷偷买了小煮锅,给戴笠煮梨汤,省下钱去买化咽炎的药。\n\n戴笠没有了酒吧的工作,每天窝在男生寝室里打游戏,晚上出来跟金菁在操场散步,看着长腿的姑娘挽着挺拔的小伙。\n\n他俩在操场的尽头比赛似的抽烟,戴笠抽下金菁的烟,轻轻的亲吻她的嘴。 \n\n放了假的金菁回到老家,她在火车卧铺上就疯狂的想念戴笠。\n\n两个人在南北两地开着视频打rank,戴笠会用有些沙哑的嗓音给她唱歌,还会寄栗子糕给她。\n\n金菁开始留头发,开始每天在家里学煲粥和炖汤,她出门去买菜,喜欢萝卜刺眼的色彩。\n\n她买了所LOL里所有的情侣皮肤,她看到中路阿狸站在戴笠的蛮王身边,她会一撇嘴射出一道冰箭过去,暴击百分百。\n\n过完年了的某一天,戴笠截了一张最强王者的段位图给她,还有一张频道邀请主播函。\n\n金菁买了全套泳池皮肤送给他,事后想想好像戴笠只喜欢用里面的鳄鱼。 \n\n金菁回到广州上学,戴笠在机场用白色的大羽绒服裹住了她。\n\n她闻到浓浓的烟草味和CK香水味道,暖暖的从他的怀里渗出来。\n\n戴笠的咽炎还没好,他 嘶哑着嗓子说:\" 我真想你“。她陪着戴笠在机场吃了最后一顿饭,戴笠提着行李箱下午飞往苏州。 \n\n现在想来,金菁也不知道戴笠什么时候一举成名,变成职业选手都认识的玩家。\n\n他的直播成千上万的人看,他的名字也曾上过百度头条,金菁只是日复一日的过起曾经不言不语的日子,她在小吃摊前想着那个头发半长,却依旧很精神的戴笠。\n\n第一个月金菁飞去苏州找他,他跟几个主播一起合租,桌上有成堆的沙县小吃外卖盒,戴笠的屋里乱成一团。她每月都会尽力去苏州看他,帮他做些吃的,收拾房间。\n\n戴笠的胃在苏州也被搞坏了,睡眠又很差,金菁常常会彻夜一语不发陪着他做完直播 ,然后抱着像个孩子一样的他哄他睡去。 \n\n渐渐很多姑娘喜欢戴笠,很多人喜欢他的直播。\n\n金菁的那个暑假没有回家,她帮戴笠开了一个淘宝店,她则在苏州找了一个兼职,戴笠每天打直播,她则在线下忙着联系发货卖货。\n\n此时的戴笠剪了短发,精神洋溢的。\n\n戴笠偶尔带她直播双排,她只选辅助或者ADC,戴笠也随她走着下路。\n\n他的ADC太浪,辅助英雄一个也没有,常常下路崩的一拍两散。\n\n金菁总会嘻嘻嘻的笑,戴笠也无奈的摸摸她的头\n\n。戴笠给金菁买了一条薄荷爱喜。\n\n他说你不是喜欢艾希么。\n\n第二年戴笠又给金菁买了一条她最喜欢的萨摩,说起来,那大概是戴笠唯一送给她的礼物了。\n\n戴笠叫他”小j8,“,后来金菁改成了盖伦。 \n\n金菁总在戒烟,可好像总也戒不掉。\n\n她看着戴笠的时候想抽,看不到的时候也想抽。\n\n戴笠打野的时候她就想我怎么不是蓝爸爸,戴笠在上路被抓时她就想骂中路的卡牌为什么不飞大,戴笠中路越塔时她就想冲进去替他抗塔。\n\n戴笠的吉他一直仍在角落,她无聊的时候就去擦拭,她看到频道里对戴笠疯狂爱慕的女生她会轻蔑的笑。\n\n她把戴笠的头抱在怀里,她想这样安抚他一辈子。 \n\n后来的事情就没有后来了,戴笠参加过一次线下比赛后,彻底火了。\n\n他回到了老家安徽,买了专用的电脑和椅子,专职做起了主播。\n\n她慢慢的把自己的很多都放到了戴笠家里,情侣的睡衣,拖鞋,牙刷,提莫的玩偶,寒冰的手办,她的帽衫们……她回到广州准备毕业答辩,她抱着论文的心情就像抱着结婚证书一样激动。\n\n她知道的,差不多。\n\n她开始想戒烟了,但是她舍不得。\n\n她一直记得戴笠第一次夸她的那个场景。\n\n两人坐在学校附近的路边,一起抽着烟。 \n\n戴笠摸着她的头说:“我会不逼你戒烟。“\n\n”哦,为什么呢?“\n\n”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“\n \n还没得知答辩结果的金菁就飞到了芜湖见戴笠,那就是人生里最狗血的一幕,大中午的戴笠睡在被窝里——那很正常,里面还有一个女人——那不正常。 \n再后来,她就什么都不知道了。\n \n她开始清醒的时候,就是一条一条写着戴笠生活习惯的时候\n \n——他不能吃辣不能吃隔夜不能吃真空包装不能喝牛奶他有起床气他胃病很严重他的咽炎需要抑制他的亲昵很少……。\n \n她不敢想他站在那个女人面前维护他的样子。\n \n就像自己的辅助,站到了对面ADC的身边。\n \n如果那还是个机器人,她一把把你抓到了他们的防御塔下,折磨你,打死你。\n \n她打开自己的游戏记录,几乎都是与戴笠一起双排的,他是ADC,或者他是打野。\n\n她闭上眼,写道:戴笠不爱打下路,不要逼他。 \n\n走的那天,金菁哭着说:戴笠,我要好好努力,我要去拳头公司,我要让他们在上路也有双人组合,我不要上单自己一个人! \n\n金菁好像真的把烟戒了。","source":"_posts/路下如烟.md","raw":"---\ntitle: 路下如烟\ntags:\n - 生活\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 49268\ndate: 2018-08-07 13:04:33\n---\n(文.璟)\n\n“我会不逼你戒烟。“ \n\n”哦,为什么呢?“ \n\n”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“ \n\n金菁喜欢穿有帽子的衣服, 她觉得戴上帽子很有安全感。\n\n她在大学的时候不喜欢跟人说话,圈子很小,她熟稔一切能自己做的事情,比如画画,比如看书,比如打游戏,比如去学校附近的小酒吧安静的坐一夜。\n\n她最喜欢酒吧里一个总穿着帽衫,头发略长的瘦瘦的男生唱的歌,不像那些装蛋的摇滚,难听的嗓音在夜里爆炸出很多玻璃碎痕,让原本烦闷的人更烦闷。\n\n那个男生唱的歌总是温柔的老歌,或者日本动漫里的歌曲。\n\n金菁喜欢这两种风格,一种治愈她,一种填满她。 \n\n有天夜里,帽衫男生下班,背着吉他走出酒吧。\n\n金菁戴上帽子跟着他,帽衫男生点了一根烟,金菁也点了一根烟。\n\n男生走进了金菁的大学,金菁也跟他走进去。\n\n帽衫男生回过头来看着她,她也直视着男生。\n\n帽衫男生站在月亮的阴影下,他说:我认识你。我叫戴笠。 \n\n戴笠说他很久就前就注意到金菁了,总在他演唱的时候坐在最远的卡座上。\n\n戴笠说他不是这个大学的,他只是有个好朋友在这里上学,他来这个城市混日子,住在他宿舍里。 \n\n戴笠说有一次看到金菁穿着樱木花道的印花T恤,他就唱了一首《灌篮高手》的主题曲。\n\n戴笠说秋天看到金菁穿一件印着寒冰射手的帽衫,他的心怦然一跳。\n\n戴笠不怎么爱说话,在一起了一个月,金菁也只记住这些比较重要的。 \n\n金菁给戴笠买了很多帽衫,他俩经常手牵手去网吧双排。\n\n戴笠打的很好,尤其是坦克式英雄,金菁还有课业,打游戏的时间不多,戴笠每晚唱到两三点,就会去网吧通宵到早上,然后闷头睡一天。\n\n他俩相处的时间多是黑夜,路灯下每个小摊,金菁都知道他们的味道。\n\n戴笠唱歌需要嗓子,可他又极度依赖烟,唱的时间越来越短。金菁期末考试周时,戴笠得了咽炎。 \n\n金菁仿佛从那个时候开始,变成了贤妻良母。她不去泡图书馆,也不去参加集体活动,她偷偷买了小煮锅,给戴笠煮梨汤,省下钱去买化咽炎的药。\n\n戴笠没有了酒吧的工作,每天窝在男生寝室里打游戏,晚上出来跟金菁在操场散步,看着长腿的姑娘挽着挺拔的小伙。\n\n他俩在操场的尽头比赛似的抽烟,戴笠抽下金菁的烟,轻轻的亲吻她的嘴。 \n\n放了假的金菁回到老家,她在火车卧铺上就疯狂的想念戴笠。\n\n两个人在南北两地开着视频打rank,戴笠会用有些沙哑的嗓音给她唱歌,还会寄栗子糕给她。\n\n金菁开始留头发,开始每天在家里学煲粥和炖汤,她出门去买菜,喜欢萝卜刺眼的色彩。\n\n她买了所LOL里所有的情侣皮肤,她看到中路阿狸站在戴笠的蛮王身边,她会一撇嘴射出一道冰箭过去,暴击百分百。\n\n过完年了的某一天,戴笠截了一张最强王者的段位图给她,还有一张频道邀请主播函。\n\n金菁买了全套泳池皮肤送给他,事后想想好像戴笠只喜欢用里面的鳄鱼。 \n\n金菁回到广州上学,戴笠在机场用白色的大羽绒服裹住了她。\n\n她闻到浓浓的烟草味和CK香水味道,暖暖的从他的怀里渗出来。\n\n戴笠的咽炎还没好,他 嘶哑着嗓子说:\" 我真想你“。她陪着戴笠在机场吃了最后一顿饭,戴笠提着行李箱下午飞往苏州。 \n\n现在想来,金菁也不知道戴笠什么时候一举成名,变成职业选手都认识的玩家。\n\n他的直播成千上万的人看,他的名字也曾上过百度头条,金菁只是日复一日的过起曾经不言不语的日子,她在小吃摊前想着那个头发半长,却依旧很精神的戴笠。\n\n第一个月金菁飞去苏州找他,他跟几个主播一起合租,桌上有成堆的沙县小吃外卖盒,戴笠的屋里乱成一团。她每月都会尽力去苏州看他,帮他做些吃的,收拾房间。\n\n戴笠的胃在苏州也被搞坏了,睡眠又很差,金菁常常会彻夜一语不发陪着他做完直播 ,然后抱着像个孩子一样的他哄他睡去。 \n\n渐渐很多姑娘喜欢戴笠,很多人喜欢他的直播。\n\n金菁的那个暑假没有回家,她帮戴笠开了一个淘宝店,她则在苏州找了一个兼职,戴笠每天打直播,她则在线下忙着联系发货卖货。\n\n此时的戴笠剪了短发,精神洋溢的。\n\n戴笠偶尔带她直播双排,她只选辅助或者ADC,戴笠也随她走着下路。\n\n他的ADC太浪,辅助英雄一个也没有,常常下路崩的一拍两散。\n\n金菁总会嘻嘻嘻的笑,戴笠也无奈的摸摸她的头\n\n。戴笠给金菁买了一条薄荷爱喜。\n\n他说你不是喜欢艾希么。\n\n第二年戴笠又给金菁买了一条她最喜欢的萨摩,说起来,那大概是戴笠唯一送给她的礼物了。\n\n戴笠叫他”小j8,“,后来金菁改成了盖伦。 \n\n金菁总在戒烟,可好像总也戒不掉。\n\n她看着戴笠的时候想抽,看不到的时候也想抽。\n\n戴笠打野的时候她就想我怎么不是蓝爸爸,戴笠在上路被抓时她就想骂中路的卡牌为什么不飞大,戴笠中路越塔时她就想冲进去替他抗塔。\n\n戴笠的吉他一直仍在角落,她无聊的时候就去擦拭,她看到频道里对戴笠疯狂爱慕的女生她会轻蔑的笑。\n\n她把戴笠的头抱在怀里,她想这样安抚他一辈子。 \n\n后来的事情就没有后来了,戴笠参加过一次线下比赛后,彻底火了。\n\n他回到了老家安徽,买了专用的电脑和椅子,专职做起了主播。\n\n她慢慢的把自己的很多都放到了戴笠家里,情侣的睡衣,拖鞋,牙刷,提莫的玩偶,寒冰的手办,她的帽衫们……她回到广州准备毕业答辩,她抱着论文的心情就像抱着结婚证书一样激动。\n\n她知道的,差不多。\n\n她开始想戒烟了,但是她舍不得。\n\n她一直记得戴笠第一次夸她的那个场景。\n\n两人坐在学校附近的路边,一起抽着烟。 \n\n戴笠摸着她的头说:“我会不逼你戒烟。“\n\n”哦,为什么呢?“\n\n”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“\n \n还没得知答辩结果的金菁就飞到了芜湖见戴笠,那就是人生里最狗血的一幕,大中午的戴笠睡在被窝里——那很正常,里面还有一个女人——那不正常。 \n再后来,她就什么都不知道了。\n \n她开始清醒的时候,就是一条一条写着戴笠生活习惯的时候\n \n——他不能吃辣不能吃隔夜不能吃真空包装不能喝牛奶他有起床气他胃病很严重他的咽炎需要抑制他的亲昵很少……。\n \n她不敢想他站在那个女人面前维护他的样子。\n \n就像自己的辅助,站到了对面ADC的身边。\n \n如果那还是个机器人,她一把把你抓到了他们的防御塔下,折磨你,打死你。\n \n她打开自己的游戏记录,几乎都是与戴笠一起双排的,他是ADC,或者他是打野。\n\n她闭上眼,写道:戴笠不爱打下路,不要逼他。 \n\n走的那天,金菁哭着说:戴笠,我要好好努力,我要去拳头公司,我要让他们在上路也有双人组合,我不要上单自己一个人! \n\n金菁好像真的把烟戒了。","slug":"路下如烟","published":1,"updated":"2023-09-30T02:59:46.524Z","_id":"cln4obyhn00gioko03c3q5piq","comments":1,"layout":"post","photos":[],"link":"","content":"

(文.璟)

\n

“我会不逼你戒烟。“

\n

”哦,为什么呢?“

\n

”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“

\n

金菁喜欢穿有帽子的衣服, 她觉得戴上帽子很有安全感。

\n

她在大学的时候不喜欢跟人说话,圈子很小,她熟稔一切能自己做的事情,比如画画,比如看书,比如打游戏,比如去学校附近的小酒吧安静的坐一夜。

\n

她最喜欢酒吧里一个总穿着帽衫,头发略长的瘦瘦的男生唱的歌,不像那些装蛋的摇滚,难听的嗓音在夜里爆炸出很多玻璃碎痕,让原本烦闷的人更烦闷。

\n

那个男生唱的歌总是温柔的老歌,或者日本动漫里的歌曲。

\n

金菁喜欢这两种风格,一种治愈她,一种填满她。

\n

有天夜里,帽衫男生下班,背着吉他走出酒吧。

\n

金菁戴上帽子跟着他,帽衫男生点了一根烟,金菁也点了一根烟。

\n

男生走进了金菁的大学,金菁也跟他走进去。

\n

帽衫男生回过头来看着她,她也直视着男生。

\n

帽衫男生站在月亮的阴影下,他说:我认识你。我叫戴笠。

\n

戴笠说他很久就前就注意到金菁了,总在他演唱的时候坐在最远的卡座上。

\n

戴笠说他不是这个大学的,他只是有个好朋友在这里上学,他来这个城市混日子,住在他宿舍里。

\n

戴笠说有一次看到金菁穿着樱木花道的印花T恤,他就唱了一首《灌篮高手》的主题曲。

\n

戴笠说秋天看到金菁穿一件印着寒冰射手的帽衫,他的心怦然一跳。

\n

戴笠不怎么爱说话,在一起了一个月,金菁也只记住这些比较重要的。

\n

金菁给戴笠买了很多帽衫,他俩经常手牵手去网吧双排。

\n

戴笠打的很好,尤其是坦克式英雄,金菁还有课业,打游戏的时间不多,戴笠每晚唱到两三点,就会去网吧通宵到早上,然后闷头睡一天。

\n

他俩相处的时间多是黑夜,路灯下每个小摊,金菁都知道他们的味道。

\n

戴笠唱歌需要嗓子,可他又极度依赖烟,唱的时间越来越短。金菁期末考试周时,戴笠得了咽炎。

\n

金菁仿佛从那个时候开始,变成了贤妻良母。她不去泡图书馆,也不去参加集体活动,她偷偷买了小煮锅,给戴笠煮梨汤,省下钱去买化咽炎的药。

\n

戴笠没有了酒吧的工作,每天窝在男生寝室里打游戏,晚上出来跟金菁在操场散步,看着长腿的姑娘挽着挺拔的小伙。

\n

他俩在操场的尽头比赛似的抽烟,戴笠抽下金菁的烟,轻轻的亲吻她的嘴。

\n

放了假的金菁回到老家,她在火车卧铺上就疯狂的想念戴笠。

\n

两个人在南北两地开着视频打rank,戴笠会用有些沙哑的嗓音给她唱歌,还会寄栗子糕给她。

\n

金菁开始留头发,开始每天在家里学煲粥和炖汤,她出门去买菜,喜欢萝卜刺眼的色彩。

\n

她买了所LOL里所有的情侣皮肤,她看到中路阿狸站在戴笠的蛮王身边,她会一撇嘴射出一道冰箭过去,暴击百分百。

\n

过完年了的某一天,戴笠截了一张最强王者的段位图给她,还有一张频道邀请主播函。

\n

金菁买了全套泳池皮肤送给他,事后想想好像戴笠只喜欢用里面的鳄鱼。

\n

金菁回到广州上学,戴笠在机场用白色的大羽绒服裹住了她。

\n

她闻到浓浓的烟草味和CK香水味道,暖暖的从他的怀里渗出来。

\n

戴笠的咽炎还没好,他 嘶哑着嗓子说:” 我真想你“。她陪着戴笠在机场吃了最后一顿饭,戴笠提着行李箱下午飞往苏州。

\n

现在想来,金菁也不知道戴笠什么时候一举成名,变成职业选手都认识的玩家。

\n

他的直播成千上万的人看,他的名字也曾上过百度头条,金菁只是日复一日的过起曾经不言不语的日子,她在小吃摊前想着那个头发半长,却依旧很精神的戴笠。

\n

第一个月金菁飞去苏州找他,他跟几个主播一起合租,桌上有成堆的沙县小吃外卖盒,戴笠的屋里乱成一团。她每月都会尽力去苏州看他,帮他做些吃的,收拾房间。

\n

戴笠的胃在苏州也被搞坏了,睡眠又很差,金菁常常会彻夜一语不发陪着他做完直播 ,然后抱着像个孩子一样的他哄他睡去。

\n

渐渐很多姑娘喜欢戴笠,很多人喜欢他的直播。

\n

金菁的那个暑假没有回家,她帮戴笠开了一个淘宝店,她则在苏州找了一个兼职,戴笠每天打直播,她则在线下忙着联系发货卖货。

\n

此时的戴笠剪了短发,精神洋溢的。

\n

戴笠偶尔带她直播双排,她只选辅助或者ADC,戴笠也随她走着下路。

\n

他的ADC太浪,辅助英雄一个也没有,常常下路崩的一拍两散。

\n

金菁总会嘻嘻嘻的笑,戴笠也无奈的摸摸她的头

\n

。戴笠给金菁买了一条薄荷爱喜。

\n

他说你不是喜欢艾希么。

\n

第二年戴笠又给金菁买了一条她最喜欢的萨摩,说起来,那大概是戴笠唯一送给她的礼物了。

\n

戴笠叫他”小j8,“,后来金菁改成了盖伦。

\n

金菁总在戒烟,可好像总也戒不掉。

\n

她看着戴笠的时候想抽,看不到的时候也想抽。

\n

戴笠打野的时候她就想我怎么不是蓝爸爸,戴笠在上路被抓时她就想骂中路的卡牌为什么不飞大,戴笠中路越塔时她就想冲进去替他抗塔。

\n

戴笠的吉他一直仍在角落,她无聊的时候就去擦拭,她看到频道里对戴笠疯狂爱慕的女生她会轻蔑的笑。

\n

她把戴笠的头抱在怀里,她想这样安抚他一辈子。

\n

后来的事情就没有后来了,戴笠参加过一次线下比赛后,彻底火了。

\n

他回到了老家安徽,买了专用的电脑和椅子,专职做起了主播。

\n

她慢慢的把自己的很多都放到了戴笠家里,情侣的睡衣,拖鞋,牙刷,提莫的玩偶,寒冰的手办,她的帽衫们……她回到广州准备毕业答辩,她抱着论文的心情就像抱着结婚证书一样激动。

\n

她知道的,差不多。

\n

她开始想戒烟了,但是她舍不得。

\n

她一直记得戴笠第一次夸她的那个场景。

\n

两人坐在学校附近的路边,一起抽着烟。

\n

戴笠摸着她的头说:“我会不逼你戒烟。“

\n

”哦,为什么呢?“

\n

”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“

\n

还没得知答辩结果的金菁就飞到了芜湖见戴笠,那就是人生里最狗血的一幕,大中午的戴笠睡在被窝里——那很正常,里面还有一个女人——那不正常。
再后来,她就什么都不知道了。

\n

她开始清醒的时候,就是一条一条写着戴笠生活习惯的时候

\n

——他不能吃辣不能吃隔夜不能吃真空包装不能喝牛奶他有起床气他胃病很严重他的咽炎需要抑制他的亲昵很少……。

\n

她不敢想他站在那个女人面前维护他的样子。

\n

就像自己的辅助,站到了对面ADC的身边。

\n

如果那还是个机器人,她一把把你抓到了他们的防御塔下,折磨你,打死你。

\n

她打开自己的游戏记录,几乎都是与戴笠一起双排的,他是ADC,或者他是打野。

\n

她闭上眼,写道:戴笠不爱打下路,不要逼他。

\n

走的那天,金菁哭着说:戴笠,我要好好努力,我要去拳头公司,我要让他们在上路也有双人组合,我不要上单自己一个人!

\n

金菁好像真的把烟戒了。

\n","site":{"data":{}},"more":"

(文.璟)

\n

“我会不逼你戒烟。“

\n

”哦,为什么呢?“

\n

”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“

\n

金菁喜欢穿有帽子的衣服, 她觉得戴上帽子很有安全感。

\n

她在大学的时候不喜欢跟人说话,圈子很小,她熟稔一切能自己做的事情,比如画画,比如看书,比如打游戏,比如去学校附近的小酒吧安静的坐一夜。

\n

她最喜欢酒吧里一个总穿着帽衫,头发略长的瘦瘦的男生唱的歌,不像那些装蛋的摇滚,难听的嗓音在夜里爆炸出很多玻璃碎痕,让原本烦闷的人更烦闷。

\n

那个男生唱的歌总是温柔的老歌,或者日本动漫里的歌曲。

\n

金菁喜欢这两种风格,一种治愈她,一种填满她。

\n

有天夜里,帽衫男生下班,背着吉他走出酒吧。

\n

金菁戴上帽子跟着他,帽衫男生点了一根烟,金菁也点了一根烟。

\n

男生走进了金菁的大学,金菁也跟他走进去。

\n

帽衫男生回过头来看着她,她也直视着男生。

\n

帽衫男生站在月亮的阴影下,他说:我认识你。我叫戴笠。

\n

戴笠说他很久就前就注意到金菁了,总在他演唱的时候坐在最远的卡座上。

\n

戴笠说他不是这个大学的,他只是有个好朋友在这里上学,他来这个城市混日子,住在他宿舍里。

\n

戴笠说有一次看到金菁穿着樱木花道的印花T恤,他就唱了一首《灌篮高手》的主题曲。

\n

戴笠说秋天看到金菁穿一件印着寒冰射手的帽衫,他的心怦然一跳。

\n

戴笠不怎么爱说话,在一起了一个月,金菁也只记住这些比较重要的。

\n

金菁给戴笠买了很多帽衫,他俩经常手牵手去网吧双排。

\n

戴笠打的很好,尤其是坦克式英雄,金菁还有课业,打游戏的时间不多,戴笠每晚唱到两三点,就会去网吧通宵到早上,然后闷头睡一天。

\n

他俩相处的时间多是黑夜,路灯下每个小摊,金菁都知道他们的味道。

\n

戴笠唱歌需要嗓子,可他又极度依赖烟,唱的时间越来越短。金菁期末考试周时,戴笠得了咽炎。

\n

金菁仿佛从那个时候开始,变成了贤妻良母。她不去泡图书馆,也不去参加集体活动,她偷偷买了小煮锅,给戴笠煮梨汤,省下钱去买化咽炎的药。

\n

戴笠没有了酒吧的工作,每天窝在男生寝室里打游戏,晚上出来跟金菁在操场散步,看着长腿的姑娘挽着挺拔的小伙。

\n

他俩在操场的尽头比赛似的抽烟,戴笠抽下金菁的烟,轻轻的亲吻她的嘴。

\n

放了假的金菁回到老家,她在火车卧铺上就疯狂的想念戴笠。

\n

两个人在南北两地开着视频打rank,戴笠会用有些沙哑的嗓音给她唱歌,还会寄栗子糕给她。

\n

金菁开始留头发,开始每天在家里学煲粥和炖汤,她出门去买菜,喜欢萝卜刺眼的色彩。

\n

她买了所LOL里所有的情侣皮肤,她看到中路阿狸站在戴笠的蛮王身边,她会一撇嘴射出一道冰箭过去,暴击百分百。

\n

过完年了的某一天,戴笠截了一张最强王者的段位图给她,还有一张频道邀请主播函。

\n

金菁买了全套泳池皮肤送给他,事后想想好像戴笠只喜欢用里面的鳄鱼。

\n

金菁回到广州上学,戴笠在机场用白色的大羽绒服裹住了她。

\n

她闻到浓浓的烟草味和CK香水味道,暖暖的从他的怀里渗出来。

\n

戴笠的咽炎还没好,他 嘶哑着嗓子说:” 我真想你“。她陪着戴笠在机场吃了最后一顿饭,戴笠提着行李箱下午飞往苏州。

\n

现在想来,金菁也不知道戴笠什么时候一举成名,变成职业选手都认识的玩家。

\n

他的直播成千上万的人看,他的名字也曾上过百度头条,金菁只是日复一日的过起曾经不言不语的日子,她在小吃摊前想着那个头发半长,却依旧很精神的戴笠。

\n

第一个月金菁飞去苏州找他,他跟几个主播一起合租,桌上有成堆的沙县小吃外卖盒,戴笠的屋里乱成一团。她每月都会尽力去苏州看他,帮他做些吃的,收拾房间。

\n

戴笠的胃在苏州也被搞坏了,睡眠又很差,金菁常常会彻夜一语不发陪着他做完直播 ,然后抱着像个孩子一样的他哄他睡去。

\n

渐渐很多姑娘喜欢戴笠,很多人喜欢他的直播。

\n

金菁的那个暑假没有回家,她帮戴笠开了一个淘宝店,她则在苏州找了一个兼职,戴笠每天打直播,她则在线下忙着联系发货卖货。

\n

此时的戴笠剪了短发,精神洋溢的。

\n

戴笠偶尔带她直播双排,她只选辅助或者ADC,戴笠也随她走着下路。

\n

他的ADC太浪,辅助英雄一个也没有,常常下路崩的一拍两散。

\n

金菁总会嘻嘻嘻的笑,戴笠也无奈的摸摸她的头

\n

。戴笠给金菁买了一条薄荷爱喜。

\n

他说你不是喜欢艾希么。

\n

第二年戴笠又给金菁买了一条她最喜欢的萨摩,说起来,那大概是戴笠唯一送给她的礼物了。

\n

戴笠叫他”小j8,“,后来金菁改成了盖伦。

\n

金菁总在戒烟,可好像总也戒不掉。

\n

她看着戴笠的时候想抽,看不到的时候也想抽。

\n

戴笠打野的时候她就想我怎么不是蓝爸爸,戴笠在上路被抓时她就想骂中路的卡牌为什么不飞大,戴笠中路越塔时她就想冲进去替他抗塔。

\n

戴笠的吉他一直仍在角落,她无聊的时候就去擦拭,她看到频道里对戴笠疯狂爱慕的女生她会轻蔑的笑。

\n

她把戴笠的头抱在怀里,她想这样安抚他一辈子。

\n

后来的事情就没有后来了,戴笠参加过一次线下比赛后,彻底火了。

\n

他回到了老家安徽,买了专用的电脑和椅子,专职做起了主播。

\n

她慢慢的把自己的很多都放到了戴笠家里,情侣的睡衣,拖鞋,牙刷,提莫的玩偶,寒冰的手办,她的帽衫们……她回到广州准备毕业答辩,她抱着论文的心情就像抱着结婚证书一样激动。

\n

她知道的,差不多。

\n

她开始想戒烟了,但是她舍不得。

\n

她一直记得戴笠第一次夸她的那个场景。

\n

两人坐在学校附近的路边,一起抽着烟。

\n

戴笠摸着她的头说:“我会不逼你戒烟。“

\n

”哦,为什么呢?“

\n

”因为我觉得,你抽烟的时候,噘嘴的样子很自然。“

\n

还没得知答辩结果的金菁就飞到了芜湖见戴笠,那就是人生里最狗血的一幕,大中午的戴笠睡在被窝里——那很正常,里面还有一个女人——那不正常。
再后来,她就什么都不知道了。

\n

她开始清醒的时候,就是一条一条写着戴笠生活习惯的时候

\n

——他不能吃辣不能吃隔夜不能吃真空包装不能喝牛奶他有起床气他胃病很严重他的咽炎需要抑制他的亲昵很少……。

\n

她不敢想他站在那个女人面前维护他的样子。

\n

就像自己的辅助,站到了对面ADC的身边。

\n

如果那还是个机器人,她一把把你抓到了他们的防御塔下,折磨你,打死你。

\n

她打开自己的游戏记录,几乎都是与戴笠一起双排的,他是ADC,或者他是打野。

\n

她闭上眼,写道:戴笠不爱打下路,不要逼他。

\n

走的那天,金菁哭着说:戴笠,我要好好努力,我要去拳头公司,我要让他们在上路也有双人组合,我不要上单自己一个人!

\n

金菁好像真的把烟戒了。

\n"},{"title":"阿里悟空服务下线","excerpt":"","abbrlink":29655,"date":"2016-11-15T08:08:23.000Z","_content":"\n阿里悟空服务宣布于2016年10月31号正式下线,基于阿里悟空的phpwind移动版,基本上也可以宣告死亡了。 实际上phpwind早在两年前已经停止更新维护,目前的社区论坛程序discuz也处于停止更新维护的状态,伴随了广大草根站长走过十年岁月的两大社区程序也算是完成了自己的使命。 一直对社交网络不死心的阿里也放弃了pw是不是意味着社区论坛就此消亡。或者说,在将来不再会有个人草根站长了?毕竟网站开发维护的成本对于非IT人员来讲实在太过于高昂","source":"_posts/阿里悟空服务下线.md","raw":"---\ntitle: 阿里悟空服务下线\ntags:\n - 生活\n - 阿里\n - 阿里悟空\nexcerpt: ''\ncategories:\n - Note\nabbrlink: 29655\ndate: 2016-11-15 16:08:23\n---\n\n阿里悟空服务宣布于2016年10月31号正式下线,基于阿里悟空的phpwind移动版,基本上也可以宣告死亡了。 实际上phpwind早在两年前已经停止更新维护,目前的社区论坛程序discuz也处于停止更新维护的状态,伴随了广大草根站长走过十年岁月的两大社区程序也算是完成了自己的使命。 一直对社交网络不死心的阿里也放弃了pw是不是意味着社区论坛就此消亡。或者说,在将来不再会有个人草根站长了?毕竟网站开发维护的成本对于非IT人员来讲实在太过于高昂","slug":"阿里悟空服务下线","published":1,"updated":"2023-09-30T02:59:46.524Z","_id":"cln4obyho00gmoko02ixqh8db","comments":1,"layout":"post","photos":[],"link":"","content":"

阿里悟空服务宣布于2016年10月31号正式下线,基于阿里悟空的phpwind移动版,基本上也可以宣告死亡了。 实际上phpwind早在两年前已经停止更新维护,目前的社区论坛程序discuz也处于停止更新维护的状态,伴随了广大草根站长走过十年岁月的两大社区程序也算是完成了自己的使命。 一直对社交网络不死心的阿里也放弃了pw是不是意味着社区论坛就此消亡。或者说,在将来不再会有个人草根站长了?毕竟网站开发维护的成本对于非IT人员来讲实在太过于高昂

\n","site":{"data":{}},"more":"

阿里悟空服务宣布于2016年10月31号正式下线,基于阿里悟空的phpwind移动版,基本上也可以宣告死亡了。 实际上phpwind早在两年前已经停止更新维护,目前的社区论坛程序discuz也处于停止更新维护的状态,伴随了广大草根站长走过十年岁月的两大社区程序也算是完成了自己的使命。 一直对社交网络不死心的阿里也放弃了pw是不是意味着社区论坛就此消亡。或者说,在将来不再会有个人草根站长了?毕竟网站开发维护的成本对于非IT人员来讲实在太过于高昂

\n"},{"title":"黄易先生逝世","excerpt":"","abbrlink":4108,"date":"2017-04-07T11:49:16.000Z","_content":"\n> 香港武侠小说家黄易4月5日中风过世,享年65岁。 黄易原名黄祖强,1952年出生于香港,毕业于香港中文大学,求学期间专攻传统中国绘画,1989年辞去高薪工作,隐居大屿山专心从事写作。上世纪90年代以来,武侠小说进入低迷期,黄易却一扫“金庸之后无武侠”的局面,另辟疆土,开创了玄幻(《星际浪子》)、穿越(《寻秦记》)和异侠(《大唐双龙传》)三大流派,被称为“新武侠宗师”。 黄易最爱的两位武侠名家是金庸及司马翎,尤其是善于刻画人与人之间关系的司马翎,对黄易影响颇深。他开始创作武侠小说源自于喜爱武侠的外公,黄易的外公经常租武侠小说看,而黄易顺带也读遍了这些小说。不过黄易是先创作科幻小说,之后才创作的武侠小说,他的创作中不乏“时空机器”等穿越回古代的情节,大胆而又充满想象力。 起初黄易的武侠小说被认为“没有市场”,因此久久得不到发表和出版,出版界人士建议他改写科幻小说,他用一个星期的时间就创作了第一部科幻作品《月魔》,自此一发不可收拾,黄易相继写出了《上帝之谜》、《湖祭》等作品。他将科幻与武侠结合起来,因此创作出了玄幻、穿越和异侠三大流派,创立了“新武侠”。 1997年以来,黄易小说在内地开始出版。2012年,黄易停笔五年后复出,带来一本玄幻新作《日月当空》,正式将网络版权授权给网站。该书纸质版由湖南人民出版社以最快的速度第一时间推出,创下了黄易小说在内地出版的纪录。 “2012第七届中国作家富豪榜”中,黄易以240万元的年度版税收入首登作家富豪榜,排名第22位并获得“2012第七届中国作家富豪榜年度武侠宗师”奖项。 黄易的小说创作手法对于当代网络小说,尤其是风靡的玄幻小说影响很大,许多网络文学作者的创作风格都与黄易相似,黄易的多部小说也改编成了网络游戏,很受年轻人欢迎。 不少读者在闻讯黄易逝世后,很是伤感。他们说,当代武侠五大家“金古梁温黄”如今只剩金庸和温瑞安二位了。\n\n昨日刷微博突然听闻黄易先生逝世的消息,刚开始并不愿意相信这是真的消息。 黄易的故事天马行空,十分的具有创造力。可以说是网络各种网文的开山祖师。一点也不夸张。 读书时候读过寻秦记,大唐双龙传等等。仿佛打开了新世界的大门,原来武侠还可以是这样写。竟然会有如此奇绝的江湖。 金古梁温黄武侠五大家,现如今也就只剩下封笔已久的金庸和温瑞安了。\n\n# 人间从此无黄易 愿他只是穿越去了武侠世界","source":"_posts/黄易先生逝世.md","raw":"---\ntitle: 黄易先生逝世\ntags:\n - 生活\n - 黄易\nexcerpt: ''\ncategories:\n - 随笔\nabbrlink: 4108\ndate: 2017-04-07 19:49:16\n---\n\n> 香港武侠小说家黄易4月5日中风过世,享年65岁。 黄易原名黄祖强,1952年出生于香港,毕业于香港中文大学,求学期间专攻传统中国绘画,1989年辞去高薪工作,隐居大屿山专心从事写作。上世纪90年代以来,武侠小说进入低迷期,黄易却一扫“金庸之后无武侠”的局面,另辟疆土,开创了玄幻(《星际浪子》)、穿越(《寻秦记》)和异侠(《大唐双龙传》)三大流派,被称为“新武侠宗师”。 黄易最爱的两位武侠名家是金庸及司马翎,尤其是善于刻画人与人之间关系的司马翎,对黄易影响颇深。他开始创作武侠小说源自于喜爱武侠的外公,黄易的外公经常租武侠小说看,而黄易顺带也读遍了这些小说。不过黄易是先创作科幻小说,之后才创作的武侠小说,他的创作中不乏“时空机器”等穿越回古代的情节,大胆而又充满想象力。 起初黄易的武侠小说被认为“没有市场”,因此久久得不到发表和出版,出版界人士建议他改写科幻小说,他用一个星期的时间就创作了第一部科幻作品《月魔》,自此一发不可收拾,黄易相继写出了《上帝之谜》、《湖祭》等作品。他将科幻与武侠结合起来,因此创作出了玄幻、穿越和异侠三大流派,创立了“新武侠”。 1997年以来,黄易小说在内地开始出版。2012年,黄易停笔五年后复出,带来一本玄幻新作《日月当空》,正式将网络版权授权给网站。该书纸质版由湖南人民出版社以最快的速度第一时间推出,创下了黄易小说在内地出版的纪录。 “2012第七届中国作家富豪榜”中,黄易以240万元的年度版税收入首登作家富豪榜,排名第22位并获得“2012第七届中国作家富豪榜年度武侠宗师”奖项。 黄易的小说创作手法对于当代网络小说,尤其是风靡的玄幻小说影响很大,许多网络文学作者的创作风格都与黄易相似,黄易的多部小说也改编成了网络游戏,很受年轻人欢迎。 不少读者在闻讯黄易逝世后,很是伤感。他们说,当代武侠五大家“金古梁温黄”如今只剩金庸和温瑞安二位了。\n\n昨日刷微博突然听闻黄易先生逝世的消息,刚开始并不愿意相信这是真的消息。 黄易的故事天马行空,十分的具有创造力。可以说是网络各种网文的开山祖师。一点也不夸张。 读书时候读过寻秦记,大唐双龙传等等。仿佛打开了新世界的大门,原来武侠还可以是这样写。竟然会有如此奇绝的江湖。 金古梁温黄武侠五大家,现如今也就只剩下封笔已久的金庸和温瑞安了。\n\n# 人间从此无黄易 愿他只是穿越去了武侠世界","slug":"黄易先生逝世","published":1,"updated":"2023-09-30T02:59:46.524Z","_id":"cln4obyho00gpoko0e5c3cfiw","comments":1,"layout":"post","photos":[],"link":"","content":"
\n

香港武侠小说家黄易4月5日中风过世,享年65岁。 黄易原名黄祖强,1952年出生于香港,毕业于香港中文大学,求学期间专攻传统中国绘画,1989年辞去高薪工作,隐居大屿山专心从事写作。上世纪90年代以来,武侠小说进入低迷期,黄易却一扫“金庸之后无武侠”的局面,另辟疆土,开创了玄幻(《星际浪子》)、穿越(《寻秦记》)和异侠(《大唐双龙传》)三大流派,被称为“新武侠宗师”。 黄易最爱的两位武侠名家是金庸及司马翎,尤其是善于刻画人与人之间关系的司马翎,对黄易影响颇深。他开始创作武侠小说源自于喜爱武侠的外公,黄易的外公经常租武侠小说看,而黄易顺带也读遍了这些小说。不过黄易是先创作科幻小说,之后才创作的武侠小说,他的创作中不乏“时空机器”等穿越回古代的情节,大胆而又充满想象力。 起初黄易的武侠小说被认为“没有市场”,因此久久得不到发表和出版,出版界人士建议他改写科幻小说,他用一个星期的时间就创作了第一部科幻作品《月魔》,自此一发不可收拾,黄易相继写出了《上帝之谜》、《湖祭》等作品。他将科幻与武侠结合起来,因此创作出了玄幻、穿越和异侠三大流派,创立了“新武侠”。 1997年以来,黄易小说在内地开始出版。2012年,黄易停笔五年后复出,带来一本玄幻新作《日月当空》,正式将网络版权授权给网站。该书纸质版由湖南人民出版社以最快的速度第一时间推出,创下了黄易小说在内地出版的纪录。 “2012第七届中国作家富豪榜”中,黄易以240万元的年度版税收入首登作家富豪榜,排名第22位并获得“2012第七届中国作家富豪榜年度武侠宗师”奖项。 黄易的小说创作手法对于当代网络小说,尤其是风靡的玄幻小说影响很大,许多网络文学作者的创作风格都与黄易相似,黄易的多部小说也改编成了网络游戏,很受年轻人欢迎。 不少读者在闻讯黄易逝世后,很是伤感。他们说,当代武侠五大家“金古梁温黄”如今只剩金庸和温瑞安二位了。

\n
\n

昨日刷微博突然听闻黄易先生逝世的消息,刚开始并不愿意相信这是真的消息。 黄易的故事天马行空,十分的具有创造力。可以说是网络各种网文的开山祖师。一点也不夸张。 读书时候读过寻秦记,大唐双龙传等等。仿佛打开了新世界的大门,原来武侠还可以是这样写。竟然会有如此奇绝的江湖。 金古梁温黄武侠五大家,现如今也就只剩下封笔已久的金庸和温瑞安了。

\n

人间从此无黄易 愿他只是穿越去了武侠世界

","site":{"data":{}},"more":"
\n

香港武侠小说家黄易4月5日中风过世,享年65岁。 黄易原名黄祖强,1952年出生于香港,毕业于香港中文大学,求学期间专攻传统中国绘画,1989年辞去高薪工作,隐居大屿山专心从事写作。上世纪90年代以来,武侠小说进入低迷期,黄易却一扫“金庸之后无武侠”的局面,另辟疆土,开创了玄幻(《星际浪子》)、穿越(《寻秦记》)和异侠(《大唐双龙传》)三大流派,被称为“新武侠宗师”。 黄易最爱的两位武侠名家是金庸及司马翎,尤其是善于刻画人与人之间关系的司马翎,对黄易影响颇深。他开始创作武侠小说源自于喜爱武侠的外公,黄易的外公经常租武侠小说看,而黄易顺带也读遍了这些小说。不过黄易是先创作科幻小说,之后才创作的武侠小说,他的创作中不乏“时空机器”等穿越回古代的情节,大胆而又充满想象力。 起初黄易的武侠小说被认为“没有市场”,因此久久得不到发表和出版,出版界人士建议他改写科幻小说,他用一个星期的时间就创作了第一部科幻作品《月魔》,自此一发不可收拾,黄易相继写出了《上帝之谜》、《湖祭》等作品。他将科幻与武侠结合起来,因此创作出了玄幻、穿越和异侠三大流派,创立了“新武侠”。 1997年以来,黄易小说在内地开始出版。2012年,黄易停笔五年后复出,带来一本玄幻新作《日月当空》,正式将网络版权授权给网站。该书纸质版由湖南人民出版社以最快的速度第一时间推出,创下了黄易小说在内地出版的纪录。 “2012第七届中国作家富豪榜”中,黄易以240万元的年度版税收入首登作家富豪榜,排名第22位并获得“2012第七届中国作家富豪榜年度武侠宗师”奖项。 黄易的小说创作手法对于当代网络小说,尤其是风靡的玄幻小说影响很大,许多网络文学作者的创作风格都与黄易相似,黄易的多部小说也改编成了网络游戏,很受年轻人欢迎。 不少读者在闻讯黄易逝世后,很是伤感。他们说,当代武侠五大家“金古梁温黄”如今只剩金庸和温瑞安二位了。

\n
\n

昨日刷微博突然听闻黄易先生逝世的消息,刚开始并不愿意相信这是真的消息。 黄易的故事天马行空,十分的具有创造力。可以说是网络各种网文的开山祖师。一点也不夸张。 读书时候读过寻秦记,大唐双龙传等等。仿佛打开了新世界的大门,原来武侠还可以是这样写。竟然会有如此奇绝的江湖。 金古梁温黄武侠五大家,现如今也就只剩下封笔已久的金庸和温瑞安了。

\n

人间从此无黄易 愿他只是穿越去了武侠世界

"}],"PostAsset":[],"PostCategory":[{"post_id":"cln4obye70001oko0bxdi99ti","category_id":"cln4obyee0007oko00w5f68mk","_id":"cln4obyem000loko09wix19yk"},{"post_id":"cln4obyei000goko09d2y8wcc","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyen000noko0fb1j66xe"},{"post_id":"cln4obyea0003oko05qum4gg0","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyeo000roko01e6x96jj"},{"post_id":"cln4obyee0006oko07b6qfj4f","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyep000toko027e3cqsf"},{"post_id":"cln4obyem000moko09tf4dkmc","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyeq000xoko05p1maekc"},{"post_id":"cln4obyen000qoko02wqif5zw","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyer0010oko0e01netr3"},{"post_id":"cln4obyeg0009oko0gp7e41ho","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyes0015oko09uto41r0"},{"post_id":"cln4obyeo000soko05gkyaby7","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyet0018oko0gkdv72ii"},{"post_id":"cln4obyep000woko07djvfgw8","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyeu001coko098g7671y"},{"post_id":"cln4obyeh000boko0az3mcwjb","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyev001eoko01bmu4j6x"},{"post_id":"cln4obyeq000zoko01d00cfpt","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyew001ioko0gjm2c0z1"},{"post_id":"cln4obyej000hoko0hi7u43ug","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyez001koko0bzr3672w"},{"post_id":"cln4obyeu001doko0e993e7bg","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf0001noko0d8z57wtq"},{"post_id":"cln4obyel000koko0dnjgcbcx","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf1001roko06e4jbzg6"},{"post_id":"cln4obyev001foko0ccn1cieg","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf1001voko063250943"},{"post_id":"cln4obyer0013oko0257idpe3","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf2001zoko0hjvc5yvr"},{"post_id":"cln4obyew001joko0et1hdhch","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf20022oko04j2u56q8"},{"post_id":"cln4obyf0001poko0gmyr00wf","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf30025oko02lca8g0w"},{"post_id":"cln4obyes0017oko03vhpgdbl","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf30027oko007mogtql"},{"post_id":"cln4obyf1001xoko08uo5ghw4","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf4002aoko08wnah339"},{"post_id":"cln4obyf1001soko01igb6ki8","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf4002coko0414ae8oi"},{"post_id":"cln4obyet001aoko088smaz6z","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf5002eoko06irshol7"},{"post_id":"cln4obyf30026oko0a5a07rta","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf5002hoko0gcwef7sy"},{"post_id":"cln4obyf30028oko09ts6ekbs","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf6002joko09b0w8r6k"},{"post_id":"cln4obyf4002boko0c90100qh","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf6002moko0fz6g2ov3"},{"post_id":"cln4obyf4002doko081pe6hp0","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf7002poko08t2pglap"},{"post_id":"cln4obyf5002goko06uq18aps","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf7002toko01gcs6h43"},{"post_id":"cln4obyf5002ioko0au7d42v6","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf8002woko0csjf2obl"},{"post_id":"cln4obyf6002loko07qa636nw","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf90030oko0f1cz5bvt"},{"post_id":"cln4obyf6002ooko07fxmbgky","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyf90033oko08sxlh7t7"},{"post_id":"cln4obyf7002roko0gjnt49x5","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyfa0035oko0ed1s31lr"},{"post_id":"cln4obyf7002voko07ln09w8r","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyfb0039oko08uew2z0x"},{"post_id":"cln4obyf8002yoko0h5w9fg2u","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyfb003boko0hbsy5nps"},{"post_id":"cln4obyfa0034oko0b2okccuw","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyfb003eoko08sk599eo"},{"post_id":"cln4obyf90032oko03ow66itc","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyfb003foko0h53m1hxz"},{"post_id":"cln4obygg00aloko092hr1ozm","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygj00aroko0eqxtg04g"},{"post_id":"cln4obygh00amoko02r8ia768","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygk00atoko0fo8mgnp0"},{"post_id":"cln4obygi00aooko0evlmaeis","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygl00awoko0ezbmey4u"},{"post_id":"cln4obygj00asoko0ctp79eo3","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygl00b0oko0h6irb36b"},{"post_id":"cln4obygi00aqoko01uj5098h","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygm00b2oko02o6ngu0p"},{"post_id":"cln4obygk00avoko05lpmhi95","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygm00b5oko0cvrdbxey"},{"post_id":"cln4obygl00azoko066h93056","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygn00b8oko0417vg3da"},{"post_id":"cln4obygl00axoko039iy1kiz","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygn00bcoko0gu7514ap"},{"post_id":"cln4obygm00b1oko07rdt1v5y","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygo00bfoko0fyy6ep8n"},{"post_id":"cln4obygm00b4oko05ez0aioh","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygo00bioko03gnne1mb"},{"post_id":"cln4obygn00b7oko01rmaep60","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygp00bloko00cc1ako5"},{"post_id":"cln4obygn00bboko04ivg7ado","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygp00bnoko0g9848bel"},{"post_id":"cln4obygo00bhoko0ff58cnor","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygq00bqoko0845b3qae"},{"post_id":"cln4obygo00beoko0cvrs4xid","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygq00btoko0eoq5hr6v"},{"post_id":"cln4obygp00bkoko03c7x68kt","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygq00bwoko04930evxm"},{"post_id":"cln4obygp00bmoko06e55e2qs","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygr00bzoko04pv421os"},{"post_id":"cln4obygp00bpoko04ksq9jyj","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygr00c3oko09cb52sow"},{"post_id":"cln4obygq00bsoko0b3m95fuz","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygs00c6oko08iiacscl"},{"post_id":"cln4obygq00bvoko03fm2af8w","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygs00c9oko01c58gtq0"},{"post_id":"cln4obygr00byoko0f9geg7qr","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygt00ccoko07en9gd7r"},{"post_id":"cln4obygr00c2oko0g5g17r02","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygt00ceoko0f6mm9xdk"},{"post_id":"cln4obygr00c5oko05iw6cb5r","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygu00choko0ax1p2swx"},{"post_id":"cln4obygs00c8oko05vou10rf","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygu00ckoko03sk06ea5"},{"post_id":"cln4obygs00cboko02qmzgblk","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obygv00cooko01h4ehz8s"},{"post_id":"cln4obygt00cgoko0g20id478","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygv00cqoko0hgzh4hl9"},{"post_id":"cln4obygt00cdoko01rbg7j16","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obygw00ctoko0668t3gf4"},{"post_id":"cln4obygu00cjoko08k2w4av4","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygw00cvoko0gn9p2voe"},{"post_id":"cln4obygu00cnoko0c80rcm8v","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygx00cxoko02fxfgdq8"},{"post_id":"cln4obygv00cpoko00gjxbw2h","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obygx00d0oko00ntrh0sv"},{"post_id":"cln4obygv00csoko0btaq8ef7","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygy00d2oko0bm2q6k4t"},{"post_id":"cln4obygw00cuoko09nzsflwl","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygy00d6oko0fcac3pwe"},{"post_id":"cln4obygx00cwoko009q83i3o","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obygz00d9oko0h45y0ep7"},{"post_id":"cln4obygx00czoko04ykd651a","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyh000ddoko0cudchmfm"},{"post_id":"cln4obygx00d1oko01vzifqgg","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh000dgoko0bfh0etqc"},{"post_id":"cln4obygy00d5oko08ebcgf9r","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh100dkoko0fni66wnz"},{"post_id":"cln4obygy00d8oko0grs88ez1","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyh200dnoko050qt2rmd"},{"post_id":"cln4obygz00dcoko06zdsbodi","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh200droko052sv5qrp"},{"post_id":"cln4obyh000dfoko091xdhsru","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyh300duoko0ajiscwf7"},{"post_id":"cln4obyh100djoko0f515b8ii","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh400dyoko05g3176ug"},{"post_id":"cln4obyh100dmoko02qj9fqke","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh400e1oko0del78b54"},{"post_id":"cln4obyh200dqoko0hanoeoxo","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh500e4oko02jox1nfd"},{"post_id":"cln4obyh300dtoko02up90jo7","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh600e8oko0gahzhwqi"},{"post_id":"cln4obyh300dxoko0aq8n03yw","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh700eboko013m5f75f"},{"post_id":"cln4obyh400e0oko0e4rr7rn9","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyh800efoko0eim9fewr"},{"post_id":"cln4obyh500e3oko061ca3uey","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyh800eioko0axu9a8g9"},{"post_id":"cln4obyh500e7oko08s7t4jc0","category_id":"cln4obyen000ooko00lvlahvt","_id":"cln4obyh900eloko0eoxh68ru"},{"post_id":"cln4obyh600eaoko02f4m5jpj","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyha00eooko05o6ccbrd"},{"post_id":"cln4obyh700eeoko0c2cc6kbe","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhb00esoko02svrhekb"},{"post_id":"cln4obyh800ehoko043fs54g2","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhc00evoko0g09bgt9a"},{"post_id":"cln4obyh900ekoko03fm38moi","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhf00ezoko02ylw1ktb"},{"post_id":"cln4obyha00enoko04qe92oak","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhf00f2oko0f5y180cx"},{"post_id":"cln4obyhb00eroko0f4qacnho","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhg00f5oko032juftw5"},{"post_id":"cln4obyhb00euoko0fwkeeu7o","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhg00f9oko0a3ttdv32"},{"post_id":"cln4obyhc00eyoko0h93khtt7","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhh00fcoko0b4jx18qt"},{"post_id":"cln4obyhf00f1oko0051d659o","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhh00fgoko0bje4ehc7"},{"post_id":"cln4obyhg00f4oko0c91sbrhj","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhi00fjoko0f2xp98qt"},{"post_id":"cln4obyhg00f8oko0dpxihe04","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhi00fnoko0bwssdara"},{"post_id":"cln4obyhh00fboko02q2x30mc","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhj00fqoko0anr54qfy"},{"post_id":"cln4obyhi00fioko0d3mecfeg","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhj00ftoko0ax7y3mnj"},{"post_id":"cln4obyhh00ffoko0fofe62zd","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhk00fwoko01kevd6vj"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhk00fzoko02vl7ehmx"},{"post_id":"cln4obyhj00fsoko05rs764v5","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhl00g3oko0hk0262qz"},{"post_id":"cln4obyhi00fpoko08kqtatpb","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhl00g6oko0gf682340"},{"post_id":"cln4obyhk00fyoko08mj1164d","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhm00gaoko00adjcrwn"},{"post_id":"cln4obyhj00fvoko07p789xfu","category_id":"cln4obyet0019oko0exle3517","_id":"cln4obyhn00gdoko0fmpfggky"},{"post_id":"cln4obyhl00g2oko0effdh6o6","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhn00ggoko0flrxgjmq"},{"post_id":"cln4obyhl00g5oko09tei1t3o","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyho00gjoko03ft5b0pv"},{"post_id":"cln4obyhm00g9oko08z1r71at","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyho00gnoko04u3h4g40"},{"post_id":"cln4obyhm00gcoko081xv48y9","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhp00gqoko09i8t33qp"},{"post_id":"cln4obyhn00gfoko05tafeumv","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhp00gsoko0fcmfft3a"},{"post_id":"cln4obyhn00gioko03c3q5piq","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhp00gvoko094yo4ohe"},{"post_id":"cln4obyho00gmoko02ixqh8db","category_id":"cln4obyfa0037oko059cu8mmi","_id":"cln4obyhp00gxoko00cyo0nwr"},{"post_id":"cln4obyho00gpoko0e5c3cfiw","category_id":"cln4obyei000doko0efws4wkb","_id":"cln4obyhp00gzoko0efdk2cdh"}],"PostTag":[{"post_id":"cln4obye70001oko0bxdi99ti","tag_id":"cln4obyeb0004oko0cugx8sp1","_id":"cln4obyei000eoko0hjsa5rhd"},{"post_id":"cln4obyea0003oko05qum4gg0","tag_id":"cln4obyeh000coko0h97kfin2","_id":"cln4obyeq000yoko0dvb4b6gp"},{"post_id":"cln4obyea0003oko05qum4gg0","tag_id":"cln4obyek000ioko0ckyl1g8e","_id":"cln4obyer0011oko0fwimamr5"},{"post_id":"cln4obyea0003oko05qum4gg0","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyes0016oko04s2207ix"},{"post_id":"cln4obyee0006oko07b6qfj4f","tag_id":"cln4obyep000voko07zdg3qel","_id":"cln4obyf1001qoko0duhkadv1"},{"post_id":"cln4obyee0006oko07b6qfj4f","tag_id":"cln4obyer0014oko0g1swad00","_id":"cln4obyf1001uoko0gux28m6f"},{"post_id":"cln4obyee0006oko07b6qfj4f","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyf2001yoko0bh8qgzdq"},{"post_id":"cln4obyee0006oko07b6qfj4f","tag_id":"cln4obyev001hoko0ak9bd2re","_id":"cln4obyf20021oko0hhtpfupd"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf0001ooko09ly74alq","_id":"cln4obyf6002noko06q593dye"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf1001woko02sl8dwge","_id":"cln4obyf7002qoko024hw6vi8"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf30024oko0dopf8gre","_id":"cln4obyf7002uoko0c81d5t2o"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf40029oko08j9dg6hj","_id":"cln4obyf8002xoko012ua96kv"},{"post_id":"cln4obyeg0009oko0gp7e41ho","tag_id":"cln4obyf5002foko0e4ol5ti1","_id":"cln4obyf90031oko0265pgyk5"},{"post_id":"cln4obyeh000boko0az3mcwjb","tag_id":"cln4obyf6002koko07m797b51","_id":"cln4obyfb0038oko09n1942t6"},{"post_id":"cln4obyeh000boko0az3mcwjb","tag_id":"cln4obyf7002soko0bd22hvxk","_id":"cln4obyfb003aoko0bx008r1j"},{"post_id":"cln4obyeh000boko0az3mcwjb","tag_id":"cln4obyf9002zoko0dbcf6394","_id":"cln4obyfb003doko0bzrfesso"},{"post_id":"cln4obyei000goko09d2y8wcc","tag_id":"cln4obyfa0036oko04fvq8k76","_id":"cln4obyfc003joko0hkopebxv"},{"post_id":"cln4obyei000goko09d2y8wcc","tag_id":"cln4obyfb003coko070mn9c8u","_id":"cln4obyfc003koko0hcf8fcs1"},{"post_id":"cln4obyei000goko09d2y8wcc","tag_id":"cln4obyfb003goko0a9xwaadv","_id":"cln4obyfc003moko050lb4peu"},{"post_id":"cln4obyei000goko09d2y8wcc","tag_id":"cln4obyfb003hoko0cnjrfp1q","_id":"cln4obyfc003noko08nvm3ys5"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003ioko05ozmbwp6","_id":"cln4obyfe003yoko0hrsmg7fy"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003loko0fhtf3q5i","_id":"cln4obyfe003zoko0dplsbea3"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003ooko0f4pxcut5","_id":"cln4obyfe0041oko0bvrdcdme"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003poko0c10rcgmq","_id":"cln4obyfe0042oko0efw6gsf0"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003qoko099apdqud","_id":"cln4obyfe0044oko0dz8l055d"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfc003roko0g8t19lrn","_id":"cln4obyfe0045oko0bgax4m1h"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfd003soko0degl63a9","_id":"cln4obyfe0047oko0gsaxafyl"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfd003toko0es181r6c","_id":"cln4obyfe0048oko0bpfaf1t6"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfd003uoko0aizfbxd0","_id":"cln4obyff004aoko0at1nc0om"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfd003voko0fre2ad9o","_id":"cln4obyff004boko0ged5h8rw"},{"post_id":"cln4obyej000hoko0hi7u43ug","tag_id":"cln4obyfe003woko0edfve527","_id":"cln4obyff004coko0c0v84tcd"},{"post_id":"cln4obyel000koko0dnjgcbcx","tag_id":"cln4obyfe003xoko0bip1enfz","_id":"cln4obyff004eoko0bwp8bkrv"},{"post_id":"cln4obyel000koko0dnjgcbcx","tag_id":"cln4obyfe0040oko0af41d34o","_id":"cln4obyff004foko00ox5a330"},{"post_id":"cln4obyem000moko09tf4dkmc","tag_id":"cln4obyfa0036oko04fvq8k76","_id":"cln4obyff004hoko09k2ae6s4"},{"post_id":"cln4obyem000moko09tf4dkmc","tag_id":"cln4obyfe0046oko0ars92dgk","_id":"cln4obyff004ioko0114zfds5"},{"post_id":"cln4obyen000qoko02wqif5zw","tag_id":"cln4obyff0049oko0f3v0232s","_id":"cln4obyfg004koko07pqu2njh"},{"post_id":"cln4obyen000qoko02wqif5zw","tag_id":"cln4obyff004doko0185sdz6m","_id":"cln4obyfg004loko01uachm18"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyff004goko02i8j40a7","_id":"cln4obyfg004qoko07qwk250c"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyff004joko02hoa364n","_id":"cln4obyfg004roko07pyghx4j"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyfg004moko0dahvcxw1","_id":"cln4obyfh004toko05qr8a6ji"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyfg004noko0a0wseddv","_id":"cln4obyfh004uoko03m3efz0x"},{"post_id":"cln4obyeo000soko05gkyaby7","tag_id":"cln4obyfg004ooko07ymac5z3","_id":"cln4obyfh004woko0h9e26wu5"},{"post_id":"cln4obyep000woko07djvfgw8","tag_id":"cln4obyfg004poko06sf1af7e","_id":"cln4obyfh004xoko08fvz2apr"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfg004soko03zulb32n","_id":"cln4obyfi0054oko0btq29opj"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfh004voko0e9crhizc","_id":"cln4obyfi0055oko0fcz2hq61"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfc003ioko05ozmbwp6","_id":"cln4obyfi0057oko033n84tf7"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfc003loko0fhtf3q5i","_id":"cln4obyfi0058oko00nne6las"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfc003poko0c10rcgmq","_id":"cln4obyfi005aoko08358fpit"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfi0051oko079h22g02","_id":"cln4obyfi005boko0hstq54ue"},{"post_id":"cln4obyeq000zoko01d00cfpt","tag_id":"cln4obyfi0052oko0gnlq89d7","_id":"cln4obyfj005doko04n8c7uj0"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfe003xoko0bip1enfz","_id":"cln4obyfk005ioko098ikgq1u"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfi0056oko094np55j3","_id":"cln4obyfl005joko0day5a096"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfi0059oko00rgk866o","_id":"cln4obyfl005loko0e2og49a3"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfj005coko0a27u6b2k","_id":"cln4obyfl005moko018pm9yaj"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfj005eoko0dwqg658o","_id":"cln4obyfl005ooko0bv8j2t7w"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfj005foko01rim391a","_id":"cln4obyfl005poko0eyf07r6c"},{"post_id":"cln4obyer0013oko0257idpe3","tag_id":"cln4obyfj005goko09lv9b8wv","_id":"cln4obyfl005roko04ddg8ru2"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfk005hoko05ng1gf0f","_id":"cln4obyfm005xoko02y8w48q8"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005koko0d5ancnga","_id":"cln4obyfm005yoko0eq7x9pf3"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005noko0ctv2d2gg","_id":"cln4obyfn0060oko09vlq9boe"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005qoko01e199bsl","_id":"cln4obyfn0061oko062085lxz"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005soko03falbgx1","_id":"cln4obyfn0063oko048s51iay"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005toko00fhudbgf","_id":"cln4obyfn0064oko05fatdhbe"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfl005uoko0aw3779gs","_id":"cln4obyfn0066oko0d5r73nbj"},{"post_id":"cln4obyes0017oko03vhpgdbl","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyfo0067oko0aahag4wb"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyfo006coko02y0efixk"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyfp006doko0a67a0f1g"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfl005koko0d5ancnga","_id":"cln4obyfp006foko005xs1msv"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfn0065oko0b3kx7l6g","_id":"cln4obyfp006goko00pmkd0qi"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfo0068oko07o9sh7is","_id":"cln4obyfp006ioko0f9o50ghb"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfo0069oko0fyyt2ksn","_id":"cln4obyfp006joko00lb693ys"},{"post_id":"cln4obyet001aoko088smaz6z","tag_id":"cln4obyfo006aoko0df8sc5z0","_id":"cln4obyfq006loko06ve8gmo7"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfo006boko0c5o43ryw","_id":"cln4obyfq006poko09uqda98d"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfk005hoko05ng1gf0f","_id":"cln4obyfq006qoko0cmls2pz0"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfl005toko00fhudbgf","_id":"cln4obyfr006soko0eegicuw4"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfn0065oko0b3kx7l6g","_id":"cln4obyfr006toko03bg18sto"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfq006moko070yy5gmd","_id":"cln4obyfr006voko0bhckfdma"},{"post_id":"cln4obyeu001doko0e993e7bg","tag_id":"cln4obyfo0068oko07o9sh7is","_id":"cln4obyfr006woko01jppdh9w"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfq006ooko0enb94e1q","_id":"cln4obyfs0070oko00kqx332k"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfo006boko0c5o43ryw","_id":"cln4obyfs0071oko065q204yk"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfr006uoko0hessa6jp","_id":"cln4obyfs0073oko00r9md9xw"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfr006xoko0dkq4addp","_id":"cln4obyfs0074oko0hc1kcdbk"},{"post_id":"cln4obyev001foko0ccn1cieg","tag_id":"cln4obyfr006yoko06ansck8z","_id":"cln4obyfs0076oko05j2t124u"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyfs006zoko084p22ij4","_id":"cln4obyfu007coko0608ybihn"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyfl005soko03falbgx1","_id":"cln4obyfu007doko01a8x4y35"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyfl005toko00fhudbgf","_id":"cln4obyfu007foko09c1l9442"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyfn0065oko0b3kx7l6g","_id":"cln4obyfu007goko0bcy59qib"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyft0078oko0g6r210tk","_id":"cln4obyfu007ioko02uhq9igb"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyft0079oko0fwb0d0rq","_id":"cln4obyfu007joko0ex4h27uz"},{"post_id":"cln4obyew001joko0et1hdhch","tag_id":"cln4obyft007aoko0e1jm5vb9","_id":"cln4obyfv007loko0hn074mrl"},{"post_id":"cln4obyez001loko06bsidojx","tag_id":"cln4obyft007boko00uxp590r","_id":"cln4obyfv007moko089ch4uq7"},{"post_id":"cln4obyf0001poko0gmyr00wf","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyfv007noko05wi64wsg"},{"post_id":"cln4obyf0001poko0gmyr00wf","tag_id":"cln4obyfu007hoko01llt1ldr","_id":"cln4obyfv007poko0fx274b13"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfu007koko0e8r9gb7f","_id":"cln4obyfx007xoko02y0d9ngo"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfv007ooko0ewfb33jv","_id":"cln4obyfx007yoko0hukzdi5k"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfu007hoko01llt1ldr","_id":"cln4obyfy0080oko0gtb3ehjp"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyft007boko00uxp590r","_id":"cln4obyfy0081oko08vcdaz8f"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfw007soko08mdv34vx","_id":"cln4obyfy0083oko06cxj59nb"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfw007toko00utj1uy9","_id":"cln4obyfy0084oko0dher6xsy"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfw007uoko088ga8hga","_id":"cln4obyfy0086oko0a4xqakt5"},{"post_id":"cln4obyf1001soko01igb6ki8","tag_id":"cln4obyfx007voko00nwcep58","_id":"cln4obyfy0087oko0alq714xo"},{"post_id":"cln4obyf1001xoko08uo5ghw4","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyfy0089oko0a2k9e4r4"},{"post_id":"cln4obyf1001xoko08uo5ghw4","tag_id":"cln4obyfu007hoko01llt1ldr","_id":"cln4obyfy008aoko07jx944iv"},{"post_id":"cln4obyf1001xoko08uo5ghw4","tag_id":"cln4obyft007boko00uxp590r","_id":"cln4obyfy008coko05orv2mbm"},{"post_id":"cln4obyf1001xoko08uo5ghw4","tag_id":"cln4obyfy0085oko0houqbjg3","_id":"cln4obyfy008doko0a7rfdr01"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyfz008joko0ei541pxo"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyft0078oko0g6r210tk","_id":"cln4obyfz008koko0294dh3mz"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfu007hoko01llt1ldr","_id":"cln4obyfz008moko07okt3fm3"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfz008foko0gfl2euzj","_id":"cln4obyfz008noko0h6wz95k0"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfz008goko0bs5ob868","_id":"cln4obyfz008poko00gpscxfx"},{"post_id":"cln4obyf20020oko00eev0xhh","tag_id":"cln4obyfz008hoko06lk1dais","_id":"cln4obyfz008qoko028yyb718"},{"post_id":"cln4obyf20023oko0hxdl1nde","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyg0008toko0fdu8hnp9"},{"post_id":"cln4obyf20023oko0hxdl1nde","tag_id":"cln4obyfz008loko078j52vrf","_id":"cln4obyg0008uoko00er66dif"},{"post_id":"cln4obyf20023oko0hxdl1nde","tag_id":"cln4obyfz008ooko0aomf7hch","_id":"cln4obyg0008woko0biap73p1"},{"post_id":"cln4obyf20023oko0hxdl1nde","tag_id":"cln4obyfz008roko01nqx0fsq","_id":"cln4obyg0008xoko0fsx909w0"},{"post_id":"cln4obyf30026oko0a5a07rta","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyg00091oko0cvnd2rgv"},{"post_id":"cln4obyf30026oko0a5a07rta","tag_id":"cln4obyfo006boko0c5o43ryw","_id":"cln4obyg00092oko02gtb4rvn"},{"post_id":"cln4obyf30026oko0a5a07rta","tag_id":"cln4obyfk005hoko05ng1gf0f","_id":"cln4obyg00094oko0e5tt847d"},{"post_id":"cln4obyf30026oko0a5a07rta","tag_id":"cln4obyg0008zoko08cww9qhw","_id":"cln4obyg00095oko0an1v4lwu"},{"post_id":"cln4obyf30028oko09ts6ekbs","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyg10099oko05sjp2xr1"},{"post_id":"cln4obyf30028oko09ts6ekbs","tag_id":"cln4obyfl005koko0d5ancnga","_id":"cln4obyg1009aoko05o5j0ew0"},{"post_id":"cln4obyf30028oko09ts6ekbs","tag_id":"cln4obyg10096oko0bezkfns4","_id":"cln4obyg1009coko0ae8o2cmd"},{"post_id":"cln4obyf30028oko09ts6ekbs","tag_id":"cln4obyg10097oko09c9d9t2a","_id":"cln4obyg1009doko017lia4lc"},{"post_id":"cln4obyf4002boko0c90100qh","tag_id":"cln4obyfj005coko0a27u6b2k","_id":"cln4obyg1009foko0gl71elqi"},{"post_id":"cln4obyf4002boko0c90100qh","tag_id":"cln4obyg1009boko06w4beigl","_id":"cln4obyg1009goko0azd2ezzh"},{"post_id":"cln4obyf4002doko081pe6hp0","tag_id":"cln4obyfm005voko0ebnqcnu7","_id":"cln4obyg2009loko06avp7hgl"},{"post_id":"cln4obyf4002doko081pe6hp0","tag_id":"cln4obyfl005uoko0aw3779gs","_id":"cln4obyg2009moko006tv3kc1"},{"post_id":"cln4obyf4002doko081pe6hp0","tag_id":"cln4obyg1009ioko0gg7tco4r","_id":"cln4obyg3009ooko0glwrbll3"},{"post_id":"cln4obyf4002doko081pe6hp0","tag_id":"cln4obyg2009joko08krladfl","_id":"cln4obyg3009poko0brpq6n7m"},{"post_id":"cln4obyf5002goko06uq18aps","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyg3009soko00qvn2it3"},{"post_id":"cln4obyf5002goko06uq18aps","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyg3009toko08i0b8jdj"},{"post_id":"cln4obyf5002goko06uq18aps","tag_id":"cln4obyg3009qoko0cn651b3w","_id":"cln4obyg3009voko08m7f23cj"},{"post_id":"cln4obyf5002ioko0au7d42v6","tag_id":"cln4obyg3009roko05kqj9rhu","_id":"cln4obyg4009yoko0ed105ytl"},{"post_id":"cln4obyf5002ioko0au7d42v6","tag_id":"cln4obyg3009uoko05vj9610g","_id":"cln4obyg4009zoko0fw3d3pad"},{"post_id":"cln4obyf5002ioko0au7d42v6","tag_id":"cln4obyg4009woko07rkcbdb6","_id":"cln4obyg400a1oko0553dczgn"},{"post_id":"cln4obyf6002loko07qa636nw","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyg500a3oko0arx4elh6"},{"post_id":"cln4obyf6002loko07qa636nw","tag_id":"cln4obyg400a0oko0hcm058xd","_id":"cln4obyg500a4oko00pbd93on"},{"post_id":"cln4obyf7002roko0gjnt49x5","tag_id":"cln4obyg400a2oko06rbr7rkj","_id":"cln4obyg500a6oko03juk84sl"},{"post_id":"cln4obyf7002voko07ln09w8r","tag_id":"cln4obyg10097oko09c9d9t2a","_id":"cln4obyg600aaoko03ffm2f0i"},{"post_id":"cln4obyf7002voko07ln09w8r","tag_id":"cln4obyg500a7oko05ese8whb","_id":"cln4obyg600aboko053bw7neg"},{"post_id":"cln4obyf7002voko07ln09w8r","tag_id":"cln4obyg500a8oko0hfx11cu2","_id":"cln4obyg600adoko0drqo1smh"},{"post_id":"cln4obyf90032oko03ow66itc","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyg600aeoko0e7n78y8f"},{"post_id":"cln4obyf90032oko03ow66itc","tag_id":"cln4obyg500a9oko094eefiwp","_id":"cln4obyg600agoko02me940z8"},{"post_id":"cln4obyfa0034oko0b2okccuw","tag_id":"cln4obyfm005woko06h7aczwa","_id":"cln4obyg700aioko0egsd3h5l"},{"post_id":"cln4obyfa0034oko0b2okccuw","tag_id":"cln4obyg600afoko0324pefp0","_id":"cln4obyg700ajoko09a5kg0wr"},{"post_id":"cln4obyfa0034oko0b2okccuw","tag_id":"cln4obyg700ahoko0094fg015","_id":"cln4obyg700akoko08n8r4iro"},{"post_id":"cln4obygh00amoko02r8ia768","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obygi00apoko03wct9zd3"},{"post_id":"cln4obygg00aloko092hr1ozm","tag_id":"cln4obygi00anoko0h7xy3kro","_id":"cln4obygm00b6oko0eg2ogbqo"},{"post_id":"cln4obygg00aloko092hr1ozm","tag_id":"cln4obygk00auoko0ew5l9qau","_id":"cln4obygn00b9oko09nohbbrm"},{"post_id":"cln4obygg00aloko092hr1ozm","tag_id":"cln4obygl00ayoko0c7g4a8cx","_id":"cln4obygo00bdoko0hhv30q5t"},{"post_id":"cln4obygi00aooko0evlmaeis","tag_id":"cln4obygm00b3oko024840wdq","_id":"cln4obygo00bgoko0cjgw1rvs"},{"post_id":"cln4obygp00bmoko06e55e2qs","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obygq00broko06qs07c13"},{"post_id":"cln4obygi00aqoko01uj5098h","tag_id":"cln4obygn00baoko00p0418i1","_id":"cln4obygq00bxoko0cvkqg85m"},{"post_id":"cln4obygi00aqoko01uj5098h","tag_id":"cln4obygo00bjoko05fh33w1g","_id":"cln4obygr00c0oko09q8cejqy"},{"post_id":"cln4obygi00aqoko01uj5098h","tag_id":"cln4obygp00booko0hfjw64ak","_id":"cln4obygr00c4oko0c6cl3obc"},{"post_id":"cln4obygj00asoko0ctp79eo3","tag_id":"cln4obygq00buoko03rov894b","_id":"cln4obygs00c7oko0fmb39qt5"},{"post_id":"cln4obygk00avoko05lpmhi95","tag_id":"cln4obygr00c1oko00zbqfarw","_id":"cln4obygu00cioko0dz8y52bc"},{"post_id":"cln4obygk00avoko05lpmhi95","tag_id":"cln4obygs00caoko0f8vdc35j","_id":"cln4obygu00cloko0dyjc2ptt"},{"post_id":"cln4obygx00czoko04ykd651a","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obygy00d4oko04sx30l6i"},{"post_id":"cln4obygl00axoko039iy1kiz","tag_id":"cln4obygt00cfoko0cplxa9ga","_id":"cln4obygy00d7oko03l2e18lq"},{"post_id":"cln4obygl00axoko039iy1kiz","tag_id":"cln4obygu00cmoko09wz333a2","_id":"cln4obygz00dboko0biga5pda"},{"post_id":"cln4obygl00axoko039iy1kiz","tag_id":"cln4obygv00croko03ekudvqk","_id":"cln4obyh000deoko0e7rb7k40"},{"post_id":"cln4obygl00axoko039iy1kiz","tag_id":"cln4obygx00cyoko0g5f2htf3","_id":"cln4obyh100dioko043vi6vle"},{"post_id":"cln4obygx00d1oko01vzifqgg","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh100dloko0d5fm5721"},{"post_id":"cln4obygl00azoko066h93056","tag_id":"cln4obygy00d3oko0hleo8yqa","_id":"cln4obyh200dpoko0f98yhh2g"},{"post_id":"cln4obygy00d8oko0grs88ez1","tag_id":"cln4obyep000voko07zdg3qel","_id":"cln4obyh300dsoko035vd0pc7"},{"post_id":"cln4obygy00d8oko0grs88ez1","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh300dvoko073e976li"},{"post_id":"cln4obygz00dcoko06zdsbodi","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh400dzoko069fa6rsy"},{"post_id":"cln4obygm00b1oko07rdt1v5y","tag_id":"cln4obygr00c1oko00zbqfarw","_id":"cln4obyh500e2oko0f3gx7xmd"},{"post_id":"cln4obyh100djoko0f515b8ii","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh500e6oko04h21fewz"},{"post_id":"cln4obygm00b4oko05ez0aioh","tag_id":"cln4obygr00c1oko00zbqfarw","_id":"cln4obyh600e9oko02ek7ha2k"},{"post_id":"cln4obyh300dtoko02up90jo7","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh700edoko0cf3b0fqx"},{"post_id":"cln4obyh300dxoko0aq8n03yw","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyh800egoko0cfw1a69s"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obyh200dooko02qq113y4","_id":"cln4obyh900emoko0bchidchz"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obyh300dwoko0aficcqee","_id":"cln4obyha00epoko0guyg9bd7"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obyfu007eoko055j9f0e8","_id":"cln4obyhb00etoko0d38a7ugs"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obyh500e5oko01l750ihw","_id":"cln4obyhc00ewoko063l75we3"},{"post_id":"cln4obygn00b7oko01rmaep60","tag_id":"cln4obygr00c1oko00zbqfarw","_id":"cln4obyhf00f0oko0dui4dbbf"},{"post_id":"cln4obyh800ehoko043fs54g2","tag_id":"cln4obyg3009roko05kqj9rhu","_id":"cln4obyhg00f3oko0dfw03xs4"},{"post_id":"cln4obyh900ekoko03fm38moi","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhg00f7oko0czmf6y05"},{"post_id":"cln4obygn00bboko04ivg7ado","tag_id":"cln4obyh900ejoko01g4qdynh","_id":"cln4obyhh00faoko06yok2tnt"},{"post_id":"cln4obyhb00eroko0f4qacnho","tag_id":"cln4obyfg004ooko07ymac5z3","_id":"cln4obyhh00fdoko09qk15bis"},{"post_id":"cln4obyhb00eroko0f4qacnho","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhh00fhoko07nu00z3f"},{"post_id":"cln4obygo00beoko0cvrs4xid","tag_id":"cln4obyhb00eqoko073txholr","_id":"cln4obyhi00fkoko08lzxcw6y"},{"post_id":"cln4obygo00beoko0cvrs4xid","tag_id":"cln4obyhc00exoko004mof98x","_id":"cln4obyhi00fooko0f0474gjt"},{"post_id":"cln4obygo00bhoko0ff58cnor","tag_id":"cln4obyhg00f6oko08flf968n","_id":"cln4obyhj00fuoko0aim382tt"},{"post_id":"cln4obygo00bhoko0ff58cnor","tag_id":"cln4obyhh00feoko00bwucyyq","_id":"cln4obyhk00fxoko0f2411fez"},{"post_id":"cln4obygo00bhoko0ff58cnor","tag_id":"cln4obyhi00floko0bd3s2ktw","_id":"cln4obyhk00g1oko0giwga4sr"},{"post_id":"cln4obygp00bkoko03c7x68kt","tag_id":"cln4obyhj00froko0b8h4eawz","_id":"cln4obyhl00g4oko02loqf0g5"},{"post_id":"cln4obygp00bkoko03c7x68kt","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhm00g8oko09kuo9bml"},{"post_id":"cln4obygp00bkoko03c7x68kt","tag_id":"cln4obyfc003loko0fhtf3q5i","_id":"cln4obyhm00gboko031v47d68"},{"post_id":"cln4obygp00bpoko04ksq9jyj","tag_id":"cln4obyhk00g0oko0cyrn3q95","_id":"cln4obyhn00ghoko06euv747w"},{"post_id":"cln4obygp00bpoko04ksq9jyj","tag_id":"cln4obyhm00g7oko07mek2oho","_id":"cln4obyho00gkoko07mls3l46"},{"post_id":"cln4obyhn00gfoko05tafeumv","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyho00gooko03ar9f4lb"},{"post_id":"cln4obyhn00gioko03c3q5piq","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhp00groko05f5319bc"},{"post_id":"cln4obygq00bsoko0b3m95fuz","tag_id":"cln4obyhn00geoko0co87ga9b","_id":"cln4obyhp00guoko0c9c3gfa8"},{"post_id":"cln4obygq00bsoko0b3m95fuz","tag_id":"cln4obyho00gloko0agncgbbh","_id":"cln4obyhp00gwoko01mnvghvg"},{"post_id":"cln4obygq00bvoko03fm2af8w","tag_id":"cln4obyhm00g7oko07mek2oho","_id":"cln4obyhq00h1oko0g4k5gydn"},{"post_id":"cln4obygq00bvoko03fm2af8w","tag_id":"cln4obyfa0036oko04fvq8k76","_id":"cln4obyhq00h2oko00n3pe97i"},{"post_id":"cln4obygq00bvoko03fm2af8w","tag_id":"cln4obyhp00gyoko0eiya3xam","_id":"cln4obyhq00h4oko01pjfgyrb"},{"post_id":"cln4obygr00byoko0f9geg7qr","tag_id":"cln4obyhp00h0oko0hd4b9qei","_id":"cln4obyhq00h7oko011385m7o"},{"post_id":"cln4obygr00byoko0f9geg7qr","tag_id":"cln4obyhq00h3oko0892wfye5","_id":"cln4obyhq00h8oko0ba1q68pw"},{"post_id":"cln4obygr00byoko0f9geg7qr","tag_id":"cln4obyhq00h5oko02cmc6kh8","_id":"cln4obyhq00haoko039gqgfvu"},{"post_id":"cln4obygr00c2oko0g5g17r02","tag_id":"cln4obyhq00h6oko00vm35evj","_id":"cln4obyhq00hboko0agcvfjsv"},{"post_id":"cln4obygr00c2oko0g5g17r02","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhq00hdoko0fijahwjy"},{"post_id":"cln4obygr00c5oko05iw6cb5r","tag_id":"cln4obyhq00h9oko0a9jqawsa","_id":"cln4obyhq00heoko047297k66"},{"post_id":"cln4obygr00c5oko05iw6cb5r","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhq00hgoko0dj4i27po"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhq00hcoko06tmmg8sv","_id":"cln4obyhr00hloko07pyzdixh"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhk00g0oko0cyrn3q95","_id":"cln4obyhr00hmoko027ucflw4"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhr00hhoko05p2xa8kt","_id":"cln4obyhr00hooko05nhy2576"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhr00hpoko0dzno7q03"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhr00hioko014us47ih","_id":"cln4obyhr00hroko0hf2f0ecm"},{"post_id":"cln4obygs00c8oko05vou10rf","tag_id":"cln4obyhr00hjoko0glsud9qz","_id":"cln4obyhr00hsoko0dcg1dmtc"},{"post_id":"cln4obygs00cboko02qmzgblk","tag_id":"cln4obyhr00hkoko010vhaw2x","_id":"cln4obyhr00huoko0b9ti4v9z"},{"post_id":"cln4obygs00cboko02qmzgblk","tag_id":"cln4obyhr00hnoko05k0eeu7n","_id":"cln4obyhs00hvoko0bjw002co"},{"post_id":"cln4obygt00cdoko01rbg7j16","tag_id":"cln4obyhr00hqoko047a67als","_id":"cln4obyhs00hwoko0gme4cwqp"},{"post_id":"cln4obygt00cgoko0g20id478","tag_id":"cln4obyhr00htoko0hr397al8","_id":"cln4obyhs00hzoko02jb81qxi"},{"post_id":"cln4obygt00cgoko0g20id478","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhs00i0oko09ri3atyo"},{"post_id":"cln4obygt00cgoko0g20id478","tag_id":"cln4obyhs00hxoko08x5zfo9k","_id":"cln4obyhs00i2oko0cf2qcp1e"},{"post_id":"cln4obygu00cjoko08k2w4av4","tag_id":"cln4obyhs00hyoko0dkp055d9","_id":"cln4obyhs00i4oko041le11kk"},{"post_id":"cln4obygu00cjoko08k2w4av4","tag_id":"cln4obyhs00i1oko06vki51rt","_id":"cln4obyht00i5oko0ges5adfu"},{"post_id":"cln4obygu00cjoko08k2w4av4","tag_id":"cln4obyfg004moko0dahvcxw1","_id":"cln4obyht00i7oko04knhgk72"},{"post_id":"cln4obygu00cjoko08k2w4av4","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyht00i8oko0gbutdq34"},{"post_id":"cln4obygu00cnoko0c80rcm8v","tag_id":"cln4obyhq00h6oko00vm35evj","_id":"cln4obyht00iaoko00x924jcc"},{"post_id":"cln4obygv00cpoko00gjxbw2h","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyht00iboko05j475fax"},{"post_id":"cln4obygv00cpoko00gjxbw2h","tag_id":"cln4obyht00i6oko04eni0r5l","_id":"cln4obyht00idoko06xkz635g"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyhs00hyoko0dkp055d9","_id":"cln4obyhu00ihoko0gfko06uq"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyht00icoko026fv9qiv","_id":"cln4obyhu00iioko01to47bro"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyhs00i1oko06vki51rt","_id":"cln4obyhu00ikoko0e95w2xlm"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyht00ifoko01uhp2hhr","_id":"cln4obyhu00iloko074omgohw"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhu00inoko0ffltfwtz"},{"post_id":"cln4obygv00csoko0btaq8ef7","tag_id":"cln4obyfg004noko0a0wseddv","_id":"cln4obyhu00iooko070ufe390"},{"post_id":"cln4obygw00cuoko09nzsflwl","tag_id":"cln4obyht00igoko0cn0hgm4c","_id":"cln4obyhu00iqoko025bv4na8"},{"post_id":"cln4obygw00cuoko09nzsflwl","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhu00iroko0b9neef0j"},{"post_id":"cln4obygx00cwoko009q83i3o","tag_id":"cln4obyhu00ijoko072mxhbvv","_id":"cln4obyhu00itoko0067u2xvm"},{"post_id":"cln4obygx00cwoko009q83i3o","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhu00iuoko088sdb31x"},{"post_id":"cln4obygy00d5oko08ebcgf9r","tag_id":"cln4obyhu00imoko0eopf6lvw","_id":"cln4obyhv00iwoko04nch5ibm"},{"post_id":"cln4obygy00d5oko08ebcgf9r","tag_id":"cln4obyhm00g7oko07mek2oho","_id":"cln4obyhv00ixoko09pd90c47"},{"post_id":"cln4obygy00d5oko08ebcgf9r","tag_id":"cln4obyhu00isoko0eyuc6zai","_id":"cln4obyhv00izoko057lphwb5"},{"post_id":"cln4obyh000dfoko091xdhsru","tag_id":"cln4obyhv00ivoko07wd4g3nj","_id":"cln4obyhv00j1oko05fkv4urr"},{"post_id":"cln4obyh000dfoko091xdhsru","tag_id":"cln4obyhv00iyoko07wgu9tni","_id":"cln4obyhv00j2oko0edeq8xtu"},{"post_id":"cln4obyh100dmoko02qj9fqke","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhv00j4oko0d43o70cw"},{"post_id":"cln4obyh100dmoko02qj9fqke","tag_id":"cln4obyhv00j0oko06a2n3bbn","_id":"cln4obyhv00j5oko0744oc1d2"},{"post_id":"cln4obyh200dqoko0hanoeoxo","tag_id":"cln4obyhv00j3oko0g2k66fr5","_id":"cln4obyhv00j7oko0cy7ldaci"},{"post_id":"cln4obyh200dqoko0hanoeoxo","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhv00j8oko06eabhi07"},{"post_id":"cln4obyh400e0oko0e4rr7rn9","tag_id":"cln4obyhv00j6oko0c7ut038k","_id":"cln4obyhw00jaoko0901y7i76"},{"post_id":"cln4obyh400e0oko0e4rr7rn9","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhw00jboko07ngobm2j"},{"post_id":"cln4obyh500e3oko061ca3uey","tag_id":"cln4obyhv00j9oko0dzgo1bf6","_id":"cln4obyhw00jdoko0hton7n2v"},{"post_id":"cln4obyh500e7oko08s7t4jc0","tag_id":"cln4obyhw00jcoko01q29cum5","_id":"cln4obyhw00jfoko09f3f7qu9"},{"post_id":"cln4obyh600eaoko02f4m5jpj","tag_id":"cln4obyhw00jeoko08367cay7","_id":"cln4obyhw00jjoko0243p6q7z"},{"post_id":"cln4obyh600eaoko02f4m5jpj","tag_id":"cln4obyhw00jgoko0dx3a427q","_id":"cln4obyhw00jkoko0gcf72br1"},{"post_id":"cln4obyh600eaoko02f4m5jpj","tag_id":"cln4obyhw00jhoko0dl4n4kms","_id":"cln4obyhw00jmoko056eaf0rt"},{"post_id":"cln4obyh700eeoko0c2cc6kbe","tag_id":"cln4obyhw00jioko04sof0ooy","_id":"cln4obyhx00jnoko0250u2o8v"},{"post_id":"cln4obyh700eeoko0c2cc6kbe","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhx00jpoko02e338xpo"},{"post_id":"cln4obyha00enoko04qe92oak","tag_id":"cln4obyhr00htoko0hr397al8","_id":"cln4obyhx00jqoko03ujqgsm9"},{"post_id":"cln4obyha00enoko04qe92oak","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhx00jsoko0fuya6m5q"},{"post_id":"cln4obyhb00euoko0fwkeeu7o","tag_id":"cln4obyhx00jooko09i1i5rrw","_id":"cln4obyhx00juoko0bxizd59l"},{"post_id":"cln4obyhb00euoko0fwkeeu7o","tag_id":"cln4obyhx00jroko0gr6oajxl","_id":"cln4obyhx00jvoko0g7o89dt8"},{"post_id":"cln4obyhb00euoko0fwkeeu7o","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhx00jxoko012ixbloc"},{"post_id":"cln4obyhc00eyoko0h93khtt7","tag_id":"cln4obyhx00jtoko0hll9cjhu","_id":"cln4obyhy00k0oko08wzgfipv"},{"post_id":"cln4obyhc00eyoko0h93khtt7","tag_id":"cln4obyhx00jwoko0828m7338","_id":"cln4obyhy00k1oko0ewcobl5v"},{"post_id":"cln4obyhc00eyoko0h93khtt7","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhy00k3oko0alad2i69"},{"post_id":"cln4obyhc00eyoko0h93khtt7","tag_id":"cln4obyhx00jyoko0difn5lii","_id":"cln4obyhy00k6oko0hwy8axgz"},{"post_id":"cln4obyhf00f1oko0051d659o","tag_id":"cln4obygs00caoko0f8vdc35j","_id":"cln4obyhy00k7oko0dm17a0x3"},{"post_id":"cln4obyhf00f1oko0051d659o","tag_id":"cln4obyhx00jzoko0anvzdb59","_id":"cln4obyhy00kaoko0d9242rsv"},{"post_id":"cln4obyhg00f4oko0c91sbrhj","tag_id":"cln4obygs00caoko0f8vdc35j","_id":"cln4obyhy00kcoko0f2ct1yca"},{"post_id":"cln4obyhg00f4oko0c91sbrhj","tag_id":"cln4obyhx00jzoko0anvzdb59","_id":"cln4obyhy00kdoko0hw559nru"},{"post_id":"cln4obyhg00f4oko0c91sbrhj","tag_id":"cln4obygl00ayoko0c7g4a8cx","_id":"cln4obyhy00keoko0f1p1fowg"},{"post_id":"cln4obyhg00f8oko0dpxihe04","tag_id":"cln4obyhy00k5oko0d1j17k4l","_id":"cln4obyhz00kgoko0hqmpfbhm"},{"post_id":"cln4obyhg00f8oko0dpxihe04","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyhz00khoko0adi8310p"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhy00k8oko01jpc4umq","_id":"cln4obyhz00kloko01fxv1soz"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhy00kboko0d07sezeq","_id":"cln4obyhz00kmoko0fcgb1ek9"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhy00kfoko001ew9b1c","_id":"cln4obyhz00kooko08vdy2fv0"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhz00kioko07krk0pyu","_id":"cln4obyhz00kpoko0fgrfbuhi"},{"post_id":"cln4obyhh00fboko02q2x30mc","tag_id":"cln4obyhz00kjoko04dxz3xhh","_id":"cln4obyhz00kroko06gvd52n9"},{"post_id":"cln4obyhh00ffoko0fofe62zd","tag_id":"cln4obyhv00j9oko0dzgo1bf6","_id":"cln4obyhz00ksoko0cr2abja9"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyhz00knoko0b9ud9me7","_id":"cln4obyi000kwoko021fcefel"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyhz00kqoko03fjkct9p","_id":"cln4obyi000kxoko06d9d4d97"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyhz00ktoko05uchd6jh","_id":"cln4obyi000kzoko0hhv96gl4"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi000l0oko04g7v6eng"},{"post_id":"cln4obyhi00fioko0d3mecfeg","tag_id":"cln4obyhq00h5oko02cmc6kh8","_id":"cln4obyi000l2oko0bxjcbksz"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","tag_id":"cln4obyi000kvoko0a9qy8nhz","_id":"cln4obyi100l5oko0f2uq3na1"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","tag_id":"cln4obyi000kyoko0hkwpatkz","_id":"cln4obyi100l6oko04pm6erwg"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","tag_id":"cln4obyi000l1oko019gw19fq","_id":"cln4obyi100l8oko03e4u2yr3"},{"post_id":"cln4obyhi00fmoko0b6jtb4fq","tag_id":"cln4obyhz00kjoko04dxz3xhh","_id":"cln4obyi100l9oko0get335bc"},{"post_id":"cln4obyhi00fpoko08kqtatpb","tag_id":"cln4obyhv00j9oko0dzgo1bf6","_id":"cln4obyi100lboko04vnsek9t"},{"post_id":"cln4obyhi00fpoko08kqtatpb","tag_id":"cln4obyi100l7oko0822f9pa9","_id":"cln4obyi100lcoko01rj9ehn2"},{"post_id":"cln4obyhj00fsoko05rs764v5","tag_id":"cln4obyi100laoko01faxe2hc","_id":"cln4obyi200leoko00vgg6tr2"},{"post_id":"cln4obyhj00fvoko07p789xfu","tag_id":"cln4obyi100laoko01faxe2hc","_id":"cln4obyi200lhoko0aqpa5oxi"},{"post_id":"cln4obyhj00fvoko07p789xfu","tag_id":"cln4obyi200lfoko0f9um3dij","_id":"cln4obyi200lioko02j6x1oie"},{"post_id":"cln4obyhk00fyoko08mj1164d","tag_id":"cln4obyi200lgoko00v7g7uqq","_id":"cln4obyi300lloko0dh6s1xz9"},{"post_id":"cln4obyhk00fyoko08mj1164d","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi300lmoko004tb34sd"},{"post_id":"cln4obyhk00fyoko08mj1164d","tag_id":"cln4obyi200ljoko0agp762o6","_id":"cln4obyi300looko0cx8x2l85"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyi200lkoko06xkp4gri","_id":"cln4obyi300ltoko0fjet4lt3"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyi300lnoko0cq1pf3k2","_id":"cln4obyi300luoko0dkq36k42"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyhz00kjoko04dxz3xhh","_id":"cln4obyi400lwoko0c75uh2lp"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyi300lqoko0cwt271wk","_id":"cln4obyi400lxoko0ein2597m"},{"post_id":"cln4obyhl00g2oko0effdh6o6","tag_id":"cln4obyi300lroko0dbp458bo","_id":"cln4obyi400lzoko03a3425y8"},{"post_id":"cln4obyhl00g5oko09tei1t3o","tag_id":"cln4obyhz00kjoko04dxz3xhh","_id":"cln4obyi400m1oko07s1pclq4"},{"post_id":"cln4obyhl00g5oko09tei1t3o","tag_id":"cln4obyi300lroko0dbp458bo","_id":"cln4obyi400m2oko092ku1r60"},{"post_id":"cln4obyhl00g5oko09tei1t3o","tag_id":"cln4obyi400lyoko0bg964th9","_id":"cln4obyi400m4oko09nugftmz"},{"post_id":"cln4obyhm00g9oko08z1r71at","tag_id":"cln4obyi400m0oko0g6ua29ar","_id":"cln4obyi400m5oko08l0q7ldl"},{"post_id":"cln4obyhm00g9oko08z1r71at","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi500m7oko01fv23zlc"},{"post_id":"cln4obyhm00gcoko081xv48y9","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi500m8oko0dzyj2x8j"},{"post_id":"cln4obyhm00gcoko081xv48y9","tag_id":"cln4obyi400m3oko017nb7bw9","_id":"cln4obyi500maoko0bkrif4xt"},{"post_id":"cln4obyhm00gcoko081xv48y9","tag_id":"cln4obyev001hoko0ak9bd2re","_id":"cln4obyi500mboko09gt22d51"},{"post_id":"cln4obyho00gmoko02ixqh8db","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi500mdoko0fp6zaow4"},{"post_id":"cln4obyho00gmoko02ixqh8db","tag_id":"cln4obyi400m6oko00vex2z6w","_id":"cln4obyi500meoko071jh1k4v"},{"post_id":"cln4obyho00gmoko02ixqh8db","tag_id":"cln4obyi500m9oko082bn60ln","_id":"cln4obyi500mfoko02y3q1ro6"},{"post_id":"cln4obyho00gpoko0e5c3cfiw","tag_id":"cln4obyen000poko08lgae8pc","_id":"cln4obyi500mgoko027qigax5"},{"post_id":"cln4obyho00gpoko0e5c3cfiw","tag_id":"cln4obyi500mcoko023m7eg2b","_id":"cln4obyi500mhoko0frqi926k"}],"Tag":[{"name":"hexo","_id":"cln4obyeb0004oko0cugx8sp1"},{"name":"台风","_id":"cln4obyeh000coko0h97kfin2"},{"name":"山竹","_id":"cln4obyek000ioko0ckyl1g8e"},{"name":"生活","_id":"cln4obyen000poko08lgae8pc"},{"name":"十年","_id":"cln4obyep000voko07zdg3qel"},{"name":"时光沉淀","_id":"cln4obyer0014oko0g1swad00"},{"name":"论坛","_id":"cln4obyev001hoko0ak9bd2re"},{"name":"求婚","_id":"cln4obyf0001ooko09ly74alq"},{"name":"狗尾续貂","_id":"cln4obyf1001woko02sl8dwge"},{"name":"求婚大作战","_id":"cln4obyf30024oko0dopf8gre"},{"name":"张艺兴","_id":"cln4obyf40029oko08j9dg6hj"},{"name":"陈都灵","_id":"cln4obyf5002foko0e4ol5ti1"},{"name":"网剧","_id":"cln4obyf6002koko07m797b51"},{"name":"开头","_id":"cln4obyf7002soko0bd22hvxk"},{"name":"邵庄","_id":"cln4obyf9002zoko0dbcf6394"},{"name":"珠海","_id":"cln4obyfa0036oko04fvq8k76"},{"name":"官塘","_id":"cln4obyfb003coko070mn9c8u"},{"name":"note4x","_id":"cln4obyfb003goko0a9xwaadv"},{"name":"红米","_id":"cln4obyfb003hoko0cnjrfp1q"},{"name":"神雕","_id":"cln4obyfc003ioko05ozmbwp6"},{"name":"金庸","_id":"cln4obyfc003loko0fhtf3q5i"},{"name":"影视剧","_id":"cln4obyfc003ooko0f4pxcut5"},{"name":"作品","_id":"cln4obyfc003poko0c10rcgmq"},{"name":"完稿","_id":"cln4obyfc003qoko099apdqud"},{"name":"小说","_id":"cln4obyfc003roko0g8t19lrn"},{"name":"旷世奇恋","_id":"cln4obyfd003soko0degl63a9"},{"name":"养女","_id":"cln4obyfd003toko0es181r6c"},{"name":"何沅君","_id":"cln4obyfd003uoko0aizfbxd0"},{"name":"小龙女","_id":"cln4obyfd003voko0fre2ad9o"},{"name":"杨过","_id":"cln4obyfe003woko0edfve527"},{"name":"wget","_id":"cln4obyfe003xoko0bip1enfz"},{"name":"shadowsocks","_id":"cln4obyfe0040oko0af41d34o"},{"name":"阴雨天","_id":"cln4obyfe0046oko0ars92dgk"},{"name":"绵羊","_id":"cln4obyff0049oko0f3v0232s"},{"name":"SNH48","_id":"cln4obyff004doko0185sdz6m"},{"name":"rng","_id":"cln4obyff004goko02i8j40a7"},{"name":"LOL","_id":"cln4obyff004joko02hoa364n"},{"name":"S8","_id":"cln4obyfg004moko0dahvcxw1"},{"name":"英雄联盟","_id":"cln4obyfg004noko0a0wseddv"},{"name":"拳头","_id":"cln4obyfg004ooko07ymac5z3"},{"name":"父亲节","_id":"cln4obyfg004poko06sf1af7e"},{"name":"演技","_id":"cln4obyfg004soko03zulb32n"},{"name":"剧情","_id":"cln4obyfh004voko0e9crhizc"},{"name":"版本","_id":"cln4obyfi0051oko079h22g02"},{"name":"倚天屠龙记","_id":"cln4obyfi0052oko0gnlq89d7"},{"name":"列表","_id":"cln4obyfi0056oko094np55j3"},{"name":"文件","_id":"cln4obyfi0059oko00rgk866o"},{"name":"命令","_id":"cln4obyfj005coko0a27u6b2k"},{"name":"安装","_id":"cln4obyfj005eoko0dwqg658o"},{"name":"ssr","_id":"cln4obyfj005foko01rim391a"},{"name":"service","_id":"cln4obyfj005goko09lv9b8wv"},{"name":"硬盘","_id":"cln4obyfk005hoko05ng1gf0f"},{"name":"opencore","_id":"cln4obyfl005koko0d5ancnga"},{"name":"网卡","_id":"cln4obyfl005noko0ctv2d2gg"},{"name":"i5","_id":"cln4obyfl005qoko01e199bsl"},{"name":"主板","_id":"cln4obyfl005soko03falbgx1"},{"name":"nvme","_id":"cln4obyfl005toko00fhudbgf"},{"name":"精粤","_id":"cln4obyfl005uoko0aw3779gs"},{"name":"黑苹果","_id":"cln4obyfm005voko0ebnqcnu7"},{"name":"macos","_id":"cln4obyfm005woko06h7aczwa"},{"name":"笔记本","_id":"cln4obyfn0065oko0b3kx7l6g"},{"name":"clover","_id":"cln4obyfo0068oko07o9sh7is"},{"name":"edid","_id":"cln4obyfo0069oko0fyyt2ksn"},{"name":"hackintool","_id":"cln4obyfo006aoko0df8sc5z0"},{"name":"固态","_id":"cln4obyfo006boko0c5o43ryw"},{"name":"夏普屏","_id":"cln4obyfq006moko070yy5gmd"},{"name":"厂商","_id":"cln4obyfq006ooko0enb94e1q"},{"name":"主控","_id":"cln4obyfr006uoko0hessa6jp"},{"name":"开卡","_id":"cln4obyfr006xoko0dkq4addp"},{"name":"硬盘盒","_id":"cln4obyfr006yoko06ansck8z"},{"name":"驱动","_id":"cln4obyfs006zoko084p22ij4"},{"name":"bios","_id":"cln4obyft0078oko0g6r210tk"},{"name":"编程器","_id":"cln4obyft0079oko0fwb0d0rq"},{"name":"焊盘","_id":"cln4obyft007aoko0e1jm5vb9"},{"name":"zip","_id":"cln4obyft007boko00uxp590r"},{"name":"下载","_id":"cln4obyfu007eoko055j9f0e8"},{"name":"地址","_id":"cln4obyfu007hoko01llt1ldr"},{"name":"苹果","_id":"cln4obyfu007koko0e8r9gb7f"},{"name":"情况","_id":"cln4obyfv007ooko0ewfb33jv"},{"name":"归档","_id":"cln4obyfw007soko08mdv34vx"},{"name":"无声","_id":"cln4obyfw007toko00utj1uy9"},{"name":"扬声器","_id":"cln4obyfw007uoko088ga8hga"},{"name":"修复","_id":"cln4obyfx007voko00nwcep58"},{"name":"vk22t","_id":"cln4obyfy0085oko0houqbjg3"},{"name":"颗粒","_id":"cln4obyfz008foko0gfl2euzj"},{"name":"打赏","_id":"cln4obyfz008goko0bs5ob868"},{"name":"海力士","_id":"cln4obyfz008hoko06lk1dais"},{"name":"显卡","_id":"cln4obyfz008loko078j52vrf"},{"name":"免驱","_id":"cln4obyfz008ooko0aomf7hch"},{"name":"amd","_id":"cln4obyfz008roko01nqx0fsq"},{"name":"samsung","_id":"cln4obyg0008zoko08cww9qhw"},{"name":"vk22","_id":"cln4obyg10096oko0bezkfns4"},{"name":"nec","_id":"cln4obyg10097oko09c9d9t2a"},{"name":"linux","_id":"cln4obyg1009boko06w4beigl"},{"name":"h97i","_id":"cln4obyg1009ioko0gg7tco4r"},{"name":"bcm943224","_id":"cln4obyg2009joko08krladfl"},{"name":"fliqlo","_id":"cln4obyg3009qoko0cn651b3w"},{"name":"typecho","_id":"cln4obyg3009roko05kqj9rhu"},{"name":"chajian","_id":"cln4obyg3009uoko05vj9610g"},{"name":"CommentsByQQ","_id":"cln4obyg4009woko07rkcbdb6"},{"name":"homebrew","_id":"cln4obyg400a0oko0hcm058xd"},{"name":"office","_id":"cln4obyg400a2oko06rbr7rkj"},{"name":"vk23","_id":"cln4obyg500a7oko05ese8whb"},{"name":"测评","_id":"cln4obyg500a8oko0hfx11cu2"},{"name":"疫情","_id":"cln4obyg500a9oko094eefiwp"},{"name":"时间同步","_id":"cln4obyg600afoko0324pefp0"},{"name":"windows","_id":"cln4obyg700ahoko0094fg015"},{"name":"chatgpt","_id":"cln4obygi00anoko0h7xy3kro"},{"name":"注册","_id":"cln4obygk00auoko0ew5l9qau"},{"name":"教程","_id":"cln4obygl00ayoko0c7g4a8cx"},{"name":"虚拟信用卡","_id":"cln4obygm00b3oko024840wdq"},{"name":"黑群晖","_id":"cln4obygn00baoko00p0418i1"},{"name":"镜像","_id":"cln4obygo00bjoko05fh33w1g"},{"name":"DSM918","_id":"cln4obygp00booko0hfjw64ak"},{"name":"git","_id":"cln4obygq00buoko03rov894b"},{"name":"centos","_id":"cln4obygr00c1oko00zbqfarw"},{"name":"VPS","_id":"cln4obygs00caoko0f8vdc35j"},{"name":"openwrt","_id":"cln4obygt00cfoko0cplxa9ga"},{"name":"lede","_id":"cln4obygu00cmoko09wz333a2"},{"name":"软路由","_id":"cln4obygv00croko03ekudvqk"},{"name":"科学上网","_id":"cln4obygx00cyoko0g5f2htf3"},{"name":"Linux","_id":"cln4obygy00d3oko0hleo8yqa"},{"name":"torrent","_id":"cln4obyh200dooko02qq113y4"},{"name":"磁力","_id":"cln4obyh300dwoko0aficcqee"},{"name":"cloud torrent","_id":"cln4obyh500e5oko01l750ihw"},{"name":"edge","_id":"cln4obyh900ejoko01g4qdynh"},{"name":"V2RAY","_id":"cln4obyhb00eqoko073txholr"},{"name":"梯子","_id":"cln4obyhc00exoko004mof98x"},{"name":"魔趣","_id":"cln4obyhg00f6oko08flf968n"},{"name":"安卓","_id":"cln4obyhh00feoko00bwucyyq"},{"name":"刷机","_id":"cln4obyhi00floko0bd3s2ktw"},{"name":"武侠","_id":"cln4obyhj00froko0b8h4eawz"},{"name":"上海","_id":"cln4obyhk00g0oko0cyrn3q95"},{"name":"影像","_id":"cln4obyhm00g7oko07mek2oho"},{"name":"中元节","_id":"cln4obyhn00geoko0co87ga9b"},{"name":"鬼节","_id":"cln4obyho00gloko0agncgbbh"},{"name":"雨天","_id":"cln4obyhp00gyoko0eiya3xam"},{"name":"中国","_id":"cln4obyhp00h0oko0hd4b9qei"},{"name":"吐槽","_id":"cln4obyhq00h3oko0892wfye5"},{"name":"相亲","_id":"cln4obyhq00h5oko02cmc6kh8"},{"name":"中秋节","_id":"cln4obyhq00h6oko00vm35evj"},{"name":"生日","_id":"cln4obyhq00h9oko0a9jqawsa"},{"name":"2018","_id":"cln4obyhq00hcoko06tmmg8sv"},{"name":"新年","_id":"cln4obyhr00hhoko05p2xa8kt"},{"name":"规划","_id":"cln4obyhr00hioko014us47ih"},{"name":"过年","_id":"cln4obyhr00hjoko0glsud9qz"},{"name":"Docker","_id":"cln4obyhr00hkoko010vhaw2x"},{"name":"Pleroma","_id":"cln4obyhr00hnoko05k0eeu7n"},{"name":"cloudflare","_id":"cln4obyhr00hqoko047a67als"},{"name":"爱情","_id":"cln4obyhr00htoko0hr397al8"},{"name":"网恋","_id":"cln4obyhs00hxoko08x5zfo9k"},{"name":"lol","_id":"cln4obyhs00hyoko0dkp055d9"},{"name":"RNG","_id":"cln4obyhs00i1oko06vki51rt"},{"name":"而立","_id":"cln4obyht00i6oko04eni0r5l"},{"name":"LPL","_id":"cln4obyht00icoko026fv9qiv"},{"name":"UZI","_id":"cln4obyht00ifoko01uhp2hhr"},{"name":"下班","_id":"cln4obyht00igoko0cn0hgm4c"},{"name":"感恩","_id":"cln4obyhu00ijoko072mxhbvv"},{"name":"冬日","_id":"cln4obyhu00imoko0eopf6lvw"},{"name":"武汉","_id":"cln4obyhu00isoko0eyuc6zai"},{"name":"memos","_id":"cln4obyhv00ivoko07wd4g3nj"},{"name":"Hexo","_id":"cln4obyhv00iyoko07wgu9tni"},{"name":"结婚","_id":"cln4obyhv00j0oko06a2n3bbn"},{"name":"H2","_id":"cln4obyhv00j3oko0g2k66fr5"},{"name":"圣诞节","_id":"cln4obyhv00j6oko0c7ut038k"},{"name":"Memos","_id":"cln4obyhv00j9oko0dzgo1bf6"},{"name":"artalk","_id":"cln4obyhw00jcoko01q29cum5"},{"name":"Gotosocial","_id":"cln4obyhw00jeoko08367cay7"},{"name":"fly.io","_id":"cln4obyhw00jgoko0dx3a427q"},{"name":"部署","_id":"cln4obyhw00jhoko0dl4n4kms"},{"name":"女子","_id":"cln4obyhw00jioko04sof0ooy"},{"name":"平庸","_id":"cln4obyhx00jooko09i1i5rrw"},{"name":"我","_id":"cln4obyhx00jroko0gr6oajxl"},{"name":"平凡","_id":"cln4obyhx00jtoko0hll9cjhu"},{"name":"梦想","_id":"cln4obyhx00jwoko0828m7338"},{"name":"老男孩","_id":"cln4obyhx00jyoko0difn5lii"},{"name":"搬瓦工","_id":"cln4obyhx00jzoko0anvzdb59"},{"name":"元旦","_id":"cln4obyhy00k5oko0d1j17k4l"},{"name":"MR.NEVERDIE","_id":"cln4obyhy00k8oko01jpc4umq"},{"name":"九把刀","_id":"cln4obyhy00kboko0d07sezeq"},{"name":"无与伦比的自由","_id":"cln4obyhy00kfoko001ew9b1c"},{"name":"杀手","_id":"cln4obyhz00kioko07krk0pyu"},{"name":"笔记","_id":"cln4obyhz00kjoko04dxz3xhh"},{"name":"七夕","_id":"cln4obyhz00knoko0b9ud9me7"},{"name":"情人节","_id":"cln4obyhz00kqoko03fjkct9p"},{"name":"现实","_id":"cln4obyhz00ktoko05uchd6jh"},{"name":"AppleALC","_id":"cln4obyi000kvoko0a9qy8nhz"},{"name":"macOS","_id":"cln4obyi000kyoko0hkwpatkz"},{"name":"xcode","_id":"cln4obyi000l1oko019gw19fq"},{"name":"Twikoo","_id":"cln4obyi100l7oko0822f9pa9"},{"name":"群晖","_id":"cln4obyi100laoko01faxe2hc"},{"name":"docker","_id":"cln4obyi200lfoko0f9um3dij"},{"name":"古龙","_id":"cln4obyi200lgoko00v7g7uqq"},{"name":"荒唐","_id":"cln4obyi200ljoko0agp762o6"},{"name":"太上老君","_id":"cln4obyi200lkoko06xkp4gri"},{"name":"封神演义","_id":"cln4obyi300lnoko0cq1pf3k2"},{"name":"老子","_id":"cln4obyi300lqoko0cwt271wk"},{"name":"西游记","_id":"cln4obyi300lroko0dbp458bo"},{"name":"谜","_id":"cln4obyi400lyoko0bg964th9"},{"name":"心情","_id":"cln4obyi400m0oko0g6ua29ar"},{"name":"社交","_id":"cln4obyi400m3oko017nb7bw9"},{"name":"阿里","_id":"cln4obyi400m6oko00vex2z6w"},{"name":"阿里悟空","_id":"cln4obyi500m9oko082bn60ln"},{"name":"黄易","_id":"cln4obyi500mcoko023m7eg2b"}]}} \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 24aa528e..b23c2e68 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -3017,6 +3017,15 @@ "node": ">=8" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -3097,6 +3106,15 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, + "node_modules/buildcheck": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -3519,6 +3537,19 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -3902,6 +3933,20 @@ "node": ">= 6" } }, + "node_modules/cpu-features": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.9.tgz", + "integrity": "sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.17.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4833,6 +4878,12 @@ "fxparser": "src/cli/cli.js" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -5025,6 +5076,24 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, "node_modules/ftp-deploy": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/ftp-deploy/-/ftp-deploy-2.4.5.tgz", @@ -11895,6 +11964,19 @@ "rollup": "^2.0.0" } }, + "node_modules/rollup/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", diff --git a/node_modules/bindings/LICENSE.md b/node_modules/bindings/LICENSE.md new file mode 100644 index 00000000..5a92289f --- /dev/null +++ b/node_modules/bindings/LICENSE.md @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/bindings/README.md b/node_modules/bindings/README.md new file mode 100644 index 00000000..5b3e7a81 --- /dev/null +++ b/node_modules/bindings/README.md @@ -0,0 +1,98 @@ +node-bindings +============= +### Helper module for loading your native module's `.node` file + +This is a helper module for authors of Node.js native addon modules. +It is basically the "swiss army knife" of `require()`ing your native module's +`.node` file. + +Throughout the course of Node's native addon history, addons have ended up being +compiled in a variety of different places, depending on which build tool and which +version of node was used. To make matters worse, now the `gyp` build tool can +produce either a __Release__ or __Debug__ build, each being built into different +locations. + +This module checks _all_ the possible locations that a native addon would be built +at, and returns the first one that loads successfully. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install --save bindings +``` + +Or add it to the `"dependencies"` section of your `package.json` file. + + +Example +------- + +`require()`ing the proper bindings file for the current node version, platform +and architecture is as simple as: + +``` js +var bindings = require('bindings')('binding.node') + +// Use your bindings defined in your C files +bindings.your_c_function() +``` + + +Nice Error Output +----------------- + +When the `.node` file could not be loaded, `node-bindings` throws an Error with +a nice error message telling you exactly what was tried. You can also check the +`err.tries` Array property. + +``` +Error: Could not load the bindings file. Tried: + → /Users/nrajlich/ref/build/binding.node + → /Users/nrajlich/ref/build/Debug/binding.node + → /Users/nrajlich/ref/build/Release/binding.node + → /Users/nrajlich/ref/out/Debug/binding.node + → /Users/nrajlich/ref/Debug/binding.node + → /Users/nrajlich/ref/out/Release/binding.node + → /Users/nrajlich/ref/Release/binding.node + → /Users/nrajlich/ref/build/default/binding.node + → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node + at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13) + at Object. (/Users/nrajlich/ref/lib/ref.js:5:47) + at Module._compile (module.js:449:26) + at Object.Module._extensions..js (module.js:467:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + ... +``` + +The searching for the `.node` file will originate from the first directory in which has a `package.json` file is found. + +License +------- + +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/bindings/bindings.js b/node_modules/bindings/bindings.js new file mode 100644 index 00000000..727413a1 --- /dev/null +++ b/node_modules/bindings/bindings.js @@ -0,0 +1,221 @@ +/** + * Module dependencies. + */ + +var fs = require('fs'), + path = require('path'), + fileURLToPath = require('file-uri-to-path'), + join = path.join, + dirname = path.dirname, + exists = + (fs.accessSync && + function(path) { + try { + fs.accessSync(path); + } catch (e) { + return false; + } + return true; + }) || + fs.existsSync || + path.existsSync, + defaults = { + arrow: process.env.NODE_BINDINGS_ARROW || ' → ', + compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled', + platform: process.platform, + arch: process.arch, + nodePreGyp: + 'node-v' + + process.versions.modules + + '-' + + process.platform + + '-' + + process.arch, + version: process.versions.node, + bindings: 'bindings.node', + try: [ + // node-gyp's linked version in the "build" dir + ['module_root', 'build', 'bindings'], + // node-waf and gyp_addon (a.k.a node-gyp) + ['module_root', 'build', 'Debug', 'bindings'], + ['module_root', 'build', 'Release', 'bindings'], + // Debug files, for development (legacy behavior, remove for node v0.9) + ['module_root', 'out', 'Debug', 'bindings'], + ['module_root', 'Debug', 'bindings'], + // Release files, but manually compiled (legacy behavior, remove for node v0.9) + ['module_root', 'out', 'Release', 'bindings'], + ['module_root', 'Release', 'bindings'], + // Legacy from node-waf, node <= 0.4.x + ['module_root', 'build', 'default', 'bindings'], + // Production "Release" buildtype binary (meh...) + ['module_root', 'compiled', 'version', 'platform', 'arch', 'bindings'], + // node-qbs builds + ['module_root', 'addon-build', 'release', 'install-root', 'bindings'], + ['module_root', 'addon-build', 'debug', 'install-root', 'bindings'], + ['module_root', 'addon-build', 'default', 'install-root', 'bindings'], + // node-pre-gyp path ./lib/binding/{node_abi}-{platform}-{arch} + ['module_root', 'lib', 'binding', 'nodePreGyp', 'bindings'] + ] + }; + +/** + * The main `bindings()` function loads the compiled bindings for a given module. + * It uses V8's Error API to determine the parent filename that this function is + * being invoked from, which is then used to find the root directory. + */ + +function bindings(opts) { + // Argument surgery + if (typeof opts == 'string') { + opts = { bindings: opts }; + } else if (!opts) { + opts = {}; + } + + // maps `defaults` onto `opts` object + Object.keys(defaults).map(function(i) { + if (!(i in opts)) opts[i] = defaults[i]; + }); + + // Get the module root + if (!opts.module_root) { + opts.module_root = exports.getRoot(exports.getFileName()); + } + + // Ensure the given bindings name ends with .node + if (path.extname(opts.bindings) != '.node') { + opts.bindings += '.node'; + } + + // https://github.com/webpack/webpack/issues/4175#issuecomment-342931035 + var requireFunc = + typeof __webpack_require__ === 'function' + ? __non_webpack_require__ + : require; + + var tries = [], + i = 0, + l = opts.try.length, + n, + b, + err; + + for (; i < l; i++) { + n = join.apply( + null, + opts.try[i].map(function(p) { + return opts[p] || p; + }) + ); + tries.push(n); + try { + b = opts.path ? requireFunc.resolve(n) : requireFunc(n); + if (!opts.path) { + b.path = n; + } + return b; + } catch (e) { + if (e.code !== 'MODULE_NOT_FOUND' && + e.code !== 'QUALIFIED_PATH_RESOLUTION_FAILED' && + !/not find/i.test(e.message)) { + throw e; + } + } + } + + err = new Error( + 'Could not locate the bindings file. Tried:\n' + + tries + .map(function(a) { + return opts.arrow + a; + }) + .join('\n') + ); + err.tries = tries; + throw err; +} +module.exports = exports = bindings; + +/** + * Gets the filename of the JavaScript file that invokes this function. + * Used to help find the root directory of a module. + * Optionally accepts an filename argument to skip when searching for the invoking filename + */ + +exports.getFileName = function getFileName(calling_file) { + var origPST = Error.prepareStackTrace, + origSTL = Error.stackTraceLimit, + dummy = {}, + fileName; + + Error.stackTraceLimit = 10; + + Error.prepareStackTrace = function(e, st) { + for (var i = 0, l = st.length; i < l; i++) { + fileName = st[i].getFileName(); + if (fileName !== __filename) { + if (calling_file) { + if (fileName !== calling_file) { + return; + } + } else { + return; + } + } + } + }; + + // run the 'prepareStackTrace' function above + Error.captureStackTrace(dummy); + dummy.stack; + + // cleanup + Error.prepareStackTrace = origPST; + Error.stackTraceLimit = origSTL; + + // handle filename that starts with "file://" + var fileSchema = 'file://'; + if (fileName.indexOf(fileSchema) === 0) { + fileName = fileURLToPath(fileName); + } + + return fileName; +}; + +/** + * Gets the root directory of a module, given an arbitrary filename + * somewhere in the module tree. The "root directory" is the directory + * containing the `package.json` file. + * + * In: /home/nate/node-native-module/lib/index.js + * Out: /home/nate/node-native-module + */ + +exports.getRoot = function getRoot(file) { + var dir = dirname(file), + prev; + while (true) { + if (dir === '.') { + // Avoids an infinite loop in rare cases, like the REPL + dir = process.cwd(); + } + if ( + exists(join(dir, 'package.json')) || + exists(join(dir, 'node_modules')) + ) { + // Found the 'package.json' file or 'node_modules' dir; we're done + return dir; + } + if (prev === dir) { + // Got to the top + throw new Error( + 'Could not find module root given file: "' + + file + + '". Do you have a `package.json` file? ' + ); + } + // Try the parent dir next + prev = dir; + dir = join(dir, '..'); + } +}; diff --git a/node_modules/bindings/package.json b/node_modules/bindings/package.json new file mode 100644 index 00000000..d027ee78 --- /dev/null +++ b/node_modules/bindings/package.json @@ -0,0 +1,28 @@ +{ + "name": "bindings", + "description": "Helper module for loading your native module's .node file", + "keywords": [ + "native", + "addon", + "bindings", + "gyp", + "waf", + "c", + "c++" + ], + "version": "1.5.0", + "author": "Nathan Rajlich (http://tootallnate.net)", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/node-bindings.git" + }, + "main": "./bindings.js", + "bugs": { + "url": "https://github.com/TooTallNate/node-bindings/issues" + }, + "homepage": "https://github.com/TooTallNate/node-bindings", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } +} diff --git a/node_modules/buildcheck/.eslintrc.js b/node_modules/buildcheck/.eslintrc.js new file mode 100644 index 00000000..be9311d0 --- /dev/null +++ b/node_modules/buildcheck/.eslintrc.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + extends: '@mscdex/eslint-config', +}; diff --git a/node_modules/buildcheck/.github/workflows/ci.yml b/node_modules/buildcheck/.github/workflows/ci.yml new file mode 100644 index 00000000..c96f5306 --- /dev/null +++ b/node_modules/buildcheck/.github/workflows/ci.yml @@ -0,0 +1,72 @@ +name: CI + +on: + pull_request: + push: + branches: [ master ] + +jobs: + tests-linux: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node-version: [10.x, 12.x, 14.x, 16.x, 18.x] + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Install module + run: npm install + - name: Run tests + run: npm test + tests-macos: + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + node-version: [10.x, 12.x, 14.x, 16.x, 18.x] + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Install module + run: npm install + - name: Run tests + run: npm test + tests-windows-2019: + runs-on: windows-2019 + strategy: + fail-fast: false + matrix: + node-version: [10.x, 12.x, 14.x, 16.x, 18.x] + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Install module + run: npm install + - name: Run tests + run: npm test + tests-windows-2022: + runs-on: windows-2022 + strategy: + fail-fast: false + matrix: + node-version: [18.x] + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Install module + run: npm install + - name: Run tests + run: npm test diff --git a/node_modules/buildcheck/.github/workflows/lint.yml b/node_modules/buildcheck/.github/workflows/lint.yml new file mode 100644 index 00000000..ec109fde --- /dev/null +++ b/node_modules/buildcheck/.github/workflows/lint.yml @@ -0,0 +1,23 @@ +name: lint + +on: + pull_request: + push: + branches: [ master ] + +env: + NODE_VERSION: 14.x + +jobs: + lint-js: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v1 + with: + node-version: ${{ env.NODE_VERSION }} + - name: Install ESLint + ESLint configs/plugins + run: npm install --only=dev + - name: Lint files + run: npm run lint diff --git a/node_modules/buildcheck/.npmignore b/node_modules/buildcheck/.npmignore new file mode 100644 index 00000000..bfdf7434 --- /dev/null +++ b/node_modules/buildcheck/.npmignore @@ -0,0 +1,3 @@ +.eslintcache +**/node_modules/** +/package-lock.json diff --git a/node_modules/buildcheck/LICENSE b/node_modules/buildcheck/LICENSE new file mode 100644 index 00000000..290762e9 --- /dev/null +++ b/node_modules/buildcheck/LICENSE @@ -0,0 +1,19 @@ +Copyright Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/buildcheck/README.md b/node_modules/buildcheck/README.md new file mode 100644 index 00000000..64417561 --- /dev/null +++ b/node_modules/buildcheck/README.md @@ -0,0 +1,106 @@ +# Description + +Build environment checking for [node.js](http://nodejs.org/). + +This allows for autoconf-like functionality for node addons/build scripts. + +**Note:** Obsolete and/or exotic build environments or platforms not supported +by node.js are not supported. + +## Requirements + +* [node.js](http://nodejs.org/) -- v10.0.0 or newer +* Supported compilers: + * gcc + * clang + * MSVC 2013+ and Windows SDK 8.1+ + +## Installation + + npm install buildcheck + +## Examples + +### Check if a C function exists + +```js +'use strict'; + +const BuildEnvironment = require('buildcheck'); + +const buildEnv = new BuildEnvironment(); + +console.log(buildEnv.checkFunction('c', 'preadv2')); +``` + +### Check if a C header is usable + +```js +'use strict'; + +const BuildEnvironment = require('buildcheck'); + +const buildEnv = new BuildEnvironment(); + +console.log(buildEnv.checkHeader('c', 'linux/io_uring.h')); +``` + +### Try to compile some C code + +```js +'use strict'; + +const BuildEnvironment = require('buildcheck'); + +const buildEnv = new BuildEnvironment(); + +// Should be a successful compile +console.log(buildEnv.tryCompile('c', 'int main() { return 0; }')); + +// Should be a failed compile +console.log(buildEnv.tryCompile('c', 'int main() { return z; }')); +``` + +## API + +### Exports + +The exported value is `BuildEnvironment`, the main class for dealing with a build environment. + +### BuildEnvironment + +#### Methods + +* **(constructor)**([< _object_ >config]) - Creates and returns a new BuildEnvironment instance. `config` may contain: + + * **compilerC** - _string_ - C compiler command to use. *Note: this is ignored on Windows.* **Default:** `process.env.CC` or `'cc'` + + * **compilerCXX** - _string_ - C++ compiler command to use. *Note: this is ignored on Windows.* **Default:** `process.env.CXX` or `'c++'` + + * **msvs_version** - _mixed_ - A string or number containing the year of the Visual Studio compiler to use. *Note: this is for Windows only.* **Default:** newest version installed + +* **checkDeclared**(< _string_ >lang, < _string_ >symbolName[, < _object_ >options]) - _boolean_ - Checks if a symbol `symbolName` is declared where `lang` is either `'c'` or `'c++'`. Returns `true` if symbol exists, `false` otherwise. `options` may contain: + + * **headers** - _array_ - A list of headers to try when checking if the symbol is declared. `checkFunction()` will always first try without a library. If not supplied, a default list of common (platform-specific) headers will be used. + + * **searchLibs** - _array_ - A list of library names (without the `'-l'` prefix) to try when checking if the symbol is declared. `checkDeclared()` will always first try without a library. + +* **checkFunction**(< _string_ >lang, < _string_ >functionName[, < _object_ >options]) - _boolean_ - Checks if a function `functionName` exists and is linkable where `lang` is either `'c'` or `'c++'`. Returns `true` if function exists, `false` otherwise. `options` may contain: + + * **searchLibs** - _array_ - A list of library names (without the `'-l'` prefix) to try when checking for this function. `checkFunction()` will always first try without a library. + +* **checkFeature**(< _string_ >featureName) - _mixed_ - Executes a special test for a "feature" and returns the result. Supported values for `featureName`: + + * `'strerror_r'` - Returns an object containing: + + * `declared` - _boolean_ - Whether `strerror_r()` is declared + + * `returnsCharPtr` - _boolean_ - If `strerror_r()` is declared, whether it returns `char*` (a GNU extension) or not. + +* **checkHeader**(< _string_ >lang, < _string_ >headerName) - _boolean_ - Checks if the header `headerName` exists and is usable where `lang` is either `'c'` or `'c++'`. Returns `true` if the header exists and is usable, `false` otherwise. + +* **defines**([< _string_ >lang[, < _boolean_ >rendered]]) - _array_ - Returns a list of features, functions, headers, and symbols known to be defined by this build environment instance. `lang` is either `'c'` or `'c++'` If `lang` is not set, defines for both `'c'` and `'c++'` will be returned. If `rendered` is `true` (defaults to `false`), autoconf-style defines (e.g. "HAVE_FOO=1") will be returned instead. Defines coming from features utilize base strings/names from autoconf for better compatibility. + +* **libs**([< _string_ >lang]) - _array_ - Returns a list of (`'-l'`-prefixed) libraries known to be required for features and functions defined by this build environment instance. `lang` is either `'c'` or `'c++'` If `lang` is not set, defines for both `'c'` and `'c++'` will be returned. + +* **tryCompile**(< _string_ >lang, < _string_ >code[, < _array_ >compilerParams]) - _mixed_ - Attempts to compile `code` where `lang` is either `'c'` or `'c++'`. `compilerParams` is an optional array of compiler/linker flags to include. Returns `true` on successful compilation, or an _Error_ instance with an `output` property containing the compiler error output. diff --git a/node_modules/buildcheck/deps/Find-VisualStudio.cs b/node_modules/buildcheck/deps/Find-VisualStudio.cs new file mode 100644 index 00000000..d2e45a76 --- /dev/null +++ b/node_modules/buildcheck/deps/Find-VisualStudio.cs @@ -0,0 +1,250 @@ +// Copyright 2017 - Refael Ackermann +// Distributed under MIT style license +// See accompanying file LICENSE at https://github.com/node4good/windows-autoconf + +// Usage: +// powershell -ExecutionPolicy Unrestricted -Command "Add-Type -Path Find-VisualStudio.cs; [VisualStudioConfiguration.Main]::PrintJson()" +// This script needs to be compatible with PowerShell v2 to run on Windows 2008R2 and Windows 7. + +using System; +using System.Text; +using System.Runtime.InteropServices; +using System.Collections.Generic; + +namespace VisualStudioConfiguration +{ + [Flags] + public enum InstanceState : uint + { + None = 0, + Local = 1, + Registered = 2, + NoRebootRequired = 4, + NoErrors = 8, + Complete = 4294967295, + } + + [Guid("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComImport] + public interface IEnumSetupInstances + { + + void Next([MarshalAs(UnmanagedType.U4), In] int celt, + [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Interface), Out] ISetupInstance[] rgelt, + [MarshalAs(UnmanagedType.U4)] out int pceltFetched); + + void Skip([MarshalAs(UnmanagedType.U4), In] int celt); + + void Reset(); + + [return: MarshalAs(UnmanagedType.Interface)] + IEnumSetupInstances Clone(); + } + + [Guid("42843719-DB4C-46C2-8E7C-64F1816EFD5B")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComImport] + public interface ISetupConfiguration + { + } + + [Guid("26AAB78C-4A60-49D6-AF3B-3C35BC93365D")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComImport] + public interface ISetupConfiguration2 : ISetupConfiguration + { + + [return: MarshalAs(UnmanagedType.Interface)] + IEnumSetupInstances EnumInstances(); + + [return: MarshalAs(UnmanagedType.Interface)] + ISetupInstance GetInstanceForCurrentProcess(); + + [return: MarshalAs(UnmanagedType.Interface)] + ISetupInstance GetInstanceForPath([MarshalAs(UnmanagedType.LPWStr), In] string path); + + [return: MarshalAs(UnmanagedType.Interface)] + IEnumSetupInstances EnumAllInstances(); + } + + [Guid("B41463C3-8866-43B5-BC33-2B0676F7F42E")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComImport] + public interface ISetupInstance + { + } + + [Guid("89143C9A-05AF-49B0-B717-72E218A2185C")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComImport] + public interface ISetupInstance2 : ISetupInstance + { + [return: MarshalAs(UnmanagedType.BStr)] + string GetInstanceId(); + + [return: MarshalAs(UnmanagedType.Struct)] + System.Runtime.InteropServices.ComTypes.FILETIME GetInstallDate(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetInstallationName(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetInstallationPath(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetInstallationVersion(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetDisplayName([MarshalAs(UnmanagedType.U4), In] int lcid); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetDescription([MarshalAs(UnmanagedType.U4), In] int lcid); + + [return: MarshalAs(UnmanagedType.BStr)] + string ResolvePath([MarshalAs(UnmanagedType.LPWStr), In] string pwszRelativePath); + + [return: MarshalAs(UnmanagedType.U4)] + InstanceState GetState(); + + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)] + ISetupPackageReference[] GetPackages(); + + ISetupPackageReference GetProduct(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetProductPath(); + + [return: MarshalAs(UnmanagedType.VariantBool)] + bool IsLaunchable(); + + [return: MarshalAs(UnmanagedType.VariantBool)] + bool IsComplete(); + + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)] + ISetupPropertyStore GetProperties(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetEnginePath(); + } + + [Guid("DA8D8A16-B2B6-4487-A2F1-594CCCCD6BF5")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComImport] + public interface ISetupPackageReference + { + + [return: MarshalAs(UnmanagedType.BStr)] + string GetId(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetVersion(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetChip(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetLanguage(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetBranch(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetType(); + + [return: MarshalAs(UnmanagedType.BStr)] + string GetUniqueId(); + + [return: MarshalAs(UnmanagedType.VariantBool)] + bool GetIsExtension(); + } + + [Guid("c601c175-a3be-44bc-91f6-4568d230fc83")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComImport] + public interface ISetupPropertyStore + { + + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)] + string[] GetNames(); + + object GetValue([MarshalAs(UnmanagedType.LPWStr), In] string pwszName); + } + + [Guid("42843719-DB4C-46C2-8E7C-64F1816EFD5B")] + [CoClass(typeof(SetupConfigurationClass))] + [ComImport] + public interface SetupConfiguration : ISetupConfiguration2, ISetupConfiguration + { + } + + [Guid("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D")] + [ClassInterface(ClassInterfaceType.None)] + [ComImport] + public class SetupConfigurationClass + { + } + + public static class Main + { + public static void PrintJson() + { + ISetupConfiguration query = new SetupConfiguration(); + ISetupConfiguration2 query2 = (ISetupConfiguration2)query; + IEnumSetupInstances e = query2.EnumAllInstances(); + + int pceltFetched; + ISetupInstance2[] rgelt = new ISetupInstance2[1]; + List instances = new List(); + while (true) + { + e.Next(1, rgelt, out pceltFetched); + if (pceltFetched <= 0) + { + Console.WriteLine(String.Format("[{0}]", string.Join(",", instances.ToArray()))); + return; + } + + try + { + instances.Add(InstanceJson(rgelt[0])); + } + catch (COMException) + { + // Ignore instances that can't be queried. + } + } + } + + private static string JsonString(string s) + { + return "\"" + s.Replace("\\", "\\\\").Replace("\"", "\\\"") + "\""; + } + + private static string InstanceJson(ISetupInstance2 setupInstance2) + { + // Visual Studio component directory: + // https://docs.microsoft.com/en-us/visualstudio/install/workload-and-component-ids + + StringBuilder json = new StringBuilder(); + json.Append("{"); + + string path = JsonString(setupInstance2.GetInstallationPath()); + json.Append(String.Format("\"path\":{0},", path)); + + string version = JsonString(setupInstance2.GetInstallationVersion()); + json.Append(String.Format("\"version\":{0},", version)); + + List packages = new List(); + foreach (ISetupPackageReference package in setupInstance2.GetPackages()) + { + string id = JsonString(package.GetId()); + packages.Add(id); + } + json.Append(String.Format("\"packages\":[{0}]", string.Join(",", packages.ToArray()))); + + json.Append("}"); + return json.ToString(); + } + } +} diff --git a/node_modules/buildcheck/lib/findvs.js b/node_modules/buildcheck/lib/findvs.js new file mode 100644 index 00000000..e7619598 --- /dev/null +++ b/node_modules/buildcheck/lib/findvs.js @@ -0,0 +1,345 @@ +'use strict'; + +const { execFileSync } = require('child_process'); +const { readFileSync, statSync } = require('fs'); +const { win32: path } = require('path'); + +const VS_VERSIONS_MODERN = new Map([ + [15, { + year: 2017, + msbuild: path.join('MSBuild', '15.0', 'Bin', 'MSBuild.exe'), + toolset: 'v141', + }], + [16, { + year: 2019, + msbuild: path.join('MSBuild', 'Current', 'Bin', 'MSBuild.exe'), + toolset: 'v142', + }], + [17, { + year: 2022, + msbuild: + (process.arch === 'x64' + ? path.join('MSBuild', 'Current', 'Bin', 'amd64', 'MSBuild.exe') + : path.join('MSBuild', 'Current', 'Bin', 'MSBuild.exe')), + toolset: 'v143', + }], +]); +const PACKAGES = { + msbuild: /^Microsoft[.]VisualStudio[.]VC[.]MSBuild[.](?:v\d+[.])?Base$/i, + vctools: /^Microsoft[.]VisualStudio[.]Component[.]VC[.]Tools[.]x86[.]x64$/i, + express: /^Microsoft[.]VisualStudio[.]WDExpress$/i, + winsdk: + /^Microsoft[.]VisualStudio[.]Component[.]Windows(81|10|11)SDK(?:[.](\d+)(?:[.]Desktop.*)?)?$/, +}; +const SDK_REG = 'HKLM\\Software\\Microsoft\\Microsoft SDKs\\Windows'; +const SDK32_REG = + 'HKLM\\Software\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows'; + +function checkRequiredPackages(packages) { + if (!Array.isArray(packages)) + return false; + + let foundMSBuild = false; + let foundVCTools = false; + let foundExpress = false; + for (const pkg of packages) { + if (!foundMSBuild && PACKAGES.msbuild.test(pkg)) + foundMSBuild = true; + else if (!foundVCTools && PACKAGES.vctools.test(pkg)) + foundVCTools = true; + else if (!foundExpress && PACKAGES.express.test(pkg)) + foundExpress = true; + + if (foundMSBuild && (foundVCTools || foundExpress)) + return true; + } +} + +// Sorts newest to oldest +function versionStringCompare(a, b) { + const splitA = a.split('.'); + const splitB = b.split('.'); + const len = Math.min(splitA.length, splitB.length); + for (let i = 0; i < len; ++i) { + const nA = parseInt(splitA[i], 10); + const nB = parseInt(splitB[i], 10); + if (nA > nB) + return -1; + if (nA < nB) + return 1; + } + if (splitA.length > splitB.length) + return -1; + else if (splitA.length < splitB.length) + return 1; + return 0; +} + +function sdkVersionCompare(a, b) { + return versionStringCompare(a.fullVersion, b.fullVersion); +} + +function getSDKPaths(fullVer) { + if (typeof fullVer !== 'string' || !fullVer) + return; + try { + const arch = (process.arch === 'ia32' ? 'x86' : 'x64'); + const shortVer = `v${/^\d+[.]\d+/.exec(fullVer)[0]}`; + let verPath = getRegValue(`${SDK_REG}\\${shortVer}`, 'InstallationFolder'); + if (!verPath) + verPath = getRegValue(`${SDK32_REG}\\${shortVer}`, 'InstallationFolder'); + if (!verPath) + return; + + // Includes + const includePaths = []; + for (const type of ['shared', 'um', 'ucrt']) { + const testPath = path.resolve(verPath, 'Include', fullVer, type); + statSync(testPath); + includePaths.push(testPath); + } + + // Libraries + const libPaths = []; + for (const type of ['um', 'ucrt']) { + const testPath = path.resolve(verPath, 'Lib', fullVer, type, arch); + statSync(testPath); + libPaths.push(testPath); + } + + return { includePaths, libPaths }; + } catch {} +} + +const execOpts = { + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + windowsHide: true, +}; + +function findModernVS() { + const versions = []; + const ps = path.join( + process.env.SystemRoot, + 'System32', + 'WindowsPowerShell', + 'v1.0', + 'powershell.exe' + ); + const cs = path.resolve(__dirname, '..', 'deps', 'Find-VisualStudio.cs'); + const args = [ + '-ExecutionPolicy', + 'Unrestricted', + '-NoProfile', + '-Command', + `&{Add-Type -Path '${cs}';[VisualStudioConfiguration.Main]::PrintJson()}` + ]; + try { + const out = execFileSync(ps, args, execOpts); + const info = JSON.parse(out); + if (Array.isArray(info)) { + for (const vs of info) { + const vsPath = path.resolve(vs.path); + let vsVer = /^(?\d+)[.](?\d+)[.]/.exec(vs.version); + if (!vsVer) + continue; + vsVer = { + full: vs.version, + major: +vsVer.groups.major, + minor: +vsVer.groups.minor, + }; + const verInfo = VS_VERSIONS_MODERN.get(vsVer.major); + if (verInfo === undefined) + continue; + if (!checkRequiredPackages(vs.packages)) + continue; + const vsSDKs = []; + for (const pkg of vs.packages) { + let fullVersion; + let version; + const m = PACKAGES.winsdk.exec(pkg); + if (!m) + continue; + const sdk = m[1]; + switch (sdk) { + case '81': + fullVersion = version = '8.1'; + break; + case '10': + case '11': { + if (m[2] === undefined) + continue; + const sdkVer = parseInt(m[2], 10); + if (!isFinite(sdkVer) || sdkVer < 0) + continue; + fullVersion = `10.0.${sdkVer}.0`; + version = '10.0'; + break; + } + } + const paths = getSDKPaths(fullVersion); + if (!paths) + continue; + vsSDKs.push({ + version, + fullVersion, + ...paths, + }); + } + if (vsSDKs.length === 0) + continue; + let clPath; + const includePaths = []; + const libPaths = []; + try { + let vcVerFile; + let clVer; + try { + vcVerFile = path.join( + vsPath, + 'VC', + 'Auxiliary', + 'Build', + `Microsoft.VCToolsVersion.${verInfo.toolset}.default.txt` + ); + clVer = readFileSync(vcVerFile, { encoding: 'utf8' }).trim(); + } catch {} + if (!clVer) { + vcVerFile = path.join( + vsPath, + 'VC', + 'Auxiliary', + 'Build', + 'Microsoft.VCToolsVersion.default.txt' + ); + clVer = readFileSync(vcVerFile, { encoding: 'utf8' }).trim(); + } + const arch = (process.arch === 'ia32' ? 'x86' : 'x64'); + let testPath = path.join( + vsPath, + 'VC', + 'Tools', + 'MSVC', + clVer, + 'bin', + `Host${arch}`, + arch, + 'cl.exe' + ); + statSync(testPath); + clPath = testPath; + + testPath = path.join( + vsPath, + 'VC', + 'Tools', + 'MSVC', + clVer, + 'include' + ); + statSync(testPath); + includePaths.push(testPath); + + testPath = path.join( + vsPath, + 'VC', + 'Tools', + 'MSVC', + clVer, + 'lib', + arch + ); + statSync(testPath); + libPaths.push(testPath); + } catch { + continue; + } + vsSDKs.sort(sdkVersionCompare); + versions.push({ + path: vsPath, + version: vsVer, + sdks: vsSDKs, + ...verInfo, + msbuild: path.join(vsPath, verInfo.msbuild), + cl: clPath, + includePaths, + libPaths, + }); + } + } + } catch {} + return versions; +} + +const VS_VERSIONS_OLDER = [ + { + version: { full: '12.0', major: 12, minor: 0 }, + year: 2013, + toolset: 'v120', + }, + { + version: { full: '14.0', major: 14, minor: 0 }, + year: 2015, + toolset: 'v140', + }, +]; + +const VC_REG = 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7'; +const VC32_REG = + 'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7'; +const MSBUILD_REG = 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions'; + +function getRegValue(key, value, use32) { + const extraArgs = (use32 ? [ '/reg:32' ] : []); + const regexp = new RegExp(`^\\s+${value}\\s+REG_\\w+\\s+(\\S.*)$`, 'im'); + const reg = path.join(process.env.SystemRoot, 'System32', 'reg.exe'); + const args = [ 'query', key, '/v', value, ...extraArgs ]; + + try { + const out = execFileSync(reg, args, execOpts); + const m = regexp.exec(out); + if (m) + return m[1]; + } catch {} +} + +function findOlderVS() { + const versions = []; + try { + for (const vs of VS_VERSIONS_OLDER) { + let vsPath = getRegValue(VC_REG, vs.version.full); + if (!vsPath) + vsPath = getRegValue(VC32_REG, vs.version.full); + if (!vsPath) + continue; + vsPath = path.resolve(vsPath, '..'); + + const msbuildPath = getRegValue( + `${MSBUILD_REG}\\${vs.version.full}`, + 'MSBuildToolsPath', + (process.arch === 'ia32') + ); + if (!msbuildPath) + continue; + versions.push({ + path: vsPath, + ...vs, + msbuild: path.join(msbuildPath, 'MSBuild.exe'), + cl: path.join(vsPath, 'VC', 'bin', 'cl.exe'), + includePaths: [path.join(vsPath, 'VC', 'include')], + libPaths: [path.join(vsPath, 'VC', 'lib')], + sdks: [], + }); + } + } catch {} + return versions; +} + +module.exports = () => { + const versions = findModernVS().concat(findOlderVS()); + // Sorts newest to oldest + versions.sort((a, b) => { + return versionStringCompare(a.version.full, b.version.full); + }); + return versions; +}; diff --git a/node_modules/buildcheck/lib/index.js b/node_modules/buildcheck/lib/index.js new file mode 100644 index 00000000..f0e516d0 --- /dev/null +++ b/node_modules/buildcheck/lib/index.js @@ -0,0 +1,738 @@ +'use strict'; + +// TODO: take `compilerParams`, headers into account in cache for all cached +// results +// TODO: debug output + +const { spawnSync } = require('child_process'); +const { unlinkSync, writeFileSync } = require('fs'); +const { tmpdir } = require('os'); +const { win32: path } = require('path'); +const { inspect } = require('util'); + +const isWindows = (process.platform === 'win32'); +const findVS = require('./findvs.js'); + +const RE_HEADER_DECORATED = /^(?:"(.+)")|(?:<(.+)>)$/; + +const genWinTmpFilenames = (() => { + let instance = 1; + return () => { + const base = + path.resolve(tmpdir(), `_buildcheck-${process.pid}-${instance++}`); + return { + input: `${base}.in.tmp`, + object: `${base}.out.obj`, + output: `${base}.out.tmp`, + }; + }; +})(); + +function getKind(prop) { + const spawnOpts = { + encoding: 'utf8', + stdio: 'pipe', + windowsHide: true, + }; + + const lang = (prop === '_cc' ? 'c' : 'c++'); + + if (isWindows) { + spawnOpts.stdio = [ 'ignore', 'pipe', 'pipe' ]; + writeFileSync(this._tmpInFile, [ + '_MSC_VER', + ].join(' ')); + const result = spawnSync( + this[prop], + [ '-EP', `-T${lang === 'c' ? 'c' : 'p'}`, this._tmpInFile], + spawnOpts + ); + unlinkSync(this._tmpInFile); + + if (result.status === 0) { + const values = result.stdout.trim().split(' '); + if (values.length === 1 && /^\d+$/.test(values[0])) { + this[`${prop}Kind`] = 'msvc'; + this[`${prop}Version`] = values[0]; + this[`${prop}SpawnOpts`] = spawnOpts; + this._debug( + `>>> Detected MSVC ${values[0]} for ${lang.toUpperCase()} language` + ); + return; + } + } + } else { + const result = spawnSync( + this[prop], + [ '-E', '-P', '-x', lang, '-' ], + { + ...spawnOpts, + input: [ + '__clang__', + '__GNUC__', + '__GNUC_MINOR__', + '__GNUC_PATCHLEVEL__', + '__clang_major__', + '__clang_minor__', + '__clang_patchlevel__', + ].join(' '), + } + ); + + if (result.status === 0) { + const values = result.stdout.trim().split(' '); + if (values.length === 7) { + let kind; + let version; + if (values[0] === '1') { + kind = 'clang'; + version = values.slice(4).map((v) => +v); + } else { + kind = 'gnu'; + version = values.slice(1, 4).map((v) => +v); + } + let good = true; + for (const part of version) { + if (!isFinite(part) || part < 0) { + good = false; + break; + } + } + if (good) { + this[`${prop}Kind`] = kind; + this[`${prop}Version`] = version; + this[`${prop}SpawnOpts`] = spawnOpts; + const verStr = version.join('.'); + this._debug( + `>>> Detected ${kind} ${verStr} for ${lang.toUpperCase()} language` + ); + return; + } + } + } + } + + throw new Error('Unable to detect compiler type'); +} + +class BuildEnvironment { + constructor(cfg) { + if (typeof cfg !== 'object' || cfg === null) + cfg = {}; + + this._debug = (typeof cfg.debug === 'function' ? cfg.debug : () => {}); + + let cc; + let cxx; + if (isWindows) { + const versions = findVS(); + this._debug( + `>>> Detected MSVS installations: ${inspect(versions, false, 10)}` + ); + if (versions.length === 0) + throw new Error('Unable to detect compiler type'); + let selected_msvs; + if (cfg.msvs_version + && (typeof cfg.msvs_version === 'string' + || typeof cfg.msvs_version === 'number')) { + this._debug(`>>> Explicit MSVS requested: ${cfg.msvs_version}`); + // Try to select compiler by year + const msvs_version = cfg.msvs_version.toString(); + for (const vs of versions) { + if (vs.year.toString() === msvs_version) { + selected_msvs = vs; + break; + } + } + if (selected_msvs === undefined) + throw new Error(`Unable to find MSVS with year '${msvs_version}'`); + } else { + selected_msvs = versions[0]; // Use newest + } + this._debug(`>>> Using MSVS: ${selected_msvs.year}`); + cc = selected_msvs.cl; + cxx = cc; + this._includePaths = selected_msvs.includePaths; + this._libPaths = selected_msvs.libPaths; + // Add (newest) SDK paths if we have them + for (const sdk of selected_msvs.sdks) { + this._debug(`>>> Using Windows SDK: ${sdk.fullVersion}`); + this._includePaths = this._includePaths.concat(sdk.includePaths); + this._libPaths = this._libPaths.concat(sdk.libPaths); + break; + } + + const { input, object, output } = genWinTmpFilenames(); + this._tmpInFile = input; + this._tmpObjFile = object; + this._tmpOutFile = output; + } else { + cc = ((typeof cfg.compilerC === 'string' && cfg.compilerC) + || process.env.CC + || 'cc'); + cxx = ((typeof cfg.compilerCXX === 'string' && cfg.compilerCXX) + || process.env.CXX + || 'c++'); + this._debug(`>>> Using C compiler: ${cc}`); + this._debug(`>>> Using C++ compiler: ${cxx}`); + } + + this._cc = cc; + this._ccKind = undefined; + this._ccVersion = undefined; + this._ccSpawnOpts = undefined; + + this._cxx = cxx; + this._cxxKind = undefined; + this._cxxVersion = undefined; + this._cxxSpawnOpts = undefined; + + if (cfg.cache !== false) { + this._cache = new Map(Object.entries({ + c: new Map(), + cxx: new Map(), + })); + } else { + this._cache = null; + } + } + + checkDeclared(type, symbolName, opts) { + validateType(type); + if (typeof symbolName !== 'string' || !symbolName) + throw new Error(`Invalid symbol name: ${inspect(symbolName)}`); + + const cached = getCachedValue(type, this._cache, 'declared', symbolName); + if (cached !== undefined) { + this._debug( + `>>> Checking if '${symbolName}' is declared... ${cached} (cached)` + ); + return cached; + } + + if (typeof opts !== 'object' || opts === null) + opts = {}; + + const { headers, searchLibs } = opts; + const headersList = renderHeaders(Array.isArray(headers) + ? headers + : getDefaultHeaders(this, type)); + + const declName = symbolName.replace(/ *\(.*/, ''); + const declUse = symbolName.replace(/\(/, '((') + .replace(/\)/, ') 0)') + .replace(/,/g, ') 0, ('); + + const libs = [ + '', + ...(Array.isArray(searchLibs) ? searchLibs : []) + ]; + + for (let lib of libs) { + if (typeof lib !== 'string') + continue; + lib = lib.trim(); + + const code = ` +${headersList} + +int +main () +{ +#ifndef ${declName} +#ifdef __cplusplus + (void) ${declUse}; +#else + (void) ${declName}; +#endif +#endif + + ; + return 0; +}`; + const compilerParams = (lib ? [`-l${lib}`] : []); + const result = this.tryCompile(type, code, compilerParams); + + this._debug( + `>>> Checking if '${symbolName}' is declared ` + + `(using ${lib ? `'${lib}'` : 'no'} library)... ${result === true}` + ); + + if (result !== true) { + this._debug('... check failed with compiler output:'); + this._debug(result.output); + } + + if (result === true) { + setCachedValue( + type, + this._cache, + 'declared', + symbolName, + (result === true) + ); + return true; + } + } + + return false; + } + + checkFeature(name) { + const cached = getCachedValue('features', this._cache, null, name); + if (cached !== undefined) { + if (typeof cached === 'object' + && cached !== null + && typeof cached.val !== undefined) { + return cached.val; + } + + return cached; + } + + const feature = features.get(name); + if (feature === undefined) + throw new Error(`Invalid feature: ${name}`); + + let result = feature(this); + if (result === undefined) + result = null; + + setCachedValue('features', this._cache, null, name, result); + + if (typeof result === 'object' + && result !== null + && typeof result.val !== undefined) { + return result.val; + } + + return result; + } + + checkFunction(type, funcName, opts) { + validateType(type); + if (typeof funcName !== 'string' || !funcName) + throw new Error(`Invalid function name: ${inspect(funcName)}`); + + const cached = getCachedValue(type, this._cache, 'functions', funcName); + if (cached !== undefined) { + this._debug( + `>>> Checking if function '${funcName}' exists... true (cached)` + ); + return true; + } + + if (typeof opts !== 'object' || opts === null) + opts = {}; + + const { searchLibs } = opts; + const libs = [ + '', + ...(Array.isArray(searchLibs) ? searchLibs : []) + ]; + + for (let lib of libs) { + if (typeof lib !== 'string') + continue; + lib = lib.trim(); + + const code = ` +/* Define ${funcName} to an innocuous variant, in case declares + ${funcName}. + For example, HP-UX 11i declares gettimeofday. */ +#define ${funcName} innocuous_${funcName} +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char ${funcName} (); below. */ +#include +#undef ${funcName} +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ${funcName} (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_${funcName} || defined __stub___${funcName} +choke me +#endif + +int +main () +{ +return ${funcName} (); + ; + return 0; +}`; + + const compilerParams = (lib ? [`-l${lib}`] : []); + const result = this.tryCompile(type, code, compilerParams); + + this._debug( + `>>> Checking if function '${funcName}' exists ` + + `(using ${lib ? `'${lib}'` : 'no'} library)... ${result === true}` + ); + if (result !== true) { + this._debug('... check failed with compiler output:'); + this._debug(result.output); + } + + if (result === true) { + setCachedValue( + type, + this._cache, + 'functions', + funcName, + compilerParams + ); + return true; + } + } + + return false; + } + + checkHeader(type, header) { + validateType(type); + const cached = getCachedValue( + type, + this._cache, + 'headers', + normalizeHeader(header) + ); + if (cached !== undefined) { + this._debug( + `>>> Checking if header '${header}' exists... ${cached} (cached)` + ); + return cached; + } + + const headersList = renderHeaders([header]); + + const code = ` +${headersList} + +int +main () +{ + return 0; +}`; + + const result = this.tryCompile(type, code); + setCachedValue( + type, + this._cache, + 'headers', + normalizeHeader(header), + (result === true) + ); + this._debug( + `>>> Checking if header '${header}' exists... ${result === true}` + ); + if (result !== true) { + this._debug('... check failed with compiler output:'); + this._debug(result.output); + } + return (result === true); + } + + defines(type, rendered) { + if (this._cache === null) + return []; + + const defines = new Map(); + + let types; + if (!['c', 'c++'].includes(type)) + types = ['c', 'c++']; + else + types = [type]; + + for (const t of types) { + const typeCache = this._cache.get(t); + if (!typeCache) + continue; + + for (const [subtype, entries] of typeCache) { + for (let name of entries.keys()) { + if (subtype === 'headers') + name = name.replace(RE_HEADER_DECORATED, '$1$2'); + defines.set(makeDefine(name, rendered), 1); + } + } + } + + { + const featuresCache = this._cache.get('features'); + if (featuresCache) { + for (const result of featuresCache.values()) { + if (typeof result === 'object' + && result !== null + && Array.isArray(result.defines)) { + for (const define of result.defines) + defines.set(makeDefine(define, rendered), 1); + } + } + } + } + + return Array.from(defines.keys()); + } + + libs(type) { + if (this._cache === null) + return []; + + const libs = new Map(); + + let types; + if (!['c', 'c++'].includes(type)) + types = ['c', 'c++']; + else + types = [type]; + + for (const t of types) { + const typeCache = this._cache.get(t); + if (!typeCache) + continue; + + const functionsCache = typeCache.get('functions'); + if (!functionsCache) + continue; + + for (const compilerParams of functionsCache.values()) { + for (const param of compilerParams) + libs.set(param, 1); + } + } + + { + const featuresCache = this._cache.get('features'); + if (featuresCache) { + for (const result of featuresCache.values()) { + if (typeof result === 'object' + && result !== null + && Array.isArray(result.libs)) { + for (const lib of result.libs) + libs.set(lib, 1); + } + } + } + } + + return Array.from(libs.keys()); + } + + tryCompile(type, code, compilerParams) { + validateType(type); + if (typeof code !== 'string') + throw new TypeError('Invalid code argument'); + + type = (type === 'c' ? 'c' : 'c++'); + const prop = (type === 'c' ? '_cc' : '_cxx'); + + if (this[`${prop}Kind`] === undefined) + getKind.call(this, prop); + + if (!Array.isArray(compilerParams)) + compilerParams = []; + + let result; + if (this[`${prop}Kind`] === 'msvc') { + const cmpOpts = [`-Fo${this._tmpObjFile}`]; + for (const includePath of this._includePaths) + cmpOpts.push('-I', includePath); + const lnkOpts = []; + for (const libPath of this._libPaths) + lnkOpts.push(`-LIBPATH:${libPath}`); + for (const opt of compilerParams) { + let m; + if (m = /^[-/]l(.+)$/.exec(opt)) + lnkOpts.push(m[1]); + else + cmpOpts.push(opt); + } + try { + writeFileSync(this._tmpInFile, code); + const args = [ + ...cmpOpts, + `-T${prop === '_cc' ? 'c' : 'p'}`, + this._tmpInFile, + '-link', + `-out:${this._tmpOutFile}`, + ...lnkOpts, + ]; + result = spawnSync( + this[prop], + args, + this[`${prop}SpawnOpts`] + ); + unlinkSync(this._tmpInFile); + // Overwrite stderr with stdout because MSVC seems to print + // errors to stdout instead for some reason + result.stderr = result.stdout; + } catch (ex) { + // We had trouble writing or deleting a temp file, fake + // the result + result = { status: Infinity, stderr: ex.stack }; + } + try { unlinkSync(this._tmpObjFile); } catch {} + try { unlinkSync(this._tmpOutFile); } catch {} + } else { + result = spawnSync( + this[prop], + [ + '-x', type, + '-o', '/dev/null', + '-', + ...compilerParams, + ], + { + ...this[`${prop}SpawnOpts`], + input: code, + } + ); + } + + if (result.status === 0) + return true; + + const err = new Error('Compilation failed'); + err.output = result.stderr; + return err; + } +} + +function validateType(type) { + if (!['c', 'c++'].includes(type)) + throw new Error('Invalid type argument'); +} + +function getCachedValue(type, cache, subtype, key) { + if (cache === null) + return; + + const typeCache = cache.get(type); + if (!typeCache) + return; + + const subtypeCache = (typeof subtype !== 'string' + ? typeCache + : typeCache.get(subtype)); + if (!subtypeCache) + return; + + return subtypeCache.get(key); +} + +function setCachedValue(type, cache, subtype, key, value) { + if (cache === null) + return; + + let typeCache = cache.get(type); + if (!typeCache) + cache.set(type, typeCache = new Map()); + + let subtypeCache = (typeof subtype !== 'string' + ? typeCache + : typeCache.get(subtype)); + if (!subtypeCache) + typeCache.set(subtype, subtypeCache = new Map()); + + subtypeCache.set(key, value); +} + +function renderHeaders(headers) { + let ret = ''; + + if (Array.isArray(headers)) { + for (const header of headers) { + if (typeof header !== 'string' || !header) + throw new Error(`Invalid header: ${inspect(header)}`); + ret += `#include ${normalizeHeader(header)}\n`; + } + } + + return ret; +} + +function normalizeHeader(header) { + if (!RE_HEADER_DECORATED.test(header)) + header = `<${header}>`; + return header; +} + +const DEFAULT_HEADERS_POSIX = [ + 'stdio.h', + 'sys/types.h', + 'sys/stat.h', + 'stdlib.h', + 'stddef.h', + 'memory.h', + 'string.h', + 'strings.h', + 'inttypes.h', + 'stdint.h', + 'unistd.h' +]; +const DEFAULT_HEADERS_MSVC = [ + 'windows.h', +]; +function getDefaultHeaders(be, type) { + const prop = (type === 'c' ? '_cc' : '_cxx'); + if (be[`${prop}Kind`] === undefined) + getKind.call(be, prop); + + let headers; + if (be[`${prop}Kind`] === 'msvc') + headers = DEFAULT_HEADERS_MSVC; + else + headers = DEFAULT_HEADERS_POSIX; + + return headers.filter((hdr) => be.checkHeader(type, hdr)); +} + +const features = new Map(Object.entries({ + 'strerror_r': (be) => { + const defines = []; + let returnsCharPtr = false; + + const declared = be.checkDeclared('c', 'strerror_r'); + if (declared) { + const code = ` +${renderHeaders(getDefaultHeaders(be, 'c'))} + +int +main () +{ + +char buf[100]; +char x = *strerror_r (0, buf, sizeof buf); +char *p = strerror_r (0, buf, sizeof buf); +return !p || x; + + ; + return 0; +}`; + returnsCharPtr = (be.tryCompile('c', code) === true); + if (returnsCharPtr) + defines.push('STRERROR_R_CHAR_P'); + } + + return { + defines, + val: { declared, returnsCharPtr } + }; + }, +})); + +function makeDefine(name, rendered) { + name = name.replace(/[*]/g, 'P') + .replace(/[^_A-Za-z0-9]/g, '_') + .toUpperCase(); + return (rendered ? `HAVE_${name}=1` : name); +} + +module.exports = BuildEnvironment; diff --git a/node_modules/buildcheck/package.json b/node_modules/buildcheck/package.json new file mode 100644 index 00000000..8cbb7f21 --- /dev/null +++ b/node_modules/buildcheck/package.json @@ -0,0 +1,36 @@ +{ + "name": "buildcheck", + "version": "0.0.6", + "author": "Brian White ", + "description": "Build environment checking (a la autoconf) for node.js", + "main": "./lib/index.js", + "engines": { + "node": ">=10.0.0" + }, + "devDependencies": { + "@mscdex/eslint-config": "^1.1.0", + "eslint": "^7.0.0" + }, + "scripts": { + "test": "node test/test.js", + "lint": "eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js lib", + "lint:fix": "npm run lint -- --fix" + }, + "keywords": [ + "build", + "autoconf", + "addons", + "compiler", + "environment" + ], + "licenses": [ + { + "type": "MIT", + "url": "http://github.com/mscdex/buildcheck/raw/master/LICENSE" + } + ], + "repository": { + "type": "git", + "url": "http://github.com/mscdex/buildcheck.git" + } +} diff --git a/node_modules/buildcheck/test/test.js b/node_modules/buildcheck/test/test.js new file mode 100644 index 00000000..d584c233 --- /dev/null +++ b/node_modules/buildcheck/test/test.js @@ -0,0 +1,8 @@ +'use strict'; + +const BE = require('..'); + +{ + // Test compiler detection + new BE({ debug: console.log }); +} diff --git a/node_modules/chokidar/node_modules/fsevents/LICENSE b/node_modules/chokidar/node_modules/fsevents/LICENSE new file mode 100644 index 00000000..5d70441c --- /dev/null +++ b/node_modules/chokidar/node_modules/fsevents/LICENSE @@ -0,0 +1,22 @@ +MIT License +----------- + +Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/chokidar/node_modules/fsevents/README.md b/node_modules/chokidar/node_modules/fsevents/README.md new file mode 100644 index 00000000..50373a03 --- /dev/null +++ b/node_modules/chokidar/node_modules/fsevents/README.md @@ -0,0 +1,89 @@ +# fsevents + +Native access to MacOS FSEvents in [Node.js](https://nodejs.org/) + +The FSEvents API in MacOS allows applications to register for notifications of +changes to a given directory tree. It is a very fast and lightweight alternative +to kqueue. + +This is a low-level library. For a cross-platform file watching module that +uses fsevents, check out [Chokidar](https://github.com/paulmillr/chokidar). + +## Usage + +```sh +npm install fsevents +``` + +Supports only **Node.js v8.16 and higher**. + +```js +const fsevents = require('fsevents'); + +// To start observation +const stop = fsevents.watch(__dirname, (path, flags, id) => { + const info = fsevents.getInfo(path, flags); +}); + +// To end observation +stop(); +``` + +> **Important note:** The API behaviour is slightly different from typical JS APIs. The `stop` function **must** be +> retrieved and stored somewhere, even if you don't plan to stop the watcher. If you forget it, the garbage collector +> will eventually kick in, the watcher will be unregistered, and your callbacks won't be called anymore. + +The callback passed as the second parameter to `.watch` get's called whenever the operating system detects a +a change in the file system. It takes three arguments: + +###### `fsevents.watch(dirname: string, (path: string, flags: number, id: string) => void): () => Promise` + + * `path: string` - the item in the filesystem that have been changed + * `flags: number` - a numeric value describing what the change was + * `id: string` - an unique-id identifying this specific event + + Returns closer callback which when called returns a Promise resolving when the watcher process has been shut down. + +###### `fsevents.getInfo(path: string, flags: number, id: string): FsEventInfo` + +The `getInfo` function takes the `path`, `flags` and `id` arguments and converts those parameters into a structure +that is easier to digest to determine what the change was. + +The `FsEventsInfo` has the following shape: + +```js +/** + * @typedef {'created'|'modified'|'deleted'|'moved'|'root-changed'|'cloned'|'unknown'} FsEventsEvent + * @typedef {'file'|'directory'|'symlink'} FsEventsType + */ +{ + "event": "created", // {FsEventsEvent} + "path": "file.txt", + "type": "file", // {FsEventsType} + "changes": { + "inode": true, // Had iNode Meta-Information changed + "finder": false, // Had Finder Meta-Data changed + "access": false, // Had access permissions changed + "xattrs": false // Had xAttributes changed + }, + "flags": 0x100000000 +} +``` + +## Changelog + +- v2.3 supports Apple Silicon ARM CPUs +- v2 supports node 8.16+ and reduces package size massively +- v1.2.8 supports node 6+ +- v1.2.7 supports node 4+ + +## Troubleshooting + +- I'm getting `EBADPLATFORM` `Unsupported platform for fsevents` error. +- It's fine, nothing is broken. fsevents is macos-only. Other platforms are skipped. If you want to hide this warning, report a bug to NPM bugtracker asking them to hide ebadplatform warnings by default. + +## License + +The MIT License Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller — see LICENSE file. + +Visit our [GitHub page](https://github.com/fsevents/fsevents) and [NPM Page](https://npmjs.org/package/fsevents) diff --git a/node_modules/chokidar/node_modules/fsevents/fsevents.d.ts b/node_modules/chokidar/node_modules/fsevents/fsevents.d.ts new file mode 100644 index 00000000..2723c048 --- /dev/null +++ b/node_modules/chokidar/node_modules/fsevents/fsevents.d.ts @@ -0,0 +1,46 @@ +declare type Event = "created" | "cloned" | "modified" | "deleted" | "moved" | "root-changed" | "unknown"; +declare type Type = "file" | "directory" | "symlink"; +declare type FileChanges = { + inode: boolean; + finder: boolean; + access: boolean; + xattrs: boolean; +}; +declare type Info = { + event: Event; + path: string; + type: Type; + changes: FileChanges; + flags: number; +}; +declare type WatchHandler = (path: string, flags: number, id: string) => void; +export declare function watch(path: string, handler: WatchHandler): () => Promise; +export declare function watch(path: string, since: number, handler: WatchHandler): () => Promise; +export declare function getInfo(path: string, flags: number): Info; +export declare const constants: { + None: 0x00000000; + MustScanSubDirs: 0x00000001; + UserDropped: 0x00000002; + KernelDropped: 0x00000004; + EventIdsWrapped: 0x00000008; + HistoryDone: 0x00000010; + RootChanged: 0x00000020; + Mount: 0x00000040; + Unmount: 0x00000080; + ItemCreated: 0x00000100; + ItemRemoved: 0x00000200; + ItemInodeMetaMod: 0x00000400; + ItemRenamed: 0x00000800; + ItemModified: 0x00001000; + ItemFinderInfoMod: 0x00002000; + ItemChangeOwner: 0x00004000; + ItemXattrMod: 0x00008000; + ItemIsFile: 0x00010000; + ItemIsDir: 0x00020000; + ItemIsSymlink: 0x00040000; + ItemIsHardlink: 0x00100000; + ItemIsLastHardlink: 0x00200000; + OwnEvent: 0x00080000; + ItemCloned: 0x00400000; +}; +export {}; diff --git a/node_modules/chokidar/node_modules/fsevents/fsevents.js b/node_modules/chokidar/node_modules/fsevents/fsevents.js new file mode 100644 index 00000000..198da98e --- /dev/null +++ b/node_modules/chokidar/node_modules/fsevents/fsevents.js @@ -0,0 +1,83 @@ +/* + ** © 2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller + ** Licensed under MIT License. + */ + +/* jshint node:true */ +"use strict"; + +if (process.platform !== "darwin") { + throw new Error(`Module 'fsevents' is not compatible with platform '${process.platform}'`); +} + +const Native = require("./fsevents.node"); +const events = Native.constants; + +function watch(path, since, handler) { + if (typeof path !== "string") { + throw new TypeError(`fsevents argument 1 must be a string and not a ${typeof path}`); + } + if ("function" === typeof since && "undefined" === typeof handler) { + handler = since; + since = Native.flags.SinceNow; + } + if (typeof since !== "number") { + throw new TypeError(`fsevents argument 2 must be a number and not a ${typeof since}`); + } + if (typeof handler !== "function") { + throw new TypeError(`fsevents argument 3 must be a function and not a ${typeof handler}`); + } + + let instance = Native.start(Native.global, path, since, handler); + if (!instance) throw new Error(`could not watch: ${path}`); + return () => { + const result = instance ? Promise.resolve(instance).then(Native.stop) : Promise.resolve(undefined); + instance = undefined; + return result; + }; +} + +function getInfo(path, flags) { + return { + path, + flags, + event: getEventType(flags), + type: getFileType(flags), + changes: getFileChanges(flags), + }; +} + +function getFileType(flags) { + if (events.ItemIsFile & flags) return "file"; + if (events.ItemIsDir & flags) return "directory"; + if (events.MustScanSubDirs & flags) return "directory"; + if (events.ItemIsSymlink & flags) return "symlink"; +} +function anyIsTrue(obj) { + for (let key in obj) { + if (obj[key]) return true; + } + return false; +} +function getEventType(flags) { + if (events.ItemRemoved & flags) return "deleted"; + if (events.ItemRenamed & flags) return "moved"; + if (events.ItemCreated & flags) return "created"; + if (events.ItemModified & flags) return "modified"; + if (events.RootChanged & flags) return "root-changed"; + if (events.ItemCloned & flags) return "cloned"; + if (anyIsTrue(flags)) return "modified"; + return "unknown"; +} +function getFileChanges(flags) { + return { + inode: !!(events.ItemInodeMetaMod & flags), + finder: !!(events.ItemFinderInfoMod & flags), + access: !!(events.ItemChangeOwner & flags), + xattrs: !!(events.ItemXattrMod & flags), + }; +} + +exports.watch = watch; +exports.getInfo = getInfo; +exports.constants = events; diff --git a/node_modules/chokidar/node_modules/fsevents/fsevents.node b/node_modules/chokidar/node_modules/fsevents/fsevents.node new file mode 100755 index 0000000000000000000000000000000000000000..1cc3345ead403e72439746aee6b40645893c322b GIT binary patch literal 163626 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 Is-vs_AMzay6aWAK literal 0 HcmV?d00001 diff --git a/node_modules/chokidar/node_modules/fsevents/package.json b/node_modules/chokidar/node_modules/fsevents/package.json new file mode 100644 index 00000000..5d0ee15e --- /dev/null +++ b/node_modules/chokidar/node_modules/fsevents/package.json @@ -0,0 +1,62 @@ +{ + "name": "fsevents", + "version": "2.3.3", + "description": "Native Access to MacOS FSEvents", + "main": "fsevents.js", + "types": "fsevents.d.ts", + "os": [ + "darwin" + ], + "files": [ + "fsevents.d.ts", + "fsevents.js", + "fsevents.node" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + }, + "scripts": { + "clean": "node-gyp clean && rm -f fsevents.node", + "build": "node-gyp clean && rm -f fsevents.node && node-gyp rebuild && node-gyp clean", + "test": "/bin/bash ./test.sh 2>/dev/null", + "prepublishOnly": "npm run build" + }, + "repository": { + "type": "git", + "url": "https://github.com/fsevents/fsevents.git" + }, + "keywords": [ + "fsevents", + "mac" + ], + "contributors": [ + { + "name": "Philipp Dunkel", + "email": "pip@pipobscure.com" + }, + { + "name": "Ben Noordhuis", + "email": "info@bnoordhuis.nl" + }, + { + "name": "Elan Shankar", + "email": "elan.shanker@gmail.com" + }, + { + "name": "Miroslav Bajtoš", + "email": "mbajtoss@gmail.com" + }, + { + "name": "Paul Miller", + "url": "https://paulmillr.com" + } + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/fsevents/fsevents/issues" + }, + "homepage": "https://github.com/fsevents/fsevents", + "devDependencies": { + "node-gyp": "^9.4.0" + } +} diff --git a/node_modules/cpu-features/.eslintrc.js b/node_modules/cpu-features/.eslintrc.js new file mode 100644 index 00000000..be9311d0 --- /dev/null +++ b/node_modules/cpu-features/.eslintrc.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + extends: '@mscdex/eslint-config', +}; diff --git a/node_modules/cpu-features/.github/workflows/ci.yml b/node_modules/cpu-features/.github/workflows/ci.yml new file mode 100644 index 00000000..2d458273 --- /dev/null +++ b/node_modules/cpu-features/.github/workflows/ci.yml @@ -0,0 +1,68 @@ +name: CI + +on: + pull_request: + push: + branches: [ master ] + +jobs: + tests-linux: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node-version: [10.x, 12.x, 14.x, 16.x, 18.x, 20.x] + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Check Node.js version + run: node -pe process.versions + - name: Install module + run: npm install + - name: Run tests + run: npm test + tests-macos: + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + node-version: [10.x, 12.x, 14.x, 16.x, 18.x, 20.x] + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Check Node.js version + run: node -pe process.versions + - name: Install module + run: npm install + - name: Run tests + run: npm test + tests-windows: + runs-on: windows-2019 + strategy: + fail-fast: false + matrix: + node-version: [10.x, 12.x, 14.x, 16.x, 18.x, 20.x] + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Check Node.js version + run: node -pe process.versions + - name: Install module + run: npm install + - name: Run tests + run: npm test diff --git a/node_modules/cpu-features/.github/workflows/lint.yml b/node_modules/cpu-features/.github/workflows/lint.yml new file mode 100644 index 00000000..63af4ea8 --- /dev/null +++ b/node_modules/cpu-features/.github/workflows/lint.yml @@ -0,0 +1,27 @@ +name: lint + +on: + pull_request: + push: + branches: [ master ] + +env: + NODE_VERSION: 20.x + +jobs: + lint-js: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + - name: Check Node.js version + run: node -pe process.versions + - name: Install ESLint + ESLint configs/plugins + run: npm install + - name: Lint files + run: npm run lint diff --git a/node_modules/cpu-features/LICENSE b/node_modules/cpu-features/LICENSE new file mode 100644 index 00000000..9ea90e03 --- /dev/null +++ b/node_modules/cpu-features/LICENSE @@ -0,0 +1,19 @@ +Copyright Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/cpu-features/README.md b/node_modules/cpu-features/README.md new file mode 100644 index 00000000..1893d852 --- /dev/null +++ b/node_modules/cpu-features/README.md @@ -0,0 +1,59 @@ + +Description +=========== + +A simple [node.js](https://nodejs.org) binding to [cpu_features](https://github.com/google/cpu_features) for obtaining information about installed CPU(s). + + +Requirements +============ + +* [node.js](http://nodejs.org/) -- v10.0.0 or newer +* An appropriate build environment -- see [node-gyp's documentation](https://github.com/nodejs/node-gyp/blob/master/README.md) + + +Install +======= + + npm install cpu-features + + +Example +======= + +```js + // Generally it's a good idea to just call this once and + // reuse the result since `cpu-features` does not cache + // the result itself. + const features = require('cpu-features')(); + + console.log(features); + // example output: + // { arch: 'x86', + // brand: 'Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz', + // family: 6, + // model: 58, + // stepping: 9, + // uarch: 'INTEL_IVB', + // flags: + // { fpu: true, + // tsc: true, + // cx8: true, + // clfsh: true, + // mmx: true, + // aes: true, + // erms: true, + // f16c: true, + // sse: true, + // sse2: true, + // sse3: true, + // ssse3: true, + // sse4_1: true, + // sse4_2: true, + // avx: true, + // pclmulqdq: true, + // cx16: true, + // popcnt: true, + // rdrnd: true, + // ss: true } } +``` diff --git a/node_modules/cpu-features/binding.gyp b/node_modules/cpu-features/binding.gyp new file mode 100644 index 00000000..461c3e5e --- /dev/null +++ b/node_modules/cpu-features/binding.gyp @@ -0,0 +1,16 @@ +{ + 'targets': [ + { + 'target_name': 'cpufeatures', + 'dependencies': [ 'deps/cpu_features/cpu_features.gyp:cpu_features' ], + 'include_dirs': [ + 'src', + "> $(depfile) +# Add extra rules as in (2). +# We remove slashes and replace spaces with new lines; +# remove blank lines; +# delete the first line and append a colon to the remaining lines. +sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ + grep -v '^$$' |\ + sed -e 1d -e 's|$$|:|' \ + >> $(depfile) +rm $(depfile).raw +endef + +# Command definitions: +# - cmd_foo is the actual command to run; +# - quiet_cmd_foo is the brief-output summary of the command. + +quiet_cmd_cc = CC($(TOOLSET)) $@ +cmd_cc = $(CC.$(TOOLSET)) -o $@ $< $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c + +quiet_cmd_cxx = CXX($(TOOLSET)) $@ +cmd_cxx = $(CXX.$(TOOLSET)) -o $@ $< $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c + +quiet_cmd_objc = CXX($(TOOLSET)) $@ +cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< + +quiet_cmd_objcxx = CXX($(TOOLSET)) $@ +cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# Commands for precompiled header files. +quiet_cmd_pch_c = CXX($(TOOLSET)) $@ +cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ +cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_m = CXX($(TOOLSET)) $@ +cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< +quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ +cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# gyp-mac-tool is written next to the root Makefile by gyp. +# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd +# already. +quiet_cmd_mac_tool = MACTOOL $(4) $< +cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" + +quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ +cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) + +quiet_cmd_infoplist = INFOPLIST $@ +cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" + +quiet_cmd_touch = TOUCH $@ +cmd_touch = touch $@ + +quiet_cmd_copy = COPY $@ +# send stderr to /dev/null to ignore messages when linking directories. +cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") + +quiet_cmd_symlink = SYMLINK $@ +cmd_symlink = ln -sf "$<" "$@" + +quiet_cmd_alink = LIBTOOL-STATIC $@ +cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %.o,$^) + +quiet_cmd_link = LINK($(TOOLSET)) $@ +cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink = SOLINK($(TOOLSET)) $@ +cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ +cmd_solink_module = $(LINK.$(TOOLSET)) -bundle $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) + + +# Define an escape_quotes function to escape single quotes. +# This allows us to handle quotes properly as long as we always use +# use single quotes and escape_quotes. +escape_quotes = $(subst ','\'',$(1)) +# This comment is here just to include a ' to unconfuse syntax highlighting. +# Define an escape_vars function to escape '$' variable syntax. +# This allows us to read/write command lines with shell variables (e.g. +# $LD_LIBRARY_PATH), without triggering make substitution. +escape_vars = $(subst $$,$$$$,$(1)) +# Helper that expands to a shell command to echo a string exactly as it is in +# make. This uses printf instead of echo because printf's behaviour with respect +# to escape sequences is more portable than echo's across different shells +# (e.g., dash, bash). +exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' + +# Helper to compare the command we're about to run against the command +# we logged the last time we ran the command. Produces an empty +# string (false) when the commands match. +# Tricky point: Make has no string-equality test function. +# The kernel uses the following, but it seems like it would have false +# positives, where one string reordered its arguments. +# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ +# $(filter-out $(cmd_$@), $(cmd_$(1)))) +# We instead substitute each for the empty string into the other, and +# say they're equal if both substitutions produce the empty string. +# .d files contain ? instead of spaces, take that into account. +command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ + $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) + +# Helper that is non-empty when a prerequisite changes. +# Normally make does this implicitly, but we force rules to always run +# so we can check their command lines. +# $? -- new prerequisites +# $| -- order-only dependencies +prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) + +# Helper that executes all postbuilds until one fails. +define do_postbuilds + @E=0;\ + for p in $(POSTBUILDS); do\ + eval $$p;\ + E=$$?;\ + if [ $$E -ne 0 ]; then\ + break;\ + fi;\ + done;\ + if [ $$E -ne 0 ]; then\ + rm -rf "$@";\ + exit $$E;\ + fi +endef + +# do_cmd: run a command via the above cmd_foo names, if necessary. +# Should always run for a given target to handle command-line changes. +# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. +# Third argument, if non-zero, makes it do POSTBUILDS processing. +# Note: We intentionally do NOT call dirx for depfile, since it contains ? for +# spaces already and dirx strips the ? characters. +define do_cmd +$(if $(or $(command_changed),$(prereq_changed)), + @$(call exact_echo, $($(quiet)cmd_$(1))) + @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" + $(if $(findstring flock,$(word 2,$(cmd_$1))), + @$(cmd_$(1)) + @echo " $(quiet_cmd_$(1)): Finished", + @$(cmd_$(1)) + ) + @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) + @$(if $(2),$(fixup_dep)) + $(if $(and $(3), $(POSTBUILDS)), + $(call do_postbuilds) + ) +) +endef + +# Declare the "all" target first so it is the default, +# even though we don't have the deps yet. +.PHONY: all +all: + +# make looks for ways to re-generate included makefiles, but in our case, we +# don't have a direct way. Explicitly telling make that it has nothing to do +# for them makes it go faster. +%.d: ; + +# Use FORCE_DO_CMD to force a target to run. Should be coupled with +# do_cmd. +.PHONY: FORCE_DO_CMD +FORCE_DO_CMD: + +TOOLSET := target +# Suffix rules, putting all outputs into $(obj). +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# Try building from generated source, too. +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + +$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + + +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,cpufeatures.target.mk)))),) + include cpufeatures.target.mk +endif +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,deps/cpu_features/cpu_features.target.mk)))),) + include deps/cpu_features/cpu_features.target.mk +endif + +quiet_cmd_regen_makefile = ACTION Regenerating $@ +cmd_regen_makefile = cd $(srcdir); /usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/spw/Library/Caches/node-gyp/20.6.1" "-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/spw/Library/Caches/node-gyp/20.6.1/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/spw/Documents/GitHub/sunpeiwen/node_modules/cpu-features" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/Users/spw/Documents/GitHub/sunpeiwen/node_modules/cpu-features/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/common.gypi "--toplevel-dir=." binding.gyp +Makefile: $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/deps/cpu_features/cpu_features.gyp $(srcdir)/../../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/buildcheck.gypi $(srcdir)/../../../../../Library/Caches/node-gyp/20.6.1/include/node/common.gypi + $(call do_cmd,regen_makefile) + +# "all" is a concatenation of the "all" targets from all the included +# sub-makefiles. This is just here to clarify. +all: + +# Add in dependency-tracking rules. $(all_deps) is the list of every single +# target in our tree. Only consider the ones with .d (dependency) info: +d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) +ifneq ($(d_files),) + include $(d_files) +endif diff --git a/node_modules/cpu-features/build/Release/.deps/Release/cpu_features.a.d b/node_modules/cpu-features/build/Release/.deps/Release/cpu_features.a.d new file mode 100644 index 00000000..5410c729 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/cpu_features.a.d @@ -0,0 +1 @@ +cmd_Release/cpu_features.a := rm -f Release/cpu_features.a && ./gyp-mac-tool filter-libtool libtool -static -o Release/cpu_features.a Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o diff --git a/node_modules/cpu-features/build/Release/.deps/Release/cpufeatures.node.d b/node_modules/cpu-features/build/Release/.deps/Release/cpufeatures.node.d new file mode 100644 index 00000000..2bfdde98 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/cpufeatures.node.d @@ -0,0 +1 @@ +cmd_Release/cpufeatures.node := c++ -bundle -undefined dynamic_lookup -Wl,-search_paths_first -mmacosx-version-min=10.15 -arch x86_64 -L./Release -stdlib=libc++ -o Release/cpufeatures.node Release/obj.target/cpufeatures/src/binding.o Release/cpu_features.a diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o.d new file mode 100644 index 00000000..7d59ed16 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o.d @@ -0,0 +1,8 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o ../deps/cpu_features/src/filesystem.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o: \ + ../deps/cpu_features/src/filesystem.c \ + ../deps/cpu_features/include/internal/filesystem.h \ + ../deps/cpu_features/include/cpu_features_macros.h +../deps/cpu_features/src/filesystem.c: +../deps/cpu_features/include/internal/filesystem.h: +../deps/cpu_features/include/cpu_features_macros.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o.d new file mode 100644 index 00000000..c0a63b00 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o.d @@ -0,0 +1,6 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o ../deps/cpu_features/src/impl_aarch64_linux_or_android.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o: \ + ../deps/cpu_features/src/impl_aarch64_linux_or_android.c \ + ../deps/cpu_features/include/cpu_features_macros.h +../deps/cpu_features/src/impl_aarch64_linux_or_android.c: +../deps/cpu_features/include/cpu_features_macros.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o.d new file mode 100644 index 00000000..ecf2a41c --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o.d @@ -0,0 +1,6 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o ../deps/cpu_features/src/impl_aarch64_macos_or_iphone.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o: \ + ../deps/cpu_features/src/impl_aarch64_macos_or_iphone.c \ + ../deps/cpu_features/include/cpu_features_macros.h +../deps/cpu_features/src/impl_aarch64_macos_or_iphone.c: +../deps/cpu_features/include/cpu_features_macros.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o.d new file mode 100644 index 00000000..9114968c --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o.d @@ -0,0 +1,6 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o ../deps/cpu_features/src/impl_arm_linux_or_android.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o: \ + ../deps/cpu_features/src/impl_arm_linux_or_android.c \ + ../deps/cpu_features/include/cpu_features_macros.h +../deps/cpu_features/src/impl_arm_linux_or_android.c: +../deps/cpu_features/include/cpu_features_macros.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o.d new file mode 100644 index 00000000..da11ba91 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o.d @@ -0,0 +1,6 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o ../deps/cpu_features/src/impl_mips_linux_or_android.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o: \ + ../deps/cpu_features/src/impl_mips_linux_or_android.c \ + ../deps/cpu_features/include/cpu_features_macros.h +../deps/cpu_features/src/impl_mips_linux_or_android.c: +../deps/cpu_features/include/cpu_features_macros.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o.d new file mode 100644 index 00000000..5dfe6d64 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o.d @@ -0,0 +1,6 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o ../deps/cpu_features/src/impl_ppc_linux.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o: \ + ../deps/cpu_features/src/impl_ppc_linux.c \ + ../deps/cpu_features/include/cpu_features_macros.h +../deps/cpu_features/src/impl_ppc_linux.c: +../deps/cpu_features/include/cpu_features_macros.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o.d new file mode 100644 index 00000000..6df1ae7c --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o.d @@ -0,0 +1,6 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o ../deps/cpu_features/src/impl_x86_freebsd.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o: \ + ../deps/cpu_features/src/impl_x86_freebsd.c \ + ../deps/cpu_features/include/cpu_features_macros.h +../deps/cpu_features/src/impl_x86_freebsd.c: +../deps/cpu_features/include/cpu_features_macros.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o.d new file mode 100644 index 00000000..5b825ea1 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o.d @@ -0,0 +1,6 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o ../deps/cpu_features/src/impl_x86_linux_or_android.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o: \ + ../deps/cpu_features/src/impl_x86_linux_or_android.c \ + ../deps/cpu_features/include/cpu_features_macros.h +../deps/cpu_features/src/impl_x86_linux_or_android.c: +../deps/cpu_features/include/cpu_features_macros.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o.d new file mode 100644 index 00000000..49cd7894 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o.d @@ -0,0 +1,22 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o ../deps/cpu_features/src/impl_x86_macos.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o: \ + ../deps/cpu_features/src/impl_x86_macos.c \ + ../deps/cpu_features/include/cpu_features_macros.h \ + ../deps/cpu_features/src/impl_x86__base_implementation.inl \ + ../deps/cpu_features/src/copy.inl \ + ../deps/cpu_features/include/cpuinfo_x86.h \ + ../deps/cpu_features/include/cpu_features_cache_info.h \ + ../deps/cpu_features/src/equals.inl \ + ../deps/cpu_features/include/internal/bit_utils.h \ + ../deps/cpu_features/include/internal/cpuid_x86.h \ + ../deps/cpu_features/src/define_introspection.inl +../deps/cpu_features/src/impl_x86_macos.c: +../deps/cpu_features/include/cpu_features_macros.h: +../deps/cpu_features/src/impl_x86__base_implementation.inl: +../deps/cpu_features/src/copy.inl: +../deps/cpu_features/include/cpuinfo_x86.h: +../deps/cpu_features/include/cpu_features_cache_info.h: +../deps/cpu_features/src/equals.inl: +../deps/cpu_features/include/internal/bit_utils.h: +../deps/cpu_features/include/internal/cpuid_x86.h: +../deps/cpu_features/src/define_introspection.inl: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o.d new file mode 100644 index 00000000..13beeeef --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o.d @@ -0,0 +1,6 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o ../deps/cpu_features/src/impl_x86_windows.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o: \ + ../deps/cpu_features/src/impl_x86_windows.c \ + ../deps/cpu_features/include/cpu_features_macros.h +../deps/cpu_features/src/impl_x86_windows.c: +../deps/cpu_features/include/cpu_features_macros.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o.d new file mode 100644 index 00000000..6ab5a242 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o.d @@ -0,0 +1,12 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o ../deps/cpu_features/src/stack_line_reader.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o: \ + ../deps/cpu_features/src/stack_line_reader.c \ + ../deps/cpu_features/include/internal/stack_line_reader.h \ + ../deps/cpu_features/include/cpu_features_macros.h \ + ../deps/cpu_features/include/internal/string_view.h \ + ../deps/cpu_features/include/internal/filesystem.h +../deps/cpu_features/src/stack_line_reader.c: +../deps/cpu_features/include/internal/stack_line_reader.h: +../deps/cpu_features/include/cpu_features_macros.h: +../deps/cpu_features/include/internal/string_view.h: +../deps/cpu_features/include/internal/filesystem.h: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o.d new file mode 100644 index 00000000..172b7fef --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o.d @@ -0,0 +1,11 @@ +cmd_Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o := cc -o Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o ../deps/cpu_features/src/string_view.c '-DNODE_GYP_MODULE_NAME=cpu_features' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DNDEBUG' '-DSTACK_LINE_READER_BUFFER_SIZE=1024' '-DHAVE_SYSCTLBYNAME=1' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../deps/cpu_features/include -I../deps/cpu_features/include/internal -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o.d.raw -c +Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o: \ + ../deps/cpu_features/src/string_view.c \ + ../deps/cpu_features/include/internal/string_view.h \ + ../deps/cpu_features/include/cpu_features_macros.h \ + ../deps/cpu_features/src/copy.inl ../deps/cpu_features/src/equals.inl +../deps/cpu_features/src/string_view.c: +../deps/cpu_features/include/internal/string_view.h: +../deps/cpu_features/include/cpu_features_macros.h: +../deps/cpu_features/src/copy.inl: +../deps/cpu_features/src/equals.inl: diff --git a/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpufeatures/src/binding.o.d b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpufeatures/src/binding.o.d new file mode 100644 index 00000000..27079777 --- /dev/null +++ b/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpufeatures/src/binding.o.d @@ -0,0 +1,157 @@ +cmd_Release/obj.target/cpufeatures/src/binding.o := c++ -o Release/obj.target/cpufeatures/src/binding.o ../src/binding.cc '-DNODE_GYP_MODULE_NAME=cpufeatures' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DCPU_FEATURES_VERSION_REV=8a494eb1e158ec2050e5f699a504fbc9b896a43b' '-DBUILDING_NODE_EXTENSION' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../src -I../../nan -I../deps/cpu_features/include -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -std=gnu++17 -stdlib=libc++ -fno-rtti -fno-exceptions -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/cpufeatures/src/binding.o.d.raw -c +Release/obj.target/cpufeatures/src/binding.o: ../src/binding.cc \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/cppgc/common.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8config.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-array-buffer.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-local-handle.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-internal.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-version.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-object.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-maybe.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-persistent-handle.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-weak-callback-info.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-primitive.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-data.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-value.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-traced-handle.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-container.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-context.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-snapshot.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-date.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-debug.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-script.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-callbacks.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-promise.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-message.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-exception.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-extension.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-external.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-function.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-function-callback.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-template.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-memory-span.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-initialization.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-isolate.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-embedder-heap.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-microtask.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-statistics.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-unwinder.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-embedder-state-scope.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-platform.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-json.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-locker.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-microtask-queue.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-primitive-object.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-proxy.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-regexp.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-typed-array.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-value-serializer.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-wasm.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_version.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_api.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/js_native_api.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/js_native_api_types.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_api_types.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_buffer.h \ + ../../nan/nan.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/errno.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/version.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/unix.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/threadpool.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/darwin.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_object_wrap.h \ + ../../nan/nan_callbacks.h ../../nan/nan_callbacks_12_inl.h \ + ../../nan/nan_maybe_43_inl.h ../../nan/nan_converters.h \ + ../../nan/nan_converters_43_inl.h ../../nan/nan_new.h \ + ../../nan/nan_implementation_12_inl.h \ + ../../nan/nan_persistent_12_inl.h ../../nan/nan_weak.h \ + ../../nan/nan_object_wrap.h ../../nan/nan_private.h \ + ../../nan/nan_typedarray_contents.h ../../nan/nan_json.h \ + ../../nan/nan_scriptorigin.h \ + ../deps/cpu_features/include/cpu_features_macros.h \ + ../deps/cpu_features/include/cpuinfo_x86.h \ + ../deps/cpu_features/include/cpu_features_cache_info.h +../src/binding.cc: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/cppgc/common.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8config.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-array-buffer.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-local-handle.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-internal.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-version.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-object.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-maybe.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-persistent-handle.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-weak-callback-info.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-primitive.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-data.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-value.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-traced-handle.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-container.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-context.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-snapshot.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-date.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-debug.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-script.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-callbacks.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-promise.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-message.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-exception.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-extension.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-external.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-function.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-function-callback.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-template.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-memory-span.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-initialization.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-isolate.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-embedder-heap.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-microtask.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-statistics.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-unwinder.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-embedder-state-scope.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-platform.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-json.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-locker.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-microtask-queue.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-primitive-object.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-proxy.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-regexp.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-typed-array.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-value-serializer.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-wasm.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_version.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_api.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/js_native_api.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/js_native_api_types.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_api_types.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_buffer.h: +../../nan/nan.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/errno.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/version.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/unix.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/threadpool.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/darwin.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_object_wrap.h: +../../nan/nan_callbacks.h: +../../nan/nan_callbacks_12_inl.h: +../../nan/nan_maybe_43_inl.h: +../../nan/nan_converters.h: +../../nan/nan_converters_43_inl.h: +../../nan/nan_new.h: +../../nan/nan_implementation_12_inl.h: +../../nan/nan_persistent_12_inl.h: +../../nan/nan_weak.h: +../../nan/nan_object_wrap.h: +../../nan/nan_private.h: +../../nan/nan_typedarray_contents.h: +../../nan/nan_json.h: +../../nan/nan_scriptorigin.h: +../deps/cpu_features/include/cpu_features_macros.h: +../deps/cpu_features/include/cpuinfo_x86.h: +../deps/cpu_features/include/cpu_features_cache_info.h: diff --git a/node_modules/cpu-features/build/Release/cpu_features.a b/node_modules/cpu-features/build/Release/cpu_features.a new file mode 100644 index 0000000000000000000000000000000000000000..a3d0d5574fa6b58f43c6ff161b3eec0d5aaad927 GIT binary patch literal 163760 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 z zs|0K(qmsKexWKgG-d<>!>vcYFaN)m4J#%VP?(=uw_|v31r~_H_8~nnC8mtC%PJ~>S zuwa`8&ZO#|hR&pdlbGzmzNwB4Wy`gN9G{XYmtakyVJ28di$LT#a48DMsecwmfWOd8n_Y z$amx!w~?iNN0zi$7GJeIdD`;mE=zMQ{q-CRdPXdqI6>JH$;qW>gmGNyaO6ZUn!X>$ zhn^9^F{EYqady%(VmMi}jJ2GV=q!pG^o;ey{hNAu%oxx9dBNjq4&((pdomAcn$|E6 zF-<-D92#V*)%Va)Q%~U`O$)7^hXz?_?K(8nB6ZiHFl*1jd5zXuQktnklLq^mEhU8&^)0=SV-*jWEK&*p3I|~ zxt_wKnnhX}M<*54WE>S2X&pGqKjv9+RD4W}c`Wmk)}UkR6`mQ#cokZi$5<7fImZTF z&?-MBy5M>780V7KgJb+lTEgS%H?(#gPr9L%bDX%Tb?P|hrdG!Bq?`EMitQj9_}q$t z)!=hV5c9{T!Etzm?3@a(l`FzSeZp4+twaYjz~Kz?3)9_V;NW<4ibZfx#4m46N0-R^ zuU+Q@x1_^0^5j!^Pz0fuG`@a!FE`_MI9EaUyPxb->-#R}9=H(XJ=G^DL<#b-zeQxX z=q~$Pc0_{sAE#irZR@B}=@TflU?eSP}3ZM9|ohA5)M?*HYTBWJd+rh8mpMrxmf1lTr+2A10 zxt0H^2qHi^E7wIX8k{mv^sl?5&g0f`GXuM9&ttQIhWr5URUc`ksp7ieRVTMUJtpv` zM#h^rE<6h93In`1JfoMU^6m$xosL$5*@lTP`oK6ui@`_j&DkY#z*YXua7ih+JbzzU zN`UVwHsm9@MM3gr8;jZsL!v31csNvuM>so(inb8~~ zY%g*yZY*{9*X~9-IAGf|BcDwPsag*HznTu<=-Qr@^KBo#GYOnzZ#T9+9QqynVIiy7 z2g9$}cOr*enp)HK^ro6MiOk-uaCZMBZL|c7yUp|XOsh)l|1%2hw!=YX^8PnrOeb2k z5TYOIHZ%f+1;!}+UE2C~XTpacVl(K@w)DN6>t1>omLn#|Pg=hh9qNm_a0!_O2W8=o zvnUDNsK}yyc6SoWq8_qPNui6D)^tb1F28)VY2Wn&*`q;3)WNqIqC@aV`Y*J)T!9ZR zW!11v=8C*`=Cr7k&~f(%A3pzJX~`2-j&&{39obLZV3etEUNUD?S%x!8bXPS|-#0js zv`1+dKe$LyX({BPN_booPb;G$+63ERC>!j_r|aJD+Z$FtFdbYbauE!3XAeaFGF;)o zPIUY*PS-K*oGpgM0wF7c@@s80|7HG6O!uxgX{ZLwA@Ul?t9~WY8JQWmWT+6+G3_jw zX&NRb?GN4NT|I~i>q!i2Mg=;x`UllgNerVWF)8=HW1e$*5Yv+3{2UP@QXz&l<6kn< zbWBX<7K1l^b$&*M-;)^bjPJV zT-rcr>vPpNh-NuHs!wxu9Ts;zkkCkgSq8&Fy@Y}`!!*9A2>WY&8rpJosRBnU3K4rf z5Y)C)y0DY&I&2fX$lIJ#f&?wB>rTM!`G8X7N@n<=qp5$mk5bXPUaOOte!#?3Z8+X% zTyqa%PWL3{?N}N*gceT9RuEI!lb8hO8#~Z4jxO(KVx%)xpuJqh@!PmNdOOqwXUYc~ zx%%9sjpcX7ZH8ke|BFmPPhvXfxS$0^mnJ1K)YCnXaUH*ZCSEvQ@iQ^ZnIF9oF_oiL zkm-z^h%-&Y#7x>$wbSWi4`eEO67%8kMAU=1v?+;k?@0`0!Vz7>4BddAiQ&wAB|yXo z#;6eUA%n~`6BDBzS3k@7TMuH+_9W(W)kGu=E+3S{2znADneYs`BK^=^`7<$LGuzQd z-w$^y6=FVTxZ_L@V`8e}n)-~t--At;dlK`t${m&B!pHu6Sb!^g5|c2oVh1WxH~42_ zL^H=@FGQ-N3Nc?>C*n*?NSTRmyEA@g4`P0S%r|`(iKDVnvwJq`58i{+L*+Eo=T1ub zuyaCIkE~mI){`}vo-|IG^;n$s_lQPABC?HRCOQoBlxsi6#)CIL0j{rM364*YxL0mX z>+1o2y=0&S8MA_s0*tP-bubD2UeE}wE_|@8DFN#^^i7i^YMh2ZQJD>W>^YpQoC(JJ%dY^jtm}kM! zOGmqEUX8qY^2C+%oYz{#)5=QjT=nQZvbeVF^u4>>Y14|m&YZpfc){w`qwCI;KWyP` z+g3c|?DJ82(u(!R0CKJ27DOoIb@b;0TqKUcj0 zPSxj|z#M*{Cr4Wr44tGR*hCqunWqf4Q3iXc1Uo2$g(|`0mBDSw;8dz#`c5+MCa%lFpFjoXN12Q+|Z4X@~arYI`wYO8=6!&awcO-7<$s z(TUk)9hWO}HZM>X7^w{Ap2|28a0VU9t*nE(?BZAo$pm5MoE#z#5S6LC0Chqcn0?0a|$`;ANp& zoPrnTMM{D)R0vWD&Qu1ARD!dW!SyP^2b96AV~V`BN>MPZ)!_3ULSAh?I|uEVb8dTr z$F1+wkY4#SU_nOI*JY#~Kam5}!D81B0?1EH>^|NA>%CM0-K4aCm#OYhwDMD5IvWme zm-0;DROUp_uc}c}O?S+dM{&yN=(BWR(Hy|EunNkO?{9J@p_NGy3yOo4Is)CdBq|6p zXH0<|Qn;cFLid{Ld@_XwS$G(d!SX2Sd28XUC77=y+-!R6jr@S02~Ye5;UzUgY}i}T zI^YMObs=qB;}%4~u8B$lh~rTy3_pJv0pKufLn+8fg+t%R9Z ztJIl2av7Jp7eX}1f5@8rKz(~1$0NB zg40)ffWD|F=ueNPJr@m^*EzuO?Jqz-XO=fk^LIJdb%s4}-Cytd`_G^k_5@vc%=R=j zM+v(47ofMM?rrBUkrUvQQKA>KXk>H`&?ol*U34PELN`hYI$Y1xL(&V6jja(xC_y)y z`RYb7TJ8RC6Ybv<^ozbjCU&TRKA|V*#L314-3ArVCrS#+wF-Wg^w^%De|k0eJ8P7@ z&H;v>Fz9B*I?hz+1i$+odt*Kh-CJQe|!u!U~tbkhS?8Uf3RTh zwpyeEo7Ri^<-=VMV?Q#x6J~T$XLh>J>`a*XQ8M!jGIE_JhI0%iFBw)qgR>91VSZOX zH+&UA25(-f43^?x*|d+nXhWpdM^dRM8d#rORg|W`{MJ3JU}~xIdl+LTD)?w?wAk=A$Eq@pL<3<;R_t(wkTz&tCY}@&8m`IeEFML*Xm>|*?cX4o zoPdr+!>oIoBAYHm0Dyk{qW-FnJwRXI6ZF%Y`<~_FlY!bW=tq75dhq_F(ZX6K=x5Em zkA3U`dRea?pf~LGY`wZnUguhy%wK?hX3w;WFl;`K2pH_y>giR{-}7hCxg&aj&R=}7 zs&||c^srxmF5Nq_GqFZaK%}{3q+`FuL+ySB{XkF9L$2MmO2TK7#{w%xQ7wCdUb494 zLvL(FF9ZE#yZ)N2hMy%pt|#c1?WVPG@NxGf=taK(Jv1T1QLF-bON;lpYu-OgdI~na z{*R<5J@nX9xl&%|TARXOfZjZJ+A}t`7bii_n6}{MgPx#U_5hu;tUO8Qs1o#&Uw|$g zFhfL|mZPQ?X`V2~@BZS^JwQL&6ZDujRZe9pppV3$x8L^(Bw+S%K4)$;$i>F{#|IKz z0@<`{6s<#Rb2@Ji&3gfRM6$rQhtQ`g}3W&VE7?c_mn{8^^Z zv_$h{ts9F* zeqMA8k3a4A6`Iy64Vk7jU!iGrjLh$nILPZ9U>M{hQ$UpjP`meyh~r|TZbX32ur7_0 zEhCE|4QN{P6`EF8KbfYbtaGE)hOb*X$U%RZcBX&fX1S)NB;eD?G2e67$O&-D==%NA zp_64lgU(yh19b6~Hn*YGO3)?00KMa61+!PV5_C7e?pK!|^Z-4qC+N)5ZMz)tAtEH` zi+h63s`5NK^tlS?yLyfOcBlvF)jdJ?U>xDPO_0|)z%c9=p!dBuBBMkFbZ&Cl*WM?7 z2EDo`=#Ho27H!3cg>Y^o(5rs|`i!)L^UOl!1UO|Z$hxOyUGX#MqMo30u6@5TOsWLk zbwE!^=USf)?{!%T`c?lqtE;%Hf0p#+Jwflk;aFy-3g}CFf-bt|W;y)33h0?DN9$ea z0lK&+=)APUL06Hr3QV=;!&EE!7oZyq(cZ^|6OG8GrZX&vc6RotlRtxAIG~55XP&xO zzO`E^>1`PF)CW%OaJz0~dDf#=%jA!bl=!1*w|UQv6H%~(|uE?U{h!1rcP>H zr+ZwdAg;4Au9F(y=^o!Hi0`b7@1&-5x~FssQaUSBI;mSb-M4lMwsux-?WCr5x~Fyu zQadYCJE_|`-M4iLwslr+>!hZ2x~F|fO#5;*?TcFa7q|2;iRoXirhie}{>^QBf?#_> z<@U|g9h=>EY!>X;TDc>gnwjpNnJ&mougu&@&D!anwMUS(r!s2~bzheIzAVAM{gwN2 zsoA;i*|~!3+{)}D)SM#soFYL^QDsgMb$^lj{vyHtqRRb6)C0xt2Z{v;iYpHkQx6uq zA1oFeEUr9QOf5X+UU&-mEMcYfTHLTxa;3Fve&5w{r8PwvoU=d~oT?12QU*^>R|dDK z1n*D=cdGltn1EOqDEIVf#_9nAGI%AWiOed;j#}2Uw|? zvRa`&zmX{whQ$i?d18RKud8fFrx?`dcXFj-%4&uByyJex0x>pgkDam_)Mwwn7dt#y zgp~@&Nv=M(_LgaKWeW8<$#BM=Yg*e-;$g%KIr(zk^4(qRY0H66LfZ9(7FN7R6u`HJ0SZ@576y zueckJdVo&Y_W)fS7^X4MR|&fC7oc|-ZsaHbD<=RZicZ~g1E2j2x@%)k&=21FBPatO z$pCc*NuP*8&v;C#&u!iF4}e_cKWI>>&puH|Qx@f6CAz@YS7fhHq7Ol!xQ_&sXz;LY zLuL7_np_NaR8$wp)rY9<+W~tVl2roOPUoDVltfBt!ynRy{y{T4M`IPxzVD@VC)2)0 z(asLaOfaPTi~dM3=vd37g%9FWM$-?P(+3Zv=UCFS4d??c=!S#n27~DXjOqPH(fgUx z^$qE}N7DOh(|3-dGd<}$Ea*DZ=<%$(2_~75^>oX@9h7PG64qVG$jnHomgV3wwQ2M> z{Lpq@=xa{sD^}=BRzw>S`a&A=TpaRD6w=BM`I{Hg!U<_+g-D5zE7H}M#djqW%h%Tb z@;_m3Lt$hIedyqJ%5U`JoV%2fjZ3Wl|M{;vXQFi5A7fU)=kaCa7$4Y7CRUkw>*@+~Qa- zh;E~6FvPq;(p=-a34`Ev`v13>PRcuLs4+ajMA?Nk@IVj8H`h4wsN?=W-e0o`Dv#}e zRxP-VD!;?6>gpZyS=Nlb0{!~66J|!5PSZeVVUzdQxcjUK@<--B_?8y9w?4qe&nMEy zYWhmwaG&rPt4aP*{=uPP{^3^cp=;Log!oNg8R9=DG&DHE%6rnZ2rDn26*IjTjEV4D zZM7~U+-haWir{sA{#MH)W5WC+td_5Xi*X#6M~(@SJ**3fSQ!}N@5fpZ8X7ic&AN!lu<+18xLJn0R7OF3 zXs{n#!2>t(z(qOHD^Qg%0m}nc`Um^1@rhmzx8{%+?#Qb<-9ON0MGRa>Ba0pE3pd*M z1X%y~)g~B6TTX_e65LS+3NnAnWu+e(F&I@tUMKIBv5-Jk8U)VwiHT6W10VF%iRo~Z zc_!R^W1Yonr4&wQzGuyWK7nCrne$5L%^sYRr2x9Hvk^ENxqmMFG( z^%XF4YTxIzGfIdqXF<2ztV(~oN}IfCL+nft=gX+frT^NE)C|9O;nLq17ETTeu^;xQ z1Ps355*|Ni?&gJ)`8WjGi&?^*EU|B-?|9C#+g%pv68w3eMWTnqgg+&dD~@EJ?UlTD zmV?)yl&SF2{~ha4(_OC}>$$T+UgqC$7Mq`oy!UJ{Cu8yXg|1b9zLpsOb<0vMvb5-n z&h~|qd8_TuyiK_G+Ssw$Nc3nzn9xCd+$_@}+xIi49~hTidZd4m{#)e+Aukke2MG(c z*LdeTDDonm-bHJBq%)?*>#s5|c3JJ^m5+5C(MvSF&$Il{*o%VH@OutkPbpI>US^MZ zM;vPUa7)Xr)pzEnu8?_sGIG4G#j*j~oux$!bUVP7EC+{7Kb_pG#NuD*mj=N-A1)vZ z=-&dkQsh}6-|J%xcf%%Q_+&PWO1z*GKxer__O8$Tmod6JGj!_XjQN>MYF1|Rf(-ZE zi&wtvMfchqZ6LA-{zH7fK3;}lD`0ryBY#Ef?7HJ-VdJvR{vlqE)g83#?K9x$u2PG| zy1Nj|^MU2@^o~FNlChi@PY@qY(9MSY9u60_)IQQrq5pB*tZ-bmS|{r@Q`cbC_U9kA z()DeoM(lei*u8VwxF^pODsNuOIq;9T`Ps6%WKJ>Iyon>gVy*BD+_@00+d$ss(J(N* zaZUxjRRbBebyOTQD$u+H7l>#)Oh|{IQL%iuwuDp6LH!ii$WeJKe9vuV@=w7%DQ+j> z!U)MaRupt|f9vNy^sCBmaWX*nfVgT9fdtV$j<6Bhs&nAB4&Jp#k2VpHaVErZ3(ar} z-02{S+C9n?a`kW)5(MuJDgge0;oOJE*^lNdrw5Z4rbHKe1$%-i7nCBqfkhZaMg_CF zhtF&Cr#MH0VDq)7H165|=*<20QgbKzsky zt7!O6ld4;F!LJ@PfWpb2Ky$-u7v2+8}?WtKJjgz z(;FV|Vce}`;x=5EasEk)*QF>?094BetQ@5t?EtZKJwVJkXKz-1Fzg_Wn;5#Vyv&c6ukufCB6tH_>BrN5tk$jXe?=Td*azs37*(AF;1l zdFs7H>RVarz1WU$oyO)N40Nppm)N}P4NnY>U9z6dgU0UXY`}Kdp!^m z{U`8;t+GGz7ljv2@_L)G82Chlqk9JdR4>{#JcYOz39#`laR*^P6K%hB@CnGo#xfNDp@-UHf9d00W-K(pd9o@#mJ}@_^Q78tIJ z;{Ki=_xxNNW#EUBqJMR!pU4oCIZW2APuu6!yq*_+M4d*!Jyry<%~gp)R|r#C(uXhaSs=uVxN% z^!pGy=yXIGz;t`YkvX1g%b?AEhBljcGku>|dJJ8MARk zGAm}4T71`OAtkqV(1yl_t#s60N_;Y1z8<@>ZZpNzzeDdelj>VT#Fib*WVPb^O-v8M z7$}_y8?I1c!p$k1 z0HCuL2KIeW=s1WF4H4c$gbuh`rL7cfs#6}r9V=(xLG&k-eg-aE2?cZO>T?wdT+0(S z4ouHsGy!_%8PsYgjb+rcfoZmV%E{|Y%=sHK;BJ#K1isFs5CzK34|8^SAWN!CVD{!B z1QRgVx31o+31NTaa1*XuxCl-Mr%nP-BLjL?FN0^W;y;@Q&ZM*6O1Nmvg>=&io9GEM z8hMU~Z{r*7ojSD#(Pv35q1n)_WXf-^MZQH2br`|kogg9m14)0?0%G*ydPa14q=?v@eAplD zS5)tK=^v(T5W-%7a8vUlaWh<^z^!ihjBbQmHHjNdQ9(f|u3#>%;CWOS!j1L}vORAq zmEk5qxG`05W3356xZxvTC4WIG61U;XY|Boe`Zr^CT$E)itG}SENbzk8uAj2Xg0fu2 zH~NL2(|y^!69q-7;O1d8t`Fj#59t($ZJh*VTXze4M9iK=QABK}y-?s54!A8?g5_0@4r1J)*VxWy%Ut&*BQY;**GwD3kIw0?V5w74{9Qb>H}h!?uV)j*2g7 zSoQ(P&ZHe0L_C2(i+zJY6R05@t#h4NXf8u`^f255v^5P|(-;7r#IL2V&Mc>z6Dt1S zL`XPdLMAeKrhI@OMSk0dPK;h?gw9!NaVm!b$W?#2r>f9sKce9kqCpdcf;_i-*}rz8 zAzRtP-_ORtW{}wl!Lf&N+N2?!oV@doFmEt%t)YzEpbN{2j5+ht` ze73HEYJpN6CpcmK&{uyn^#ULG8zjk>Tq&IsJ*0J=%eCQ$_fqG zd!vR^j>*J^A=&B|94+O{@c*2L`ix4#-ocGt! zCgvrb?EnolhCA6Rd~7o+K}k4Zx*fmZCn6si*#eQDWJD$>g{lxK4ZVsx9CTcI0y3Uf z@a%+vRJ!~-SoXBN<{?bw{?7p^%T&^fl5u(|;<>9a_}yLB*^9`lB2VEUB7-Ntg-`St zpn%}`ixsF6gBQ;NL?IDwY^1!^TkI)=Fq2lYLE#heiT!I`$%u%%9)@958=a@%nCh{n z#72q^rgEJPK75?{jBuvSdvHPV>v-A=oe!Y73%RzQ_Z10t#{7=#5S_}xe8WRQG)uLe2FseE+Ebhf0nDse;N;<#* zgQ%g$bcX978pB0IL&Hm^<%!`c6ygXdXr>zm9W3&okx`iqYKGwVX|-nI6-Za9DMxOxZN zWRxzrGdIz-7VfCZz$e?dHtYP!zumksr{I)-|~rHVseypF>zM1E0W82Oe^DYoph@ zu*rN}-A9M%z_Yn9%=g#k`|m*YCU(NGbvZL{Fx)pJ)z$UifobtiKr zEc0K4#MZCu+S}^Ok1h81p3xuKU-`@c7=yW7QGj-|pmt1u!J>HX+mP-`Af6)|*MJ)! z^!JVnIeM-#>RZ_I3Ab+#f^9UNc_Y>sg9nba!xl%ND_$#5SGL`7qOYWVh3s)w-I`c} zR>h%_VPBWB1hZIzdqR#EZkUdHej&j?Ajlk{j8Jm#sdq!kQT7WoZXMRkMB2%g0n5B# zoZ0-9wFmUbrmB+TuB6A*Jr-1rJAk;zXJ$SY-upt6; zA}vveH=ogMY+LCKb5CJMyRRq}s)<-(`TCuWn*dK8+iLU5VY{bY;1cKA?y?FR7M&0UPpe^ z#+2gmV>+@^N7Ih!pdZkOBU(mJeg!ujbK=se)MYS?@N7s-|4ukqh<*-~u-<;z`@B>A zIrKI=*IJryCx>AXb^mT}R067PBbjOT`OZ?y8|u%D@!v+DG9J?z$#ndLJGb}2X)q7hKo^_IR5%s=-%;Uqje0BOU^&`ML(7I`gaRL#=p8Q32 z&9^1Zuw&gwy$v*2cp`#4fv01@6P^vEPifvY5(>d#`T_+qES%xL>mpiQi8KWJJWANzWrEF|gpm$T8GLwc)4k~O6K4JAts^|O%qpG~65I_?k_m>oCd)l^`)Te@Es3dNA} z^K(S-e-!0n+{I~6Vd6dP;fthB8d82-NFw5os3ELY{sMORiiL=npI1Hu}m9TnHHetoFXz6Rk&o|e`0ZHe}$Dk%l*DP9q2M^;KM07*o}vXBS3XUqJ?U7u`{-`wqj!!49; zP(K!&uGWiXdi_2k(}&>!%{sm=+2$&7X!SI$6Gx2{MO`mMO)-E_)+ru^Qnb-9(F3mU zM42qN!a)1#)72qj5`XB#)MSrfYWMIY8kWq5rtzZMul%NXXrnh-Lq_{8hK7v`Q8B7jLg#?xNm#iW7kEw*#1CG0ZT9=W$n`bBCbEM8wn~^6g1^k-#Cqs9iuH= z3mEK$Vp3wq!1c{$E3~u?Ul{_9-te*T(iI$qo$2a#;Yaa4G~bl_)N$zk>)u!R1GE27 zw>u%+RFKg`p0%2h(cn(!mTm|)ePh@G;ljYCiSXpPL~{=kmeqp8sAzL}ly7vEFRuSM zm#CGkgQj|?6FNob5?jxbSTcC$)A_7f?~AVs{fSC^c3I7;BhIBiS_fcZ6z9Tmg^z}; zh2etOO-1m-zOFsgj4eNLVo;8`P#rdrRkVG$l8W~;=*MBVxee7%feJ15UFd^^dk*g8 zDYCxE*0mDf**@Jj`iWFZ)u*u2E_Z zKnO*(sSbX`&a(b+&%G?n2qzn-ut^$$g|Szou36jzluA1)He;PWMn=IkRrcz~L3P=UrU>*)!Ei17j1RD_(w*s?5^t9fGg^|koe;dt&vW7(EJ1OZT`8Fjbl z(8cFS^*ezXCWkIkALA)dX7Vy>i8u~;SS}P5oYzRC?!*;m)crP8c?RF0$)Ss#zPP{F zvmvVf{jfDMyUCwdQuQoRm*~<1_dsk7TH~biFiCvmN6GfmpTMjef}yi#b}lfCu^xks z7-y9z0{;Gm&{{R5JHNvQwxbjq0vkM0alT>n7vSbNjEbkEKaIS9D63mX!qI$p{BF!9G&JlkTiW2}STi$oO-hg|^h5^nA#5cU0zL z%=|X7d-7Yz1^Wa|lYq^hxwkKU1JT{T|hhBo?&(6#Cv`3aWD z6-LBRb;w`0A*SgU<-2$LNwhv!Tb8_O0s5hqf^x-sBKk1eD!)!EvQ-?&kPE`ABVX~suJm2 zD7p}?U>BRqCES}3$;nYx=JHw3^;%_Rl)S=Q=(VDaVg+}e72Hdx6^BRxqoQ#y5pAIl z;wzAiyHx`}e9rnmg5_C~g!$#8zBzZ=4nf>MfEA7w7v&-`*v?XPvz6VUuX z$F-5|xVDZM?e)Z&Kd~KGh9!7r>ioz?RWM7?%Jzguyle?yF#QPI6Rtr=7Ud;F&*ACB zNXQPQ%JB6jL{d~_o3(*IOu#cT^AnYuVg3xX#iYGs9wg`HHejV{OTtFg9DfgVL*>R4 z+^g^fyD<{Ng@OAflV^4B0Hb|!)6xmpwLF(tcNW6Swj9OnqyMQ^S0G`k4;s?jnxDMX zu9}+~LvD0hPG9tIn$SuDQ`TWD7Xz`<>4S4S&=>xb+6$lE>4yD4&(4gzKvp!7LwA>N zCBCOJ$X}QxAN{8f+$0=y=X&rmw$|iGRyvLJ)L8%Xt!J>alB_0AP&*fhp1^j0Q8b+e-bs!rYyeIZam1}`-XM0^9dJoJ-tMytJ*1x)h4;Gfo(=mr zgEC{pd*_)nR0C_^PJ!k8VkGNGFc9Wg#j)%>K3koE2N#wul?8i&vh10-duL7pEFF6b z*8lIBsKx-7S?kVTAg~GM^}}ll@Oqn&p{5DnCjg4P)+@Z*-1^LpExE9yxysRovF4F& z)MJu$qO!fc=J5(68QsX-F9=_TXrxF!uASs8?hHklNIoUSM35Cah-e`GkO5;;=3BJx z^1D7@bLXI|+Z>MD67RHtCYJ26ffVGEFIc+zjV_c*kw_|Q51`dmtVN;WVe(fAyZ4D; zyw{8OD6&^8D>~~#U%qh)?l{H(-%)TNMsoF+)nU7qAEmEv&_b*7bm*nFH=ocq&}bz1 zA+l_2kFU@l!;eCTQWO{KzyvoEgc}~E*>GTEH>S)GJ)JxCGiF;zXNRMzm@5FC(;e~Lvu4egxC&}QP*d82*rKri7>#! zO0Rxm<7FVS)J~o-6y}PaIF$^jhp&wXD&H}rdn9Ae4hl0xip1-FsPlT&tDc(Te(1t% zF54hB25UoU)kZs-o!d2$4}&$?+4m8sZ2Jj&E!;Fm-Vd97_Iz(uBl{y_txRa(|OmKUB$DK6oNtxM24(VoO z!Kg-t!ZINZ!}VkC1k{s8SMjD^mzbThl*gm9M6zafz4L~u3*O4iU(SGyS9G!oKn@08 zW*+T-=x7n{eY;#UY6plI+Ba7*>hrc6-tVY~gDhQKOK4-8$NRoF@3l>jC}W#AH*Vby zexM&L5vx=7u4X|O3*Prb#@^L)BL;&be$0v}Tex=y*FtXNn$4LfT6Uf2YJ_B=adz&- z2DXcaZFbLmXs>~ycDZ+1An)Kwa+2X1zL+bc!tTamc9CMn>~nR-^;l8MX}F^x2b>aB z;@&51PsZUBcyjM1>H&}PxgN7+a8G!|dTQ&I<7`B1LY99m)G}G+okU$wT_Fw869?W# zXeNa{5Gr?~a2}(qGUf5a!3p-hp?0BN=5u!aKex(m6B)r%u-4e+FH)S!l;$eTJYknY zb`Lj~Yp@wCnd!`jO0aCppGJ_{f<@_`F$2^q}($OXtiPYx$6P-@Ll)h zPtEq*MSP#xy78Pr4SdUFw|Xi_%}-ZV5bJK-|9;aYdz7?-G(8z|22fAAoSU=x2WO^7 zmiBdj4@>M4RS@g$^G~YJVFfX@;!(UuEL$JmC7b?&OEbOf`luaGLUDdb%nm4FO(jS^Q|8^QGN&Y+SMKgE+RZAnnFVu`zK-1eP6h`WS+FK)AY*q=DDd?a((n|t`^iLvvf9WKb%CDaI4`}qaqi#*FN7_$iE1bFcuSI2 z)M;QIpP1xkeQ<2=n9cbmlA(_w71Hg%cA;;J(KWb={KZp6cyr-=98VP7M4_*+Z_wkT zWy{5ts0$B5<|X{=r2D_bN>q1MCE9cxD^WGt6Ng!(g}=^0AG6~Y_6cz%VxP#l?u@h& zxgVdrxK1Pq_v4p74>%)|>ZR-Tqc)5CPQPxgP3hBkO3%*GCf1GE4=k{zghyo0sCtxe z(ub)kS1uexDr-3D$@`$#Qw5GyYI`QeQc%6;OgwG`IGjY&)`75 z&d$o3v+wK3!Qh@*3yb#+C?8@UZ{X^zZR9QE4$PSRBwJ?-Nu9l%={Km(+SvIAd_~(i zIpPt}kg&@{mZAoYdE#6V4%;cnnZx1+&3a%VK9P@geL$or@Pv|k!Xwh9cWy)17(|pd zXgep9E)kinhbI{GO1|`|_c7V!>=U_#9!1$1)qLCF1eey0xh&F5>w&oSKI=q=ed%P? z@@nh}-7T}BVSh(vX25PtHIEe4s^v#9K}QoZWr4|1tc5xpZk>elaD;~LT~95hHru9G zds;d^=hiQ`Wg@RyvT>KFjgvLaMPA8-N5ujWuhz*QAg_0@Pl&1~_eAyBG|UhqYU8N= z-3CBCMvgf!rrl>S(fbSALOoh6YkDet86#?WsQnAkiWt!Ngroe4?ZW&%Zy(i$r;F?s zC1}{c7-L6b?BqeQM|_!ql{rgXnI9&cwvkd@h!xIyu1MYgxA0f;CxI}tX6PW9!BYdB z2bKWkFjw1Rv=VjD2J-SOy7y1(+ZKx$dE~Z;JB)B-F>ghg{kHxw7ez0s&I7^E`CyOc zYjr7}APjk%_&Ibe%l7TOQVQ&oA_l9ujoWLlbVLw+BXP5ZyU+TM`t4ash=C61A z?e`v7vgZI>mB>7^=`XlPF5fZf)<-z7o{ibRefc8?Zrw2$gnjJxOjJyUt7KLxuhDC=lg83Ai9nG-LlR)ydH(a!MLS3f!#b+OKS)$MZIKTGd= z%M!n^Yh_@@=P&*F2H95|{^kSGsT>1E-3c z{odHp+?cf$ci*N~z)B2T^eEp6i!D!3xS+yaIAzq_7FQuznUL@(OukQ^Kib>5i^AC- zWE0veQJ;ep?2o~ZW;GckcvRREyY00uRL(4nk*bHc^$!0O15WOq9J2~`R8Xbh2F?d; zhXbjz4fjE{y)GbL#%$9apR^b!n$^fih4h>3-R4rlu`lp~51P6-#|ArlwotW9C!P{Q zol;S8051s#7{p9u1Z!L0Mj7EJ$3Ri3@Sm3FUu#E)jhwAljS*HmT4p2khk66TQWMFvdLk^M||G)tVev} zaNlxm7c5>dTrZMa$`Eq1br|Y!%dQb`gAk|KwJ_tz=LUVL9Nipn?1j(kZ&S|rE#-a> zLhsbcBty+uhEvK~Hn+V^S)DZ_y?j6vlnVmj+-V=<1>$626$|Q(R3^A4f|m&@n|EX! zh@`14@O(0?cnNj-0)}!ydBHaC`6W+zZ_cZs8b(7{DEmFggA5yfw(MP9l#AnGK~2hg zg_Q9vgEug=pr+jvMKz>Ng}O32pm96R{Hp6_OW8{frCjI>!@%v{n{)C-Y*--xY@G4l z3|9sNEO%k~u;fD)$S21@QIp|nw0H6hT!=IhzFd8fVSQUsP>~JW_h+YP-NKjKgqc|r zW^#-E+)!?);^RlnUC+#g^+drn@sAn;&U*9w{jw1G>ma(liqmb2{37%(E*e1HoYotm z1XL7w!QeKt$Uh$b zAd$aCoPSun$LUa-w?AC-I+U83z6jP|4GSKI&>^Fkhu_kndGnSI*ZdoR1)UWaBaoVSQ?i~k)v^dG3h)V1V4-4vHPO!GhB7}ACgmVf%ZzWEe#;g?e>C%!MHx3|Egl|x3{jV} z#C-ggElSP2HD#FA1#FVT-il{CjNC z;P=W!Pyo?jn}$Oj7=j0CXdVXJQ(z$`+ca!>7}zX&H}I6h5IjT;TOQm)^B~owSux4O zM3;tW4|>Erc-n)(_B46P@bFO#Q5Rg|{Co7s+ea(vTR{G^m&~6(XE@a7AWc^A(ik?2*{%~`4Q7lXrlnDWvy zG%soL>#i!3>=^8q-wOCJ<;C@H@j`0+@Zbero25F|D&_^tg4MA!1tYg`WW~JUd zKP{UyDZ{mFoML`Fb!KQi15UCQ4HG>Z!X7t>dGXk>q1u(~6d3az7G*Mojxl0BJUZ5? z2)PYs>_!G6!wrKY&yP!ER4|G<9ba-5F&FXxCZ%19m- z`ags{b&K=wX%hyI!LTnI!=q0-1P?t!^DuY}X5P(9Qf5Ip4F^3Mf(O^N@USp#;e41L zF)Vl(qAs+GdH5|`nwB~|>cSBDcMhHZS{WSvBD86X;00nh=+F@PZx}lNgWIy?wBgYf z3{eLdasEBFXmCBwybb&w!?zCD#5{QFz~J_5cKYxbha92|tm6E8%3$y~9@x^fISc0u zi+V6b-!x0i!*BIXSsvnIQih2x4Z(+HXg&t}XVVvDFPxQ?4eSgLyEFtJ#-aHb?4M1) zjpt+0u$Xr?1RsWL;)5-ZMT>799(+WBeoNNXXvKVZ{4=$RAW=KV=~e2ytVJo=i&B#p zK}GrhyWLxDpr}=l$0)UST`O3-Pu523T)5?GR^c$+v&(4TWBD&mwspmoe^Z4639G3U)n(z1u@eDnJ4Mq2k5#W zCL@qJKp$?TTY{MRfy~o%(}Q$Z5VJgx`7`~~gLHq8^Ugr#FZ9Wsv@+OP705hG|NS94 zGPrePAoD!^SQDKQ+*2RO{FVNti7pE6c_fhe8~yRabX~B!C6IZMe(e#uC7Ak4AoCL4 z{3zWOtbHYrd4;aoMfV3A-U?)1qd(n6EA^It1Tt;(>yOcqdg~{FOb7ksZaPEHd=<#N zPH%mjF4DLD9LT&ufAu(BryuYQV&0^WIq4R?Q5VF#MZeHYcj+5KgP6DJU3=($J#|A6 z^Db@QODjXN5`&my^cQ>S$dJ}KLCkw}_dYr!r03=!<^%efC+MOO>W(1hL%Lxzp)QE|n0~&6?hi3;3t~Q@A2>iOLyfzFm_GXA0Xj0& z@>CG>DgD7ybVjJ{a1iqu{o>PfQE2O{LCoj$V+Ua|AAAa6@y&yl)nOyv4aeSb2E8v)qrvbN8__zwY&&-Vk)=O6R=4B&9KBlRob=(FYN9|auc83+Z%%To#Q zKLi}Z699)xHogH4;^T0m1pkJ^6D9c1fUDv8bigqkk}lBk1>#75ktF_g9Dauc4+k8d zF9sZ+YV8Q>^Cp5GS$$NYQ;xHvy=a`b)R3_!RP;-7#3hDQP} zF2^%me7z+8Hyj=*!7l@j`G^5rT#kMazco{DWOx%;jI#U2Zy^P_+Ae0 zk>H0o+%3Uh=kNguegbeTM>KZga{PkBM@jI@fa6%$c);;Fo?k5p6T|V6_z{3(KVS~v z_#7YK3^>}EKLRe;83RRS0gm>f0&skek6*~)TP64gz|p?#2AsEVSS~xc_{#}5hUHSxY!7c%vQ(XL?B=H9TM}6>zMe|~PprNo450T)bIQ#|)9sxMYeJ0@e z9M5ko;HXdY0T=6GGKVjd;PU{7qM`Bu7waLM6imW4N&G^<;g7l-a9~A9cMX6T-U>L< zW<8E~FGc{yVte=4#K2Cy91swGw4sg^vUOsaG z$9!Y~&dU?q@ueJ{J4AF4UkNy5g?vD@SUP~Mg)fHj3#OIDp`vUA9O>d$C>Ox$;Tr=O z<|!J!BtL+;;EOco!&gkFi^CU7@E#7oO@jAwxK)C?0mu9o!WT@6kk2nTe5C}xz~L1V z{AUioTY`H-;UWDR3GUC~TP64y4sVd)VI2OD1drtK-4fiy;ZI2L=^TDgf~Ru$^AbFh z!~ZV9Z{hGZ34RBMcS-OS9R98Zw{iFh3BHcQKbGJ%9DY`U-^bzqBf%Rv{DK63jKlva z!S{1GcCf|z@D~nONbtiPu9o0!9DbbyKg!{H3H~03M@aBf96nisf5zb^3H~*Qn(TJdarb}>N4xcB%M{)RK2_DShw@dKx9G)w|Z{YA^2_DDcHVK}@;gu3RgTpsU z@C6*cS%Tlj;q?+ckHa63;3XW6XEuxVVGV~jOYn^x-Xg&r9R3#x-oW86NbrX_{1pkl zhr>H1_|qKzmIOb<;m0NTD;)k034Vmb-4gs=4*y(&_j35x61w7?5W zho?yJc^p1Rf-m9lED4^?;kQcgA`ZVpg0JTA0tvpJ!%HN%ox{r|cs+-&m*5X_c(nxI z&Ea(t{7DY~lLT+&@SPI;MGk*Vg12+{J_-I7hd(XB-{B>2Z1{-Ojw$Kfss{tbt} zA;B+k_&XAuhE5pj=LZtp4{+#0QKtaMehum8K))z}!_P|aP!2yY!6P~Rq6ClP@XHc> z28VltBT1ZYI)|$ycov5TNbuV@Tra`%IefeXFXiwl61^^50K!G0FHYX>H)|1Y`*>;27DZZ z&43$3_(=|5D#0&vc$EYX1*ZYhX_DX;4nHixb2+?Mg4c5RB?%6ssXxLC=%2xF3BKjR zKSKDf*##991!d(^%PY#J#@@wk9Ef`cmct#`g>GJPUfHUgvb>_=ih?}cpb_s)y=zFA zr4mPI#gkt%`As0dCL{aL#Quw7|3$O^V%UGN>_3)-iKSs;iI`X_Q7n}xmP!;$C5ojI z#Zrl4sYJ08WVp%G2 zER{HxN*qfij-?XEQi)@!#IaQ3SSoQWl{l74JWC~>r4r9liD#+AvsB_)D)B6pc$P{$ zOC_GAVrHqBSt@3hikYQiW~rE2DrT07nWbW8shC+R2`rTamP!IkC4r@qz*0$IsU)ye z5?Cq;ER_V7ipj{5F&SApCL>G8WMnCsj4UaWk)>ravcybAmYT`Pk~0}OdV(5r^h_K* z6GzX)(KB)MOdLI4n|XES^x4EIw29Mb6Q|N9PNz+rQkyufHgRfg;`G|YDYl8zY!j#2 zCQi3aoN}8u?KW}hZQ}IX#3{Im({K}~;-=_?^2*|hyrQWUIk_bTQ(0?}nv+*lFsHO| z)xWwo)f8j;o%>P0b3gib?#KMj{n+2RANM==&A@J|ZB220WJ$HlO6N0GBvR~cRw77B(9iZ_5Io9SK+qaFVZ zlEnP4E6=Ma$z4|p(N=giB;_w*Ur+uLw#XDNakoi60NXb5m#~2ve~Ft3^4GXApKuME z+=;HE`D@&KO}G|jO!EkC3C3T;_FDWUE;8b;Vb>?&l5C*Fhdf&md5~LE_-oi4M06=o z!);GI_@Dr8CgQmTA@M^o$^0!?F(|qun=XjL!ZYl`!gSFsvaWt`c-F$f;Ven~lv@Yi zPg^iJyd-mQ7}v)RMsS7Z)rcgQxIk@iBz7U;U~CD$C~q*#t#7*u6qg|@4AF`!X>77| zNdn>;APFR1P9wR6D^moBTjU`QT;;2=!x;sMVbDFG49HWDz=%pD0P zngt`+%C)$KH*eL-3s}226$~1*kH)FSD%jsRF6M?Do2{hahLt&atIDgOVTCr+ICbi@ z`~q9~v^?9I>_To&@M+~`dDDtl+DfwVITC$pUiNH}jm{Pl=8QDn<*YP&ZwNCjxxw4% z?5hoRw#QPl4-I9iNs{I`wAI|@RmPgb1#8WPuQJy|;AoV8i!8ZUF0$C!LJ4KvB3y&b z7Ouf)d#=%H3n4Ju!Zp}l;TjFM5J1cA34rMq2cm@l8gEZPs3ro0=35AW{T8mV@(Tg5 z;GSz@!iAv6hKrzEQ-lDRYw@**Cfae)oxvfr(S)+G?y^&uc>ex>|CmRZv-eU`WF5}Y&cSEGXp z_$u>$ReWOKr6?MBDJHh?(tBv)Js4->2LWj02LWj11>kD^1v@X?1w$`fqoo%Du)IaM zX2m1~iLn<##M%oXF!#dsB2O&>gD=3u;tL@(`9grR`I0ageF5=UeGeou`yNna_obl7 z@Oum}vHXIS6r28R-rJCwP2Tfkvj;gG{*`t6Esq07DUSOe&;2)Z{}Z_XCL@1g;xD53 zi)j8LhQEmAFL<&hp00@}Y~m?L@sy)@%27P!D4uc@PdSRG9K}uj^!!G@|0tF%CS7#DVur9W}dQ{r)=ga zn|aD+p0b&zZ00E^@RSpH$_YH>1fFsNPdS07oWN5~;3+5YloNQ$;4k5|-^kMjpNW9+ z)WL5eU_5>Bod_780{Bk^Oh`ji9fdSZLK-F^4U>?DNl3#aq~WQRo@y!7OYp1k=?XOy zd@BMbq#;yJ@URGXg*1fv34RvguE2*-MZw#`-xVq;cw7Wb;6tdV;CB)33bGQaDtKQq zv;UQk;$PoI56thz09pL26o3Zg|94^lU%wLrWcoWXKn}kX!;GG5&nLn(Ey`^0e2kt; zL#)vRp(p}@D#yjdV8|53MzQ({FAC_8Me;wh_q3T zdTsI!ulz3MvjK+G^g6?vbkw+7-Q>v04Ws6cgHCV^xFE@SSh{-P|IJXYBs_v(zhl)awV-D=AHxO<{8?$_z^k z`=aXc*NzPQ^x<;#d;fFc!sXb9{*?Vi+^%0<|Fq7HqS=GHWiz`{XV%MRc30I`*c5jw z73(q_Hk)F-O}4hmVKX=ayGN?eH>mrJno^_Y(*gBBmO5J78FD&Y-y0s%o)cPV+?x2Z zJ+UV>;gD>`%k~+yvc&FzfVEb|-9?J{B1akgG7ejV!)AqIP^`V=17s^1N4CT^_|rrM|0#S8d4LwQWKiU@8J$} zW2(7Mme|-a4HCUvllZMzO=T)KO-$R}?9#tPVJmy29xQd}op7Yf5t=OMSLM z{i#LMXHcI9E)0<&r`kf>lS7Y(>rYjOo^tEY_Jw>&hZgDi#OZN-5rUosWU+!m)mEYO--zW zU`PGye!!`t67r)|tdE4_v#XbXs#TwNsXxn7e`kznJDwbRwr^~2U&v|5Kt^C|Zq2ym$*@S`K@^H$AQZqQfFXGYCu2F(vy z>Qb%xQ==M!-?`;qxYcK~)R&AAXU^y7+p9x*`^KIR4>=be(it8CCDByPPAgwiYAYzNEGV5;x+=dQd*!P9H6;ba33G$sgvnh~T#}!R z9vcJr!An;d*0PKkSeK3=lAt%3VqnO{I2FbtqKr|KrezlAmgSVKo0f(gtg;o9O-o(1 zawWLHGmA?L7Oz@WQa%lYQa){7PTtLnmQF3tzsqw4XLc!RV~rsoLYZu=(JCX9ZSYT< zx{Q8)5*P#c!;gU)5#7<_{f??5A|_h(HubhKtv04(AmD9PM_yXA>fK|i#Z-nD743a* zz4ye(h`6|y;vRY-{<-NdM2(Gpq4oI}7i`=5)WH#NmF46;e^+_<=*05Cr-LUnEF{4> z5q~J(8$6*G(>VZkWdi&k;a3(3^;NNcsjUfgqyuV3LQhA{IsK7l|Ndk&C!k7fJs1=7 zsa5@X7E~|IS*&E5&$HAQTbXLbx=2#{s~n)YsQXK8yE@E==)`^YnT;JavQVVc9NJHZ zj9L1rOWo&If9{sUMRO5!nNfdcQM1(r^L7m8pyC`^MfZ$-_QYLa1Y|Rv_8DLh z8ahx+s}1bAUbr?4hK0!o*BRk_a~KOgi~tOqlMm9#gfBj~lpt6C$2d55*Z|)@!1pHj z;)jpVhCIJG?u>0Br1dnS|L?tkf?5lSV81}z7Z6_$)h~#Nj~Ds{g~g!m>&hz%R(g5_ z;{Lz}n2YxB_6L3ifnHO8Ab{-;>=XI}3;#ubV4=7_@Ol?;ztzC5KZqKa;mh|201NQ3tl9< zJJPY*>8NaQ#2t227!>O*3Yab49&(zkSahfx9`DnibcVE7hxX7;#kv+p8Ktaha8zoc zS+%coVvlAGwXtvPMv@uKRo~dIaA?LtkGF+TxuN~x`Xi7@3YwOX{$~A=>d@24p(ic+ zFWcDm)gS8a#b!Md=!eY>fMx zv9&u#FSW0BIn1rHIJ{8Iu-apdiVaPQb#PJSSnE;%zD}vAFp`TVM;YMI*heZ7xC;k= zp_mTcF&2bqO+Zk#!DUZ`EVU>qq2osKojLs=u>n{%2ss zS*`klO#@9VWg>>E6+4m_2Gkd`u%GdbL9^1J{@$uSm!-bYBmb^J{Sz#g38lPe*4k(6 z0y~--TrZmeGlw*vxz!gMppT*jYj?p0)=mSR%Fm$FmW92R@2G=qW_PN-mk!1YS!iop zP?PM&Zu<`mH`eOujx(XqB}JKaOgBN+V$K;2Y(?8Ih@R0L$q!nNZ;rNUGbjz zz8ytG@&g%gtDz_Hg;DL27qL~q=;P8bNz{18>r1NN?(h9AmVnGa&w;vvwsdrjHN}vr z+~P~q!?yq3sv5fgeJb>J}l+QS~;t5*rl@iGy_Ru_Uucb$Ssfz_{;TpHwd| zi~#K!e4I@92RE3n(+X`9MfqfuXd|avD5}8+onI=NAFbWm8BwE} zob|oE=T9y_dAjS%-lNOAd)wbRm!2?n%6oCoytVoMx1V`?bLRQ(f`g@vuDK*Q;r@f& z_m?)hW&fw&BXSI|*AwXZXzw)7+1}~YodA(N-loBSvS+T^8(%G`fND6$+O~!t;Lg6; zR!|DV>jn67iv@<$i=N*9X@tyuyDWaGjFMT-dNF2-vMw39tL;Pi5x;T%XRYcZ)_3WK zpdj>NR6)?}qDt~X6-38p>`=u>qA%{XWvbWbW*xHpt& z@tq~OHlC3^rWnu7xFCD~PWqgdLx}%h-a5D4D)obOHG1sCESIRSDAe>w&r!2H?wA^J&ZD1g+Z{>M5 zi1LQ#^#+QjxVZufSnUQlhVMgH)UW1y%h@Si_l8sEFPeT>Qe(&F++ zEm>7wfCU0^*m8K(9^J&1LkyIIovLk{m_l`<6bq<(%C&N6!GpbGnhazeCnvA)bHHhm z6Mn9^k#iz1pcx_e8ChfPnF5(NDay0tlrviXy8d8FAO#0CW21k&Hv?~m>?g-SQBT38 zShp@7MVd0ATg%`c;Ug$xE?iQJC+qHi7XFL*!Fd|U&b7E5)|8h`D=E&MM%)(D*f-K? z#ie;AYw`=Gl~?5F7Zgq{LI+HC#hTLc;uWO@`G%5Jr7LpR6c!egvA@JY19@O&_p~gb zm6Kf}(czXhhvJA|jsFFU=7{x}YzAhV)m38)brd>NGr_8?p!{5@*l(#$x%`=Ui~~on zTWXVahiHAtIB$a*&ii)Cdu~t>AC%4DiUQJX& z)nNQP^*zZUy=~JwmC0TK+qC0d?n}Oc+V{0tf~dKgCC5SSsa?J`1DV>;qMCt>(cTo+ zE3Qm$I1G|cVo?5C{2^ru6`jBRH^7oEV`;OuYiVPyjWQ_ZALRZFp#2;8(O{oADO1N* zoN9#~^tY}JD^7;Wq>Pr&3N_y)P&B=OkxBJ&Aq76cvC8RrS^aJMpdOsks;tHwzWVf6 z?-#017gV4A{Eu^){06$k~ z{BZ=@y{PwLc{ChK|AQ4Qjk1m=a=G2x;QxZE{t#c!(5HgF6tdqAzmEZoj~}cr zu$+K=Fdj01dz8Ee*FNw?4AVp$_afclAhqg?7k2eN%b{UujVTKr)pzyzTKw+!Jd5ZF~#i{XG<#Nhqbx;f; zuWVKa-Q)90vMQNOfkJ}MzdP=g5ECo-w_t8^-d))x;BqAifZy0N@Fn(hy$m`6!+#j}68u~`^mFMrKUXgLxe9A6 zs&wj{QtOkZjD+zopZa~1_SC+);z?z3{n+q><5it{TIZZFZ{&o`8x!f8h2#969p$p5 zZPofkI6G8SZdR1mscW}tjW`B1dBH*|>OOqiFrpQrYbHrI4 zWoB?FJK|a$Wje+BD#f}Y``sA|7@Mo0+?3%|U&u)&6r6Bw8r@*vnL7zyD;jpLYH)z} znIYq1tHH6<1Y;a9hN5tf1s57-CI@r1QSkH82Joo0=jb7mZgBE}Cl5w^`a;e&`*${n zcDL!l9R-XWPYyduyJQS_;~E_0k&5+2_SKAIJ>_oJpGpqB0KSzP9Akn(xBh1T?q(Q* z3H>q|NQE-7It2_yCW7k=E?nsMDt9^7HK4<6ZINOFaf#V1igM0j#yip)(B%eWNyJq~ zE}XLXIt~O^JNnhYA$J(FwBClELXscIz$uVqIEcNM@i1N>aLzNbx(7dfFv0k?*p13ibBj%KebvjqKKI_&7jC^n{lHsgA68}f z6alZmH3J;OuUvH?rjGWqV1RsjnD7UKtkAK?emg-hP8zM6Xdpc`coaVVx`kUi;%V9f z*U;R;r^wYXd3=kX5~rJ32x5_KSsWWKAFIV47(*Z=^>up=!?{xti?L?h67-1Nn_&q9 z;-p6fd*3@f9Clu+#u(6bMW1Sb$fxR;PTlMDu8XuNqwaO;k2<~ms-Fv_QVOZM;G2rD z&-ULr7yq4e@t>G;@dwb_-}ABduKv3>nRC&~`dHTusN~7r)#Jv$ZrN9JO!pu3w_e@r z{y*q;9dd>V?V7uDu^ZiFV;e;o~8}^T5ABPvZWgXs~ZQvBckpn*t zHFmgtK2gbZ%F`-)d~KV`uG8ijJ1F_)c=*|(>oziNeS%Zk;?pypG9HsHov&wTa1@fy z=$S5POAHDp3Axa5twF~%`cP{rxp7`{1Jt5u@3qDq6CgX(8mb1Glu8mCen!u<$X=%_ z`p{(Raw050KanFEa^h|KSQq=p98~8v91MsibE0P2;g{Dwjp~25d z!Y+%ClctafS^@qtNbW?sUn$jyX_JS0^4Iq~Ts?{LBBFGu+9P+hS5&Vqp=|m$R_mV} zUD!4zmys8_xxbyk1NNCsUXeZY8)G8-c5z-vOj&@R7z&q2VD&CHuV~*a*N_oC2jSw?izP6 znMXkjxxL5+rqo(s2l@D{Q$LdwD&?XeuDKcAi!s21eIS8PRD`>2%~KCp-vFl z&exJE)0Co`^MH2S-sQ^Zq0n*_zTkc!10ZTu4Uv*c(egc|_po zTEoKz@1x%I!xNPc$0RFv&N*SESHqwJdNaFGlKAPK>{VVR+Zb7RU3J3C$uq`3e=nmy zZ3sP%BT5~?hdNsCoPOGJ9TRVHJY-R@x@f%~HeI>J`||<$7q;%nHEXM6i!utYOP>BR zJ=ysDy{?ecOu&|9vs%@wEPfpa$5|cm2A{$YDqgOhLaj3TC7Jvv1?-AWG2q8FKCSHO z^FN;a-a13IDm*HG{GsUqhhc9(-M4qv{%IY8Uj-|L8a7Jf&GO?~ULduK{^^ z)|hgNy}1u=KIRwl1*HKVroUW0dCK$mIzu7TFKlt#TSgsxWLtcTkK6x(bIJv9?r0~; zDC-D{x-Hb$MML@nef}5Sz|Bts^7WJ-j7#{JK)s8Jye|e^PiaSCJ8LhB`9Ze%?k)w8 z)t|P8?p!v@tyyK%oOtSsD%o=CG&A<=nz7)e-5y0zFT?A>7j%0V4siIF0ik96_buZH zrN}7eYoE=Vl)fu9qtBuQ&ke{gHGl+nRLM5DkhAl^ncFtj&2d%_W%Xx`dIH^V%QE^l zVo@+-nRtWaC4+(?X2BT)8Emj=6_$tWDRU3j&eB-_oT6``4d^t6PjKzdCi}cv>acff zKOMBBP8O|o%p`A-blw^Zc*B(XD@^E#JMSq#1aaT34IIgtJu1@nT zv*T<3o*Xq`W7tOM64wZsXBi#0R>>+`eBm8x^}SYg>wtU!6osPh3w7a}Q9pd)0|u)x zb;`@tGu)tfF7qs%Vo8;KV=q)~#@}aNZ|A(Twew4~>)Xa2nN*Wl0eVud#Q{p{oON_K zbt4TnZf)J>_(-2!KnsS}zNAL1YVb2dCR%g)eOs0Ht-e>Q`8aq3`;^n30K=NpG8onj z56$iKcTu3RRGcy|XUwMoIiY`#Z?Y#q6W*(JzK$b4S&w^!L?>pQ=+{sR}(kV%R1Jz#X0rFNV#$p6?rg1 zr5$gf13)qv8LNyV?go3;T3zIu1PwB>nGI|vkH4+YzpzaMsbaLl?ZMqOVZb5`a&7O~ z9Piw`6H@H8TzWnGyiXAb^MQubl>P?;luN212p*rX5436~kx9c5Z~EDZN_kMGwm!DW zpu5|c-1U>S#<;KDyE<#LZ_P2k(Y48ACMvzBWNLTc38R(m-fbTaxzS*seure?Eup?scj?(0m;4gZ;am26hZLtGW$_#op2?VJvF9 z`i%t2l2muLD%4LI1%tiz0yWj6&Yd%^wx${eh6l19mQmfK^e`$mT@Umk8Gnv&|Z&|wP$S*iN z_D>){<`|OUu`@7%Ge=evi7lRvMDJo60_`=bXOLPi^a!!>>~h|#SO>#w+hpD_&@L+j z5@Ab#n@wcE5E^8PS<5J_hm-4EK*#8FeTbWGDlpbzVDml*aCz9Gx(yy>^N@prAb9{c z95d1`^G!A$KI+!CK$LRmwn zDqew@Nj)fBBYfGh*Y9i^7_Hq7qqWP|WNGt3b9$R7SpdVK(!b9g^ z!+!rZof9;Eq-Jyi<+9mFD)NmVYwN3lKxfA+HOzP*QRA941`=7wFMb*0K43X688`C@n&6zv3G z40K`O4%M6>%u}o z`b!X~qxUcdUC})T)fN>0-C5@$^-fGZ%bwtNY@`Z(cY+dXw%pUDusZG9fb08wJU4$z z?raM_+!hQ^-ec{9CtuMS%vJV4`yP#913Um7PH(I;KQZl&4Sby$>9Ye^4O@?O2DOyJ zWPVESPS(5HKtL^Y;6Q2;U(@Tox==2O@RNicTng`fu1JFv@9I%p?!mHL4ICKvQCJ`B z?_g{)#t!$un!r@qB*;LoL4Bz?jPg@ODRIW`sPP zqc13^rUL6DUK7TWd>wuhG3m?1E)uQ4DLRIcqkv0zBh?uXW+9gy z?;@AeF)GYL;4FA+&6|iOAbOstJlI4gqu!fW%s(_D+JIzPF~Ni!o-C;zth&A>OnFfK zp&R0I>d6WY<^s_XBgO;DR;yNE;E=nnGegKlJCWc$7-I@b5H){PTBAQGO{?Pohy$!L zTCydrNW1wf_)!$1(OhTng?kxbv8Uduth*5e)^B-Ou>-UQCp0jtHxsS-73EumT4MxZ zPO!-*tD2kbU`H57Cm~KD@mnL&veOrl_zECSl~YXL7N@2MMDKDO7*APu_Ep!wl!&lV za3@EWt67?ZGblE6WqMJ!nKo>4E1-tlXr4&J@`3zz%3w5f31aD<;`9iz7m{EnLwV2T zWzgO3DT!LF)-bt)okvASkBEeD5`(A#O$1TZaodFge%^)!EF)xdFsi43yK5kPMKcr8 z3{TlT??zZgRN}ah$;_z-1tqe>ERvp@h*6VhC<)|C4}2}tn)0$P*+c7P)S+CReSvm! zpuIh8=W6iT$f2yYfm+}j3@?ms*o(*3GEGJ*eY6)g0j#P|9J>^Y!i=2ISc=3LAE6;u zEl7F5Q6LnD?vGYd9N$AM#Uc11t(HzfStgFLLR@O=0tj?5bxUFlD^jJ$;Uix4YW_aj7?UJEfO?Q{?I@}Hd%%7RXl=89mQNSSRt`#rXF01T1J$_ z)`YogJ`X<*oc0q2M4;)Vl8x5(YMlC|ASh1#+63B2S;jB*;+fYMB5FgjeS~?^da`7# zC-5F+7eSWyrBHbnCLT`IAB{s%+eqJ?U~KnPZ?jC(y~bQV6WFi3RMR&?8MC{38?Dxj z7-wJMw71HR)O5MOc*i#4kZS~2z2JR6Ihh(Qw^YiPxA@pV0$cp+oY;6f6Vs;lrrhv; zJE%p8#oLDlW%@Y0qHjz|-&i8CanRRkr+UD^kFSA>z`z)m4ElsH_fG$U%IjI|0OM!1 zfyLQ5LDkAg>-_}B`9L?r70hw5VNV*L{RF=7LNw%jAYZ_Z>?;ZN8C>Ihoh$I2!d=5Z z;XYnteEgt)9Q`u*A-3phGCs^QDe2g3NE%jtY*2+^4^*|7d3h>uvI+m zGWuB1seyB`4ujDRKEln#8jw+HT)gGWNr=R+w$L)ro(Baske#xU`zBQ=%qo=EfdO!tw#*jBj(2c z&XF4~bL1>A3@Z<=i=dwJUr~cEI9I49FSmlyQ=6y^i%${Uzvut`a^YiYSn0bGw(PK} z`&{akR@iVueQ^Mn_WszQhAj{JDHm-y+>v;QhCNlxE*aUKAT{_ z8rKJ(fqiF;+=^k>w9D<&aP4vjE@Hmyl>m!_Po+*jEVIDgEU*CxtZ8=HXS^(fy%Nkl z9f@73!F8!K!3W-Gp8@NV_t|f3lrah_Spz#J;D!r5@=qzv_mnF&;jn$iSy)FcT5Sw_ zr_{<|rSFW!jv3TlM)f7FVy#P#7mT8$Rep}qd}q+W#aBJ*ONeXw81*@F@m-c0@b7Sg z5sZl!M*hO0DAjV;5Um{IGny*cHzZl}JuD;U@&n7A55vOiR9L0mTAe{rA6X;mR;XMd z%h<{_-Xd$a3bP8y>h?7{Ma5FmNWsKHoTDhi1@uc5j1eX-I&e=P#!(3f%sFgO81%i> zA=Dn6FborkkM`kKCnsH=DZ8+6zYCYqGcv~JfK~V~z0k%es^D>G@`_->Axs{IrTkyQ zYIrYPF5iiB0=WhB3`~8@CYgb`j%zOY@C~Sf;ieEnPO$Y{FD&TSI$#qam`n&Wlheh8T5GSh4ooOxobO>U2|LVY3YoEm zd&id9m#ga~tHn$hD`G?GkmY=0&c@BzrmQ|@>)0yG>WCOUBAsj?&1Bq2H_XbBSw-r) zcrg*Skz^9d<@AMh0O=yU>YHF=33%ZB?;vx{$~3htxQA(eW^voZ<)f86-3f1f6q4gJ zc(j`cnaOY7PfO!7&hQDG=|l9=`}!yae(+y$hzR6Un2rIZEg6U&a=?NZA{m{QDF`}* z&^^ZjGY%=H&;oIA1_T0Hi#83qK90QV{}fUQk&8GAQnX)TqJ`i=&u4&tC8LavN9Arb!i%uOHu{apmo46GLs9<1vxFp~|s zkGS%*pOOyZirSw7lT^vN{@+a9{}{93H@Gnw^>v&tNjaN)z4jmVjK2Nrtir#k)<36O zJBn#(%;MIv-QTI4Z_4@C3D>_j^nbpgH_C1AakmST|6Qk&z*EBhewpi6nB;k0opWZV zcVXl;^~-qK13uY{a$YvXsmtdZxsiVP{EYftT)$1xL^|XvTye(E8#Hd4B@k~mlo!9m z@o{0Td!hz%F4@+TelNM&)W~bws=bXS;V{`$EWGoO6-1$A4U9mcvyV544m}+?rUD39(Bie7Q-e zhgAFqBX&vRZ7{{bJ-q!NuB)5+Yj~z$>`5R&ahrC>Gwt8VI4kby1#(=mzu~oc zuklcJ8u27S^_$VFjnEcDmqc*jhaM0A%xHvCgZh(Ndv8}Aij72)RP5j{CfQJo^s-X1 ze>`+vWn$`Nso2~ch0e(aAa(ln%r`PQSqK${A7DGY{oqti?iU(DD$QzQ>AjrNk1m8C zPYwkM58{Aig$pU9--SOxT8uw|eCI>8!}IDUl z>flFNTmSYe__trde}`W|3s%8D^DAgnS2a8Yyl1`zjb_AiO&l$k|Gqdcv0Ci^Hy#Ht_Fq%9)={}7s?q7~BPi_PMw@v*2D`6uBj8^&2kABFBVfo5+n<`eUiY-hZ6DbqUg}xWnCbnF3E@4~E z>~c45Dq&|88%o#OS0QNwYg{nx1ro5l0a}P0$}9&smG%J&;V5WB<;J^KRhBU)i;^FF zhxBol()F9{vTS+f7DwsWvQ-;dga2xCt8OgFAGeH}+&H#u*|HV(4G3Y0K9<4! z86ifNEnBsbGMB9s&IMt<4Vv-E0bzSKx{dQkXto$tBQ%~#ZsXk}5b4HkTromZG}&#c z4`>Rzck?M9Y6@j2P?WZd*LD@dIQlD}jDun+L?^BEGcNh@A-SSGm=>}S&!8=h(@x6+ zX_AF?rs-5bZe6rIRd&5Ec<-(|m52Sh$0omB=?ljBJnF&OP8q)s7IcGgU_B|T*DvdJ zJfl>>Vi}*~JpqPcd8+w(pCuplp7rbAGcFi(LO!kR_X~@RiM@W+T0Dp3)0zY07Yu60 zU)LnG>rwj@>Fu-Aaqv9+DSSRt#`zZ(84`Q@RIkr}E1+A>`GVK=Do2aiGg!7Qv9}@N zRmxt;`7C+WMR{WO@nK1?N+Y^T&-7lQ)RT>o}jMz+Y1!CRd8d4m2{Q z^W+pUxr!z49lDXbaB^o~+=F8B17h-K?n2S6^|iN($%l}v^<*pWGY0)?cXo%dClFHK zsNH6|9MCFqQnpfZZBB==FVLh`q;mT>=G~J>-aVF(?ya~}`vaV}by|nPACz2!9-3a| zzm8rm^U+y}KSmKB$Uz5A3vkd8{BQ&YPV~d+ROGQbOIc;b`#T!B|+q>k6-5(d&FKNEMW~ z9IL*?+om;7CQwZTsv#MmniA8dd1W(%s>k|{TGB%vly~ejCffWuXoRDk9}_!w>@+0W zNgYmRAvYRsG$&75pB%i-eM7x$+5tH=)nSCXu9u+eA?P~g!+eU-z0|I@@YcRI$4+Nr zsbAM*(qruOnhwb18oxGpTL@9fVIsW{pv%X4Wz(wVG;tk#fAvB{IbPL3aQPB57R~!R zdNwM)O#Z7w|92xy&R5DX@Rxk56}cZ+81&x6a?_C0RGTtP$oM?SreX1+n#KE1I(GIY zmiToqFbMD_#x=;MgHQ$@O`olLk~)rPy&dtAge!a zH1|11MFTr9yup%*m2(;A-F~fQ+U1&=m=;qR0W+n`y!1k~0IBm-S=U@HGo4((O8o0f zc-4VLo$z6BWjEH)wTJx0^4jC_!t9@~1}WK%@}=Q8_OB+R#U=f_&M_p*QDM`6!+pm` zY)Dp%Yh1s3MuQ@&N0x^hr#qwHJ+5D#x3Ds-x?s{>wCOK$2^VoB;MJ9Rbx#U6CiQQ* zgbEYRNOWGW?jmzcyWroes8b;^GpkvV-Xgn6J-kVWMlK?HVi6jbhs&vzer=$Vd_ zyKd+$uRt)<*8-Vu$g)nGv%VX>+Eg>21*bdR{#sYhocM2v{rvyl7i}lTkgS{|`AsQz zaUrXsZ8v9NVS||86v>)X^&=Z{XV>mhsyzBTxg-3%k0x3bqw+G!YEGNZ7GJ-=HePO4 zC08HRj?y@X%`@yQXyj8iqMl$KYE++XfsRGL1{cA$8J4ybl^vgJP4>Oj=k@zlrUU~_E|1(-bDFHzl`wJMxl6mWX(CLV3t<<$b5{~QxDsr`>TTYG zd8&yT!LrY$YYlgyox0!Pl0%w6W}fFyovTQzFr<++-9*ihxr)Y8z82Pnp?!DdC2=(g zax^(cPfZF&evO{-CNicMOi0!( zPiw=2Bp?^5n#f9CY*;aoY+$bhXh!Sajx@Y5jw@aP!}#IaeekSXzg)GU;7@)C}S?h>Uf^|QTLZ zl2LAI1344??eg$f!kf*WxP_cC?f&M%RSV4rYS)}l%`;}s^UIwd*-f`9Y8vIHyFGAa~{V9!$3Y0;_?bK5{>qHYakXM8nGXYFJh#?Oen;T{{aCm%4^E^CxVnjS~L#lSQnI3{VAA zQ^LQ-IMKq^GbK&23|TpT3}Jf}vtW%_-%5Es(Y#Y$j$4qIBwDwAV$*H|RNK8&FYsLx zRpf1@yhfHsM$&ch3R_EVK`WL^zwS;n(qi|w+Fr`FVgTno^VymV#K&OxjegX+B4ZeS z26w{JiF*sCjF?HR99ueqJ#sEuMtcL-H>!-UhYj>_ls#BwW8%hZ=cg1QdYxc`-r-8$ zMc}X{X`y$`tg2hwtKfLymaAa4tP0@adF`A*pgW7dN_bM{4V(RF@?+LyiG!l_;ZXVl zz41NaK3~mWFsd4fI+I?kKV6}l;hQ(5&*{t04t4%0dSQ3M`X-b<4e_D zK(jHPjc~#^nK1@AzbZp0K))-ejbWET;|?Iu&CAr;TIwuHG;i=yHzpdVN!=%P(??`1 z$UqhIE>d1Ifxt|ZDX+^IN4_qH3O6P;%PLKcc(cP(bxTZ1wwKI_)p-AHekW}2FZy+3 zN}_1y_mIm?4z;(Pr}mhC6A(H=>ZaQm4P}V%CKZiAlIdlX=VCU_rzwx{+h21=w9vNc z`kWsiS$&-H=HRkjvff6X{~YDfbc-}TV%d#6Z!|Ab4_nB19#nZ;9(uXm>BybrT%=OP z;_M9D8#Ig_X&CodlbjlgbUOcZ;$ay=nP$+ImU0FUg1LSGr|~~!WP^o$Bnr^$UJV?K zPo`R}RBL|9p7V+AA`+W(Sd2&J{G;dx=nRRe4!nnkIe~5C?I*nH{xO!v>FrOXoCpEj zW}r@l9k?5J0+OMNN|TA`$lR^wNnC;xn{TCQp`zrJ*ZbsB3_#9<5(bkj9F|C2+}CKZ zs#B%}ct1|-i)sCkjas+RzN!CHZ0j8pMm`9dPJD!mPwOyWcY%__^yU>r+4NXxQr`UgkRn7>WlTha zYb3xf8a?ra5G~L=J$BUj1?5eXoS)X(l47tjoN{nR407CI{tykR*``gq0b>AcL&&*= zZ16wfQ@;X)+l>Tf6TLuzz%?o+fCO~fegU_XQU|#y*gPdeIR2^OKhY*k;T6j`XPamE zwOVJg8=Xx^LxBcG`%tM_f9iiyvkR%&TpA(sc~}Xb2j+5M)7>5TkW$&6Ux_oJ%>y+8*+*zv4hR%RZy%H``a=m=9U~~nKy z=~~FqN57m3#q6t{Y=;|5slBW!@qGpbA;?pqE;;bf2$v0_BAoM6)o=qXeFgbXG%G$g z;^Dp8LUO8EpedJeD>LM|n2db<2XliTX@Hg}z0hF@KReHH2XPzWg)ua)?QOq?Llgn} z(KtycmH3(LxcVg$A6%9m0w27;erzlsTuprNjo>*pf#>K)-N;fCcwsiM#>kv-VwF5xlKGkw)^xwA=u2&dAwv81 zyI!I?6L6X3{Z5@O!*m+eytHxDfQh0wk576T4Mg_xVMmAv7>RkZT%<-A=>)`ChEWp8 zjB+7CAY~ZCRiq5XtEvptkKG?L6rbz_wKxTrStq^&*6TcpAi_`_ijv&|xdm8b%MkgTwKReHH-T0fVyh&Pf3?Gq3 zxJd3BLY$B`oK6dVBLk>#Z{AqM6v+rT;K`b+u&HNg5@&EmZuT8AZZX0QEGn|4_xjYY z9vNPcw7JtW?@un}gzEN&y`lTV>(ia7)vH@ht?|RX-?)1M>U!%q=EI*}=GSdCkuP~h z_1m`HkE$wjC#76-F!3q7+tdK=JI@m@w?iU4Ph=qzWP!Y=)tuXARKNEu%^*Y9{So|k zu9EQI{3PSG+3H_G(;Pz+7O|?oBTN^nM)7||3#Br)*(Bk=6`_rnTYFs_(<$C}8eYj! zbsf5L1aGJ9FrXg1njXG%0`~`zgJ(`TKFkpT^aCaoTuU%SxuCI!BxWo0HL-X$wlaEX zOfjp52@DqIiRZm)5Q0R?7O~W6Ixduwyv(;YZtPr-Bk7Jz4mD6 zfQp+pSvvV`w-G*q6lnYZ@XvXOp^S(42LZP$LNEN|q$LuVL|P&)8@wM#C(| zcr&(7;~^w_k^6@n<1)}U11`9~0 n1-S3O$?&#tA-+u#Xl4vv!9*k@P#EdmgyKO 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 literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/Release/cpufeatures.node b/node_modules/cpu-features/build/Release/cpufeatures.node new file mode 100755 index 0000000000000000000000000000000000000000..d74c57f5aca120328d3092da4377fa479a6f09a6 GIT binary patch literal 82952 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 NbBF1JhWKLd{{a^K3DW=o literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o b/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o new file mode 100644 index 0000000000000000000000000000000000000000..4db0722e6a2ac833cddbd485ed3ab2529ee8d3a0 GIT binary patch literal 4752 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 literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o b/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o new file mode 100644 index 0000000000000000000000000000000000000000..8864204d0572791932ba2cb276e6030e602aca89 GIT binary patch literal 2016 zcmbUie{2)y^&E%Xm6)?>Ghz?hJ7dC3+t?Q;1iOx7{0t_P_?L5wDEgdHk)nfBLU$umAAs z^h^Iq{Qdg$r&oKMh=T~ClOf2jB?!`3r$g#McN-u&qCeVGuHV<7Fk6pF#$+vLQc_htj=G?PB#(M^W($^67!BR<v?>Ilt)PUY89_K@pi?$ zW=W@B)M@5uZGb#tJD;^JP}XT_*ZFMMnABFOHYGghYlGMUC#BxqU8&IJwKwkNH_d3Pg%>9 zwNRtyN|p)AGA^}EluY3C(WvbYQrlEX_I^-cT>{5uV}oeQBgB+KtSG21AC%ui(PFsQ{NcT-dI+zt!Vx#(FT+UEK}5TC$hGRbLVG?c!XpM zO%)FGKgi3)8_<47dy!V((P@@uHQ$qH#ej91D&27CjjW|ovQ1HTxR6J4U2BwW9K=%Y zcbg$oAqnwdXxe~sg^__(1-?Fm-*n=ikowt=dbDdR&5J9VB?zETWt+;{r?cC~N|qdD zt(3aX&05PP$g!)^H$8-*5Y-S|pi59)zksiMnRz=+P^VqQcvw-} zWua&H%&gjQ(6OKR7Q^wuXvC4Exxg0!#hg z@pI9j-{>=alZOyYJexE*qP}>TiNtu*3&B`l+-u_F5ta!inTRP8^)v2p)E^IlMKIs` zg?Vp081nb9Y=|LzAv*F3k=V$HXzMVNMv^epc3ayzNRW(XtIHd6m~aW#d)9*xr)=MorwOe}+G~ zy=77K^K+OlEx;Q$a|Y;JH0@#wP%9HrMJ5zOszp zUT%Qnt3bQu51^(q_|0y7qiw|4uE2b30FG9=PGxN;U>Hd4#cUT0hI~o9rXd2U{in>h zVn;p5A~5g|QvrWcI&n^vr6K_k?eqhR=Ujjy{4W=Ez6?kJb^sm%6ybBd4e2p`8GI>0 q1YgtQ?ncF=ES>Joj#gSMsn#&Np@`E2= zntA>|!+-m9=Cez^O~gI~(aI3y9SMRo)@hMCu-y!Zj_MBEOZB@O6ei0N$+)a_1E$o} z|HzlYzERhEq_NkbFg2O6mOUFyTPK{%f>!5vjL#|TN9qD4>_ihmJu^XkATeznZ+Sxh zM85st^uS?az65>`5pWK0*oG0lXAtd^+X|Sr6^QcdvR97hJzE0<#5UiUrv)qM5b0Mi zuzkGq;H=boe}lD{?ZVJh1|8P(U4uN+!Y2#p!3n9E$(rAg?#g5zecgpe7V&fyk05fE zL75`T5onr3*~Nw`fhHBTbxpZ$z!uTr9yIMi-{lhFzoo$MW$+GJuV#KuePK!! zBsbK|vRlehTZyveq_%P@7iZ9yF?7VqGYpz$q{AtmA$VnZ6TX(mE2KP1%2%p*)rEH` z7Su~x)n%=E-m3|chpcC^)UI^sy^Q~T7GEQ!zS5LxbxKvP(JNlnIjw48RDI6d@W(u5 zDN&X}jh+_FlazTvYMm5}aOi_E>&H^-v>^L^h-dnFmdVBk(UgaexA5^Iue`8NejAbB zap9|Ze5FTTA@DWGg3zn4%xUKBnvb-qE2Ek#%c|9i`Y#equw}1#ntJ+J)>?LL`#cd3 zpG={t!rs1ndAWE4n(u1Pc~v*G>ZLjL_az!JV6D39ZP@=x)?5~>)07P^ru8aI{5mE<0z2FchL1f(z{Dm7ku)*F5rD%TTxStEBuYA^(R9k1FsL5(n|_ za>LDKeAR{DCv|^b^Qz`Y)t4*HYg+X+t$IPLh8Mh{{aTRtne_~1J1wUBi(wvcF{l-v)3A-a9hI5BQ(L~A} zW8L0pfQ^L$2EXw|4q`BJOw#Cx`4bU38t079hT_hI&&VaB3>`|+QDZa~pxu#JAQ1+a z;J@ul|Gq>h9I!J?m?r#TZ}cT%cs(Vez0*J%NJ3xJwzYSXAQ?;+gNZclF!qIftd|`z zI>cOJ49yy;SR?{L^@XDJ{#Y!`8R2?3<8xmB^ZWV@T;RaNl@61TV?>hAOoz<@ zQ&8WQoZJD!7d{aPq_IO-tiK==be$ct^T>J9G2SUuo6gGwzoSF;hl{fPh_epqsQ+QE ze!E`R)%Dx1qo;Pg`}8SObH}Oalke?)_0U_tZv2q-`cEF1#^evk1X9`d&0(6LFQ5d_XIy?2~4ZAp2prqFOVRPq-2fyxu zHj}T4%_hI@!tYIIM$r*{Z3?7#s9>=N`k7;bc}8MAp0!O1V^WRiXG(KJqTbxUGK*K1 z@$1VCuzdw+kNh6gbOyiLgRi%Z7~4e!f;0d}%iYJb)?+XXq_$$V8wNvO5U**7Kx+Rf z6Ry}=53&d}{KJ&MACpd=7GKoS0zi#A^cBmj2;z6dD77k2B?L;9VE qXZ=Rht`|(o+~w}-Z1aj0)fVykV_d48G_>!8;`x8d`{8l5)qepY(4=Vq literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o b/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o new file mode 100644 index 0000000000000000000000000000000000000000..03e8115d8a7003103803f19eef585e34432424db GIT binary patch literal 1984 zcma(SZA@F&^%)c1YjB>Olm$F&?>P>cX@~tVgxEDmf#p8q8SJq3xzU6Lw}%tF!ImbBf+mHNFydu7RLloFLwpnD&e}J*R&z z-+pXn=p?aF0=*{)umdw3!wAodi1zut1x(ulMEOlt%3VFeu`{SpSU z&vqW0lUg5dvlg>m7@AC@aXsHP%ri}VqJSQokeZpS`4`dy>FkcT9e8LNPgU>`B4-(t zDWV*Krbv`suB#AeLQ!2;H@5`XA{sx4rd()rx$ZvDDjRa)Nd!$PP&SQ*R`FyJ9dUhj z5QIZy{Rn|3i#r!K$Q?t!ZhTkvv)?XN{{7()e&cTsA3oWC`p3@uU1vT$E?joT|NP43 z_m*}w*S@h-hakQTgi?JAlcpe3?i|SHp4s=(QZ02ByD}yFMp02ZH@*)!*MuOaL9PQ! zs}|Q({su|U1Z5rLMB5!oF?{;>jol*T(`eVT=N^|dLLpWIdz%Qly#Jte9q zC+#UGb5RC;9YaU$Jj0+VMjB7@48beQJMqmtzDCN!qGobOu+dyq1%{wuEq={z> z{AeNbwFeda!7BcbIee3pdP-BOjVV>RN^iMUSG20djQWbZ?oWBjQlcz{D!nL}Cn@uU z)H*2`!RV7Q>mQ}o89{bAz%zq9%VeX&Xwt<;oA_vvS6(|Je}KpzI`EA=zJ5@?M&O$e z1)*2pn%6A!YCh1aZe=vLR#h8o>c2`f{-(p`8R~^IS!>y`_p?A;d?JY^3x@|D<>lfH zXuhYp;#S?$s#oUK-$XQ&>ykS7b>8$ajo@9S5teB z5#OO%E)WUZ5^mQ21w(scuM+)Xf8_I>gm>7@I=MiKcJx!k03D};u|(AE3DSPn9irQq zNFW@gS%bmoqZ!WVWnxZ0?T*G+nlo~&*BA&fK_|m_oxwmjmNa;c-{!!skz*1@Tf`d+ z(cvg(d?^sM$2>+Z7G~%`f({$Q5g+XgMSQU!r~#dAU+DD20zqFd!vtx<8+3TX+mCkdRvWHFdXQ>$?x;9=eDsL>|+A7NLs8Noa&u})`uCWSGnM$|K~p#UMdm* zQO^LNcy16-g#VpInJ)tpfUSW2fFgV@x5YiBuYfJ_KLlIvh`U<}lQefZyE@z4Vn(%v X+};S6Y$pxv`yqM$-;{o8qPqGou1J!9 literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o b/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o new file mode 100644 index 0000000000000000000000000000000000000000..e63cf71cd77538c3f8ec564445a08664e09a1715 GIT binary patch literal 1984 zcma)7e{2)?6+g!zcO~X*+Kj}*_Rg44Qx^N;gkaaPL~>qhMy8s=rc}xlpY3zw)juwG zcI+6m*>S21o!1!@4gbM3XJu7esw$KSQ8m(%T*?eHG?ZyYDvFXN{Mu4xQMRFtN_*$D zRN7yAy7#{KzIxyH)Xd^;n1Fx8t01?Z_|==g``4#G z`^B}X7ydK!_s^!jyw=@797GVk0zpp85Tw3FkJNze7GN}EIM!9F-B+iw*pACa70nwk zwXXK(-Zb{Tn(pKE-AZcX2p2~Z+`TL0N-Vsj|Rxlv) zZ((5jRQr(`x&7e=dokOAp~*BlWE46E1hz>?6wo7Max0s)z9rw2&Te|sjfWTTR0R(s zN{&U@BFYnJibT1Ex(b0NRMr3LDkTXpP zasq7Hu(W1=SrcfGImRgKsF>?cqr*v*FAOSfA{IZDONs|6j(w~mp9{Ud3>2vMo8sK1+TdAHr2d#QLnkK z*Ur(p0D06towYAewkdh%bhdL;ZZB6FhCJxu0d&uRz=2E)Y+hhJa17|s!wujzkrw(f zVX#Ty3c_$9^WA$D{N57&j~RT8lzU4Pn$-zSxhikanoD}kd`5eTuKRPIvXv-Xp(@Xd z)^W-@Cby4^W(fLd#QrC_eNt5XAt@@!18CAC#F~UyQBYqwsJw?L@4NBUJifA5 zxlG_|Pz7Ps-k8_8$n>qK@UdTdEH1*3$sId()mc;-{hh6r?$`7BH%erxX1`(Q#jEdj?VOp_ z7!Nx46F*`&J{XNS6EqiitT5jA%f!A&Ao}%8!Z$#3{d_RRxc5;+4>QDs;)xjT4KV?Z z4l^xmG#H67oXKSNGc0fRvGM)@L&xGA!<%`|XAXwhP=C_e(I4O##>@LnKJyQGh-~KB zgxMMO#luV_#+#oH#$0i)nU6ahVX^x z$jijgdLcw>yNNWBgt0o?(%MdfX0q5!7SgiQ+!OS2G&gK^N)<#|hBH&qaF~wxdx8<> zP&69i&9EuF`3JP`g@e5&-v7!se+Xj0WaJ3ZV8FV_5fx^@W?@iKFUijCgv$Uvi3p^= zO;>YD@32OP4V$n#UaF1gS6GYmaE-iG<0-)*m2_Ap7)5Wbi75|BHJ*-p3+@}jg&g9K82mn^tyTP^4kG4N)oVSG|P zeqPe$k^qwY^Z-lidVwYS-%+ypHZTFa3wS@UL|@yjYv0HpLoDe{gjlDg*>%WB@a$-B ap(RYUglS)tPqvb#*4+S~{~y+mgZvj^?3D%p literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o b/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o new file mode 100644 index 0000000000000000000000000000000000000000..2969b38d2b437db2e161bfa8ab34daa0107ef1a1 GIT binary patch literal 2016 zcmbUie{2)y^&E%XmAGfqX2c%0cgBR7wy`fx2zH%FNzQA{NL4e~m2LZDB-+YDi7ul)B8YP^J+LlqE~}wWZ9WY(pEB_ReXG zv_JQB@4fGRdf)r;eeb6lBVHM~39?f1`D|9y1;zw)hflL_FqGg%rlCOH!*7qGS!y;eD1NG&!4ZS-o-9V%D!1tluwQA zL{2FY@`WMUO+@~Q0>7WZ+hu*)xmnGnNp*nS zR8z}tt4O=cRCi9=T}kC)Ecz;j4m$*vMboS_krG%!P*t|z>v?>Ilt)PUY89_K@pi?$ zW=W@B)M@5uZGb#%JD0UBP}XT_*ST!hnABFOHYGghtApsCL4gCB5!k%Idf++G#Dh&> zHklFJm@uRixPmZT7MUC#BxqU8&LQwEBWhJwKwkKsWp`Pg%>9 zwNRsHOO^@BGA^}EluY3C;i&BoQrlEX_F+(9T>{5uV}oeQBgB+KtSG219gyEe(zd&Q(qs^USC$Pt!Vx#(FTNAqnwdXxe~sg^__(1-?Fm-*DoelKR$AVh-wHf&?Ts@oyXTb@=unbZsj*f`3*w;PbVHx;HxAK;-||E zcb4%rC;ouc|7D$4&y8pnSDM##nwvV!yiNlzcw6_i0P&XX9MyeRYMsbhE3R|!`jBiI z;&cc}7KXww^y2rS#yG8mpvGmY$2hZt(2wMf9Jy>SDh&RvHgn$_dEJRJd7^Hge%D8r z7kYQi%&H9s?E8rCFdQF@M(jzN3w$Xs-uTPJ-bf(&#ZJ;UNONvJm}Z=NDWacAFrj!d zMteg{fTP1qD;o_)Vhm?An*0pQn|y5C9bo8KoMU(s&-qNjFdK5GES>I9FcMF>qnw+L z__=7%Z}geI%|i$#o=uwUQC~dFL}I+@`C!Zu_nP>4gk^$BCSr<2{fs*t^~XbC5zM!K zY2F(ThWx!O8)67wh>pBWBsMZ4+B%G+kt7VY-PX1a5+tM9YBZDPU8eq^m!r91lU+>%Q(L)zPOjJdh}%+%@k_P=rX-Cs8Tj-!32U*UC6+IZD3wzcHHRTKB>pXN_& zYgrWi{2b;>3-HFxoB{e4O}p3v)Jh3D#JW%#y{SGw`S|T#ajZZ|ZS=#|j#UqS%L#2J zUlW^6e#?p9pURA&!-m=vNC{BEVh_03<0Z?q#C9^jt3Z3?_o1dU_>CTXqiw|4F2j6m0FG9=PG)V#VHilei`gz14Ed6HO+y4y`%js1 z#rArTMPT3`rUL$ibmFWiOGN@8+UW-r&$$3a_+KvSd=-!Y>;OCnD8d(d8`2~C68KVr p2)?Gp-HnP7%e1qjl@?2?HB9@We5#E!w(W-M`9I40k++T2e*u4(qKE(h literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o b/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o new file mode 100644 index 0000000000000000000000000000000000000000..4d35e3d159acb6c74c043a6954718c2df63bba2a GIT binary patch literal 100416 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 c+FNJ|Q!QcI7v+2nip7T6>cK zp_aPntc`u$7M$zo>iWagU*|UWE__I-&0K2xT7J&4pw?nv=a_Y^bGE+ExdC(^{r&d- z_x|yopZDaP=RD^*&-0w;}#Z83>UG5yd6`iIo6=HmVjg8Lu38?T24{ z^!!U79Dn?8t$+I6@h?9pPM|j;q!uGoP9YQ%p+*saJ0CvMk-k?qCR`_yXBX@vI>iek zsU(%~#cEEmHllc6O!0_3J0YJ^JQ|%{-BWHEQKy&2xqIcheG#=|)UgD*q^yU2m&mT} zR4maf@hsmtux&3rItFxKpb=UEzu9R$QFL_~Qa_mCRj3z2mGpqP>xhS~uH8mwn4DU1 z8M;ErBTFfbHyuUx9$9?2^WE(~qUw7S)kibLBT7QyTev=UVZ}p*g!73s$+0-Uw)6#g zbh>X?jH>n7a+YGZ&aY$L3Y^5_Bz+I<)qa|Hlq-tFHEMK=Tw)~$`FCq zI@2dPuU1YGDX7Ea?$D4NN4DF^CXGASOLkE1rb;rDxN9;IGh@J9?Q$rGbgJv>lnVq6 zybT$Yz+_0LnsBI28XQWeltT{Hr#c{|;#Mliojrm=)`c5>L2jkM=6APy$lOX- zYaO{0;9j>yOWOEGy9UGCy>6=qF!_dew&4@x^~|)}HSPky_mitnV3s;8ZtDy`z`zC2 zq#D#dj-v1utwFD$Tf{WU3H90(^xS~q;cg60MNvVH`Tx!Ozp`0=IpIMszF(l@%;Vp_ zhE2pF(V#aURg6;W+=cdn0Y zr${@8eacqnYNf~yEeVd(r#em0*x+?a@WB}uAZ~S4-Rf%6x?8|&D&18ywsvs3Hq_G& zmalNP)Cue!cbjj{B?V3Wq>TY{1xIr?2i;aQjp!*H0hFg5;5f=qp97&iR$o2GwPUCA`)oFmU zsw-gUfXO$m%r>U{l8fOspcyd1X+m}#Sn5-OUxfMLz<=8`WP7>03FXR15u3dK5>`0r zlb|&y!zasCl%u66#mvMJmE6;UJ~>J?(+4n0DykO@3jImu{8v%Fi>7iD_Q-`057$9l zjDq+W?_`VV3c0AdSYIKJu8C-(U&vNhE)vJoRLJMo3=QN+0VfB-K;f;(LZ2%a?+n=r zQK}AWx6O+~MZU$A-!I7HT$0!H(j7r*$Fy_@l36XJ#Yfs`vV$S5LD4i#w#oT64-6wf zY;4t%9W2=#6kUay@9towc0_i_Nh?S02ubZevWcCU2*^8_m?oOE`(lSKdnDW5O#Hd{ z`@bHYzWvcQ=?DLP`$=6NGH?j!&y*ateDi`=MM5r27@$5PE?KyHl^UU12S$RFj6siUhK4oVyCrodUed-R^ZP zy*@3y9+LjWFTKVHs>i@%`jn8JpuS*Go>nVI94V&_qH~^-g0YeUFJGS+&fi~>4;gF! za270j$65HHpm1PV{7${wQt7r@T+MZ)opm=W+|53B(wU9mU9uZ`>1B`fl2$fJORs?x zv?k@kAkK$p)k+9R7eWvZQa&YACdG#Qfs$2+T!jIB#*84WyUkA8y&EcSdSqAws;Bu3 ztWJR-w~K&4r3|Q3rVXM^U9SAVaN$5n5h&!&(CW)2g+0(6?mZO^lDgY~ABb%l(&}|= zyCj!h^GiS0OFv`M2hZx@=#e-+nKA(klqVGqxQdRuk~@ddmW7K{ypjH?6X z$D8;ANE1FUxRZW2D!s!l5H=_N)A-Ooazt0C!Sz4R87e({b{ZgM?Q@eV3cJUsM`Um4pzYso}zWCku2Xu@5gGx>N zv{l#drvyir$I)k;!R^MUN zuPdP|jIBmERFRI%|>fxW>&4yV#}(rv{adlhUONl(UxVi)@0e5 z4K>eHnd=*jRaT>+7BFkFHrrt7ESse*tF*DEWrwk$*_QQieRFwBb(XEA!D6g$Gd5&3 zG}aocb~M(un1K?IT{cIyx~1M+tFu_lM!LpqXxL7-h9#kw=VUUO46Wgz%a-Rb(96s& z$joN47iU$}S6dC%_N-DYLZiiK%_?c!vBS_%TLHXnYHT#yvOp`gto4SP$2V4H+G?M< z*ZP;z)i>0bTWXD2y!;IY^S= zNTxuM%x?*gt`muv^*RrD(F$QJvu`1=gIbUiQc7ERGNjxht>6^VCbIKjfC}dM_alF) zjNQ-?B1~a4STpAdW%Kp{k|sDBXMl>EX#G5LA}L5H5RC;wpD9t&Hj2gsYfcTeiFR>_ z0Q9?~2dYIZc4kwy7Vlk!LLros8uoTx4|^Y1|Nw5!M) zp$QW2%-2kcJ`crZ644qW`g2y6HYs||FVi?g*>PT9@A&w&^V`l(jD0$OdRt(8=**R} zf-^{RRx3HjNzT)Wxw*g0P0T*F;+12+*btFj-u2RN-u%tNmyQNrYST?icUkRD{0agvaIqL4WdqR0kr?Y->cR&)Hl}~%-~1}z46*5$tJ??dShND5@?UW z5d&Td#u;SOlK(*wY$SUq?P&2AqK}kdki8o_H}_A34hsmxNt_R!91;?*FQU35(?uk5 zvi|bd;cU5P;47%*e}ihcS4W^Xz?)`<`|Y`f_+p?D`W(D7UibvB zQ|x~U36ZhssJ0hYpb$GWYB4d8YAn4EVRZ?SmYcjSA1u#H-wE89Z+ldc~#+M98x z4ToD>i@DhhJ!7NE)M7UC8K}n4P-Sj3)I!L#!hpG|zM!x zv3eawdfc?O(Oirp@218wYhy#R4iX2Ttp`f8zu|b<$mh8dpxSI)`*_(sZo;5@eaMi& zV;H*0+R{)16ZmBG#C-!>zvuV(UGSAYCh>$iW-^d zHOr$B$(1J|t`bth8&q&oa#r_2JM9pwvuiVsuSz%}U;%j$kf&chMOskLegYkW6Z$u! z=U+pzE$iP&4n|CiZ2I{&6dpVRgWru#xr$^U!>W^xB}?Dh?Nb5MZ+E+QThY;1_vH0Q zh9oz9OK-sAj(o8IvG9KPl!_T6VEySy$;}W*b9-9UfugbBnZfUJG%x1B(^Khbgr*`8 z_qm|!*)bBxDkoUgfvsypvPMRB?#EZ{f^BGmOT6w(L{hXj8{PxqdT^B(O648c3WT;! zy|{ITP_Y1U*CV^0r=oVq;xA(jUYQo%@_+{S*#$fOSh8y%S;&$Ynvtv*_Ub1x=|W=4 zqGzJ^utM%G;%}1>QHr!5L^oMP7ege4;sDuyn5^5TmIk%TJBZL@R~%>jr4?f% z`D^pt*Cj!N6kzkiN$A#063So8xSzBO+WMp54%M`ql@3gcrom7UdQs)aH=`-|pg_Rd zU$XS1V|54&&!4|mL2j|Tc8!B;bCSsQ<0I=YcRps8cMK+uE_N0+gPqtQgbwJ?6*gXt z9wH#dwf1!7X(A5+Eya(hPf<*xCpsUP7%)sl4NxyO?Uu`apS&|X%jYT>FQw2{bSXit zs-Bei5m+qBrD_cGFC`dMzsU2t3Mi0H?mM+=gwmzu7kjjOz7J$?1%IVe1$4k+H@j?f zam1SDMvsW6IYp>|)m8Ya2xUeIC&E1tCq!P8d>C4GZ^(<)$4eS=f5Yxt*#jmA`ti$- zO^eK2JPalGyv@b@+zXtexUS zOnG@D6Z0&@y8%aC)EY?0Sj;LAQ+5ggG0i>{;sGYE+$@>mbi!-&Z>}87Fcd3!EE{& z@#uj=@fXc~4Fa_UiUZ-zh-aH9eQ@ zs%R>^Mt{;}l%k-tdRMW#lNw5!Ji z+D@HG9L@B&>>iRG3FQ~d#Xnw7Q4OO$Bv_)lOemJ;OXWgAnRxWeyLX?b{|Zypm9Y_Jpp-4|JHw2U0?W*U0qXPS+9W%<#}HehTozJQ(J9fM+-^)+LD2F(*!k zZ+m(F@*I-24gWCofw9ykH*sy`(8aSbPiak++8HK%;D|Z@(kYYW>0Sr>oA~C4t zVl2f1Fqb~WApmTRs2TOub&aS%o_iLDPjaxAn=XZmDR<=ns}qCSBm#{g z*fo>16>Cg`4Mu$hDt_01*m<4Dq3G8sX6>z4p(H6MQ9}L-kk$mTavAu-hpNvkGJntD z-cDMvtwk@d1$O)uETUG3bYD+mos1{FTA_*hwd0rFd1v1Bdt zdwH(|2#gG`l_I9vf@n%4R*hr+e4j(*`VCYvIEf)II6*f3*nPN49(M}k>OX^O7%#}< zhDshnwes3gUr_K!>J38CKm`%r+M@iM>Qva;g;BUOhCAO9uUmk5>LcrYvcDod1H0%; zElob^Sa6gFTQFFhM-f;z9YN7;kIcVx_^=SpdMf2D==2bWIa*Qo94+p~>VH;$4OSn) ztLt3_A@?q1iaG#BDC>T1jAVT-dBOvek@p5~>qZ8XPYfo*%;(rinE5LOoo{y~xem+d zoiG6ooI>m~x49wr&RL&{job&KrgmVT!B&d!GPiXBozg!D3hF14rc2h$dU|if7}iT6 zRBP}77vZr_$WmDGnIL&5i1)GyBw&sp><_Lp7@I#l!x%)9RbIgwU|^h<-s($5(c)|a z-sp!Zr>-lSSPoRo+CSf0?U0jSZ8cs^F}qrl9LF_cRQ4tEtc7@RQL<#$6d8&jc)y5< z;r$|Pp=I+P!BUO!77Ae#`ILw~;qVI>;Nc2!gG62<`zk~Nult8e#O=os@+SIHFl&6n z(TniXcd*3{@K%AZ0d#B}NC`Jm1#?u7r5ye(RI*hVwL&o)!3Ui0VrT(|UgJ$3Vj@@G zE1WgV2lr#B2a^q}34-}7S>8Ru=K3DQ_8C)tFaWqS<{4HT_K@_L41k8+Y5)W{9_kq> zpW|YP*Why)W9h8r$Cd7vfYA)NUk7zSRK}5P%K)a`_eZEm6Aqf~bQFx0L&VN}lInQ~ z6gH(jNbUoxks^q+OBEdr*%3nmF z1aa*Uq8WN@PA!3@zI%!shb4HgJtTZ&RtJHhdppsI-J0Qz4(o13j0XB^I1Ht6h~P~% zZSUL$zh%K2Ea1r+FzUSx4mhEIS5}0f<@fgPtq=wac#}9g$7Dt3(K#b>s zZAN9ptnf+`hFUP$NnUt9dxpuf=kOSE-3QWs_>Uml7+ze>n?DW?b%U`{2O!uUcI?q+ zDSpk}xtKIX-EvOGP&wao>>;Fzm^9aRpKCxc>KqGQJ!6SE?vI&qFSzgPbSPe=Z4+(l zkFj>aX_zj_7`L;OXSUj|GX`;jMY^gl06FDdi`w|Z~!qwq%XvGQkTkuI5&;0{@`2D2< zK79Lt`y*fQZxnn?_)3C4hBkg*xeMRYnKt~)jpH`P#|6KS<98Wc_&K0Dlz~tgz+-1% za1lWOzDohICjpM%;FiD#BJpsHZvnU(`o-|kGjIyvdjXF7)$pa>2R{aI{K(;e5C16N_gD=U;Nbpr2D(K`1{`Gs^<8aQPw}<&T6abYh;^K*ViG;>g(^uXBGB$ X!234gK8@XDkylx``!98d%>?}qGZkBM literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o b/node_modules/cpu-features/build/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o new file mode 100644 index 0000000000000000000000000000000000000000..5a0b2a07a1b5f1dbcb964a2b9b3f807b3a923991 GIT binary patch literal 30960 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 Zw|Px?jAk~W{{Rk-xf%cf literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/Release/obj.target/cpufeatures/src/binding.o b/node_modules/cpu-features/build/Release/obj.target/cpufeatures/src/binding.o new file mode 100644 index 0000000000000000000000000000000000000000..d30815dfc1a721ebeb98879b0f5fb4b28a666e09 GIT binary patch literal 370640 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 UH(RK@Ri$*NXbP+Cg6%i|1_5%1R{#J2 literal 0 HcmV?d00001 diff --git a/node_modules/cpu-features/build/binding.Makefile b/node_modules/cpu-features/build/binding.Makefile new file mode 100644 index 00000000..982734f7 --- /dev/null +++ b/node_modules/cpu-features/build/binding.Makefile @@ -0,0 +1,6 @@ +# This file is generated by gyp; do not edit. + +export builddir_name ?= ./build/. +.PHONY: all +all: + $(MAKE) cpufeatures diff --git a/node_modules/cpu-features/build/config.gypi b/node_modules/cpu-features/build/config.gypi new file mode 100644 index 00000000..ccb95f49 --- /dev/null +++ b/node_modules/cpu-features/build/config.gypi @@ -0,0 +1,418 @@ +# Do not edit. File was generated by node-gyp's "configure" step +{ + "target_defaults": { + "cflags": [], + "default_configuration": "Release", + "defines": [], + "include_dirs": [], + "libraries": [] + }, + "variables": { + "asan": 0, + "coverage": "false", + "dcheck_always_on": 0, + "debug_nghttp2": "false", + "debug_node": "false", + "enable_lto": "true", + "enable_pgo_generate": "false", + "enable_pgo_use": "false", + "error_on_warn": "false", + "force_dynamic_crt": 0, + "host_arch": "x64", + "icu_gyp_path": "tools/icu/icu-system.gyp", + "icu_small": "false", + "icu_ver_major": "73", + "is_debug": 0, + "libdir": "lib", + "llvm_version": "14.0", + "napi_build_version": "9", + "node_builtin_shareable_builtins": [ + "deps/cjs-module-lexer/lexer.js", + "deps/cjs-module-lexer/dist/lexer.js", + "deps/undici/undici.js" + ], + "node_byteorder": "little", + "node_debug_lib": "false", + "node_enable_d8": "false", + "node_enable_v8_vtunejit": "false", + "node_fipsinstall": "false", + "node_install_corepack": "false", + "node_install_npm": "false", + "node_library_files": [ + "lib/_http_agent.js", + "lib/_http_client.js", + "lib/_http_common.js", + "lib/_http_incoming.js", + "lib/_http_outgoing.js", + "lib/_http_server.js", + "lib/_stream_duplex.js", + "lib/_stream_passthrough.js", + "lib/_stream_readable.js", + "lib/_stream_transform.js", + "lib/_stream_wrap.js", + "lib/_stream_writable.js", + "lib/_tls_common.js", + "lib/_tls_wrap.js", + "lib/assert.js", + "lib/assert/strict.js", + "lib/async_hooks.js", + "lib/buffer.js", + "lib/child_process.js", + "lib/cluster.js", + "lib/console.js", + "lib/constants.js", + "lib/crypto.js", + "lib/dgram.js", + "lib/diagnostics_channel.js", + "lib/dns.js", + "lib/dns/promises.js", + "lib/domain.js", + "lib/events.js", + "lib/fs.js", + "lib/fs/promises.js", + "lib/http.js", + "lib/http2.js", + "lib/https.js", + "lib/inspector.js", + "lib/inspector/promises.js", + "lib/internal/abort_controller.js", + "lib/internal/assert.js", + "lib/internal/assert/assertion_error.js", + "lib/internal/assert/calltracker.js", + "lib/internal/async_hooks.js", + "lib/internal/blob.js", + "lib/internal/blocklist.js", + "lib/internal/bootstrap/node.js", + "lib/internal/bootstrap/realm.js", + "lib/internal/bootstrap/switches/does_not_own_process_state.js", + "lib/internal/bootstrap/switches/does_own_process_state.js", + "lib/internal/bootstrap/switches/is_main_thread.js", + "lib/internal/bootstrap/switches/is_not_main_thread.js", + "lib/internal/bootstrap/web/exposed-wildcard.js", + "lib/internal/bootstrap/web/exposed-window-or-worker.js", + "lib/internal/buffer.js", + "lib/internal/child_process.js", + "lib/internal/child_process/serialization.js", + "lib/internal/cli_table.js", + "lib/internal/cluster/child.js", + "lib/internal/cluster/primary.js", + "lib/internal/cluster/round_robin_handle.js", + "lib/internal/cluster/shared_handle.js", + "lib/internal/cluster/utils.js", + "lib/internal/cluster/worker.js", + "lib/internal/console/constructor.js", + "lib/internal/console/global.js", + "lib/internal/constants.js", + "lib/internal/crypto/aes.js", + "lib/internal/crypto/certificate.js", + "lib/internal/crypto/cfrg.js", + "lib/internal/crypto/cipher.js", + "lib/internal/crypto/diffiehellman.js", + "lib/internal/crypto/ec.js", + "lib/internal/crypto/hash.js", + "lib/internal/crypto/hashnames.js", + "lib/internal/crypto/hkdf.js", + "lib/internal/crypto/keygen.js", + "lib/internal/crypto/keys.js", + "lib/internal/crypto/mac.js", + "lib/internal/crypto/pbkdf2.js", + "lib/internal/crypto/random.js", + "lib/internal/crypto/rsa.js", + "lib/internal/crypto/scrypt.js", + "lib/internal/crypto/sig.js", + "lib/internal/crypto/util.js", + "lib/internal/crypto/webcrypto.js", + "lib/internal/crypto/webidl.js", + "lib/internal/crypto/x509.js", + "lib/internal/debugger/inspect.js", + "lib/internal/debugger/inspect_client.js", + "lib/internal/debugger/inspect_repl.js", + "lib/internal/dgram.js", + "lib/internal/dns/callback_resolver.js", + "lib/internal/dns/promises.js", + "lib/internal/dns/utils.js", + "lib/internal/encoding.js", + "lib/internal/error_serdes.js", + "lib/internal/errors.js", + "lib/internal/event_target.js", + "lib/internal/events/symbols.js", + "lib/internal/file.js", + "lib/internal/fixed_queue.js", + "lib/internal/freelist.js", + "lib/internal/freeze_intrinsics.js", + "lib/internal/fs/cp/cp-sync.js", + "lib/internal/fs/cp/cp.js", + "lib/internal/fs/dir.js", + "lib/internal/fs/promises.js", + "lib/internal/fs/read/context.js", + "lib/internal/fs/read/utf8.js", + "lib/internal/fs/recursive_watch.js", + "lib/internal/fs/rimraf.js", + "lib/internal/fs/streams.js", + "lib/internal/fs/sync_write_stream.js", + "lib/internal/fs/utils.js", + "lib/internal/fs/watchers.js", + "lib/internal/heap_utils.js", + "lib/internal/histogram.js", + "lib/internal/http.js", + "lib/internal/http2/compat.js", + "lib/internal/http2/core.js", + "lib/internal/http2/util.js", + "lib/internal/idna.js", + "lib/internal/inspector_async_hook.js", + "lib/internal/js_stream_socket.js", + "lib/internal/legacy/processbinding.js", + "lib/internal/linkedlist.js", + "lib/internal/main/check_syntax.js", + "lib/internal/main/embedding.js", + "lib/internal/main/eval_stdin.js", + "lib/internal/main/eval_string.js", + "lib/internal/main/inspect.js", + "lib/internal/main/mksnapshot.js", + "lib/internal/main/print_help.js", + "lib/internal/main/prof_process.js", + "lib/internal/main/repl.js", + "lib/internal/main/run_main_module.js", + "lib/internal/main/test_runner.js", + "lib/internal/main/watch_mode.js", + "lib/internal/main/worker_thread.js", + "lib/internal/mime.js", + "lib/internal/modules/cjs/loader.js", + "lib/internal/modules/esm/assert.js", + "lib/internal/modules/esm/create_dynamic_module.js", + "lib/internal/modules/esm/fetch_module.js", + "lib/internal/modules/esm/formats.js", + "lib/internal/modules/esm/get_format.js", + "lib/internal/modules/esm/handle_process_exit.js", + "lib/internal/modules/esm/hooks.js", + "lib/internal/modules/esm/initialize_import_meta.js", + "lib/internal/modules/esm/load.js", + "lib/internal/modules/esm/loader.js", + "lib/internal/modules/esm/module_job.js", + "lib/internal/modules/esm/module_map.js", + "lib/internal/modules/esm/package_config.js", + "lib/internal/modules/esm/resolve.js", + "lib/internal/modules/esm/shared_constants.js", + "lib/internal/modules/esm/translators.js", + "lib/internal/modules/esm/utils.js", + "lib/internal/modules/esm/worker.js", + "lib/internal/modules/helpers.js", + "lib/internal/modules/package_json_reader.js", + "lib/internal/modules/run_main.js", + "lib/internal/net.js", + "lib/internal/options.js", + "lib/internal/per_context/domexception.js", + "lib/internal/per_context/messageport.js", + "lib/internal/per_context/primordials.js", + "lib/internal/perf/event_loop_delay.js", + "lib/internal/perf/event_loop_utilization.js", + "lib/internal/perf/nodetiming.js", + "lib/internal/perf/observe.js", + "lib/internal/perf/performance.js", + "lib/internal/perf/performance_entry.js", + "lib/internal/perf/resource_timing.js", + "lib/internal/perf/timerify.js", + "lib/internal/perf/usertiming.js", + "lib/internal/perf/utils.js", + "lib/internal/policy/manifest.js", + "lib/internal/policy/sri.js", + "lib/internal/priority_queue.js", + "lib/internal/process/esm_loader.js", + "lib/internal/process/execution.js", + "lib/internal/process/per_thread.js", + "lib/internal/process/permission.js", + "lib/internal/process/policy.js", + "lib/internal/process/pre_execution.js", + "lib/internal/process/promises.js", + "lib/internal/process/report.js", + "lib/internal/process/signal.js", + "lib/internal/process/task_queues.js", + "lib/internal/process/warning.js", + "lib/internal/process/worker_thread_only.js", + "lib/internal/promise_hooks.js", + "lib/internal/querystring.js", + "lib/internal/readline/callbacks.js", + "lib/internal/readline/emitKeypressEvents.js", + "lib/internal/readline/interface.js", + "lib/internal/readline/promises.js", + "lib/internal/readline/utils.js", + "lib/internal/repl.js", + "lib/internal/repl/await.js", + "lib/internal/repl/history.js", + "lib/internal/repl/utils.js", + "lib/internal/socket_list.js", + "lib/internal/socketaddress.js", + "lib/internal/source_map/prepare_stack_trace.js", + "lib/internal/source_map/source_map.js", + "lib/internal/source_map/source_map_cache.js", + "lib/internal/stream_base_commons.js", + "lib/internal/streams/add-abort-signal.js", + "lib/internal/streams/buffer_list.js", + "lib/internal/streams/compose.js", + "lib/internal/streams/destroy.js", + "lib/internal/streams/duplex.js", + "lib/internal/streams/duplexify.js", + "lib/internal/streams/end-of-stream.js", + "lib/internal/streams/from.js", + "lib/internal/streams/lazy_transform.js", + "lib/internal/streams/legacy.js", + "lib/internal/streams/operators.js", + "lib/internal/streams/passthrough.js", + "lib/internal/streams/pipeline.js", + "lib/internal/streams/readable.js", + "lib/internal/streams/state.js", + "lib/internal/streams/transform.js", + "lib/internal/streams/utils.js", + "lib/internal/streams/writable.js", + "lib/internal/structured_clone.js", + "lib/internal/test/binding.js", + "lib/internal/test/transfer.js", + "lib/internal/test_runner/coverage.js", + "lib/internal/test_runner/harness.js", + "lib/internal/test_runner/mock/mock.js", + "lib/internal/test_runner/mock/mock_timers.js", + "lib/internal/test_runner/reporter/dot.js", + "lib/internal/test_runner/reporter/spec.js", + "lib/internal/test_runner/reporter/tap.js", + "lib/internal/test_runner/reporter/v8-serializer.js", + "lib/internal/test_runner/runner.js", + "lib/internal/test_runner/test.js", + "lib/internal/test_runner/tests_stream.js", + "lib/internal/test_runner/utils.js", + "lib/internal/timers.js", + "lib/internal/tls/secure-context.js", + "lib/internal/tls/secure-pair.js", + "lib/internal/trace_events_async_hooks.js", + "lib/internal/tty.js", + "lib/internal/url.js", + "lib/internal/util.js", + "lib/internal/util/colors.js", + "lib/internal/util/comparisons.js", + "lib/internal/util/debuglog.js", + "lib/internal/util/embedding.js", + "lib/internal/util/inspect.js", + "lib/internal/util/inspector.js", + "lib/internal/util/iterable_weak_map.js", + "lib/internal/util/parse_args/parse_args.js", + "lib/internal/util/parse_args/utils.js", + "lib/internal/util/types.js", + "lib/internal/v8/startup_snapshot.js", + "lib/internal/v8_prof_polyfill.js", + "lib/internal/v8_prof_processor.js", + "lib/internal/validators.js", + "lib/internal/vm.js", + "lib/internal/vm/module.js", + "lib/internal/wasm_web_api.js", + "lib/internal/watch_mode/files_watcher.js", + "lib/internal/watchdog.js", + "lib/internal/webidl.js", + "lib/internal/webstreams/adapters.js", + "lib/internal/webstreams/compression.js", + "lib/internal/webstreams/encoding.js", + "lib/internal/webstreams/queuingstrategies.js", + "lib/internal/webstreams/readablestream.js", + "lib/internal/webstreams/transfer.js", + "lib/internal/webstreams/transformstream.js", + "lib/internal/webstreams/util.js", + "lib/internal/webstreams/writablestream.js", + "lib/internal/worker.js", + "lib/internal/worker/io.js", + "lib/internal/worker/js_transferable.js", + "lib/module.js", + "lib/net.js", + "lib/os.js", + "lib/path.js", + "lib/path/posix.js", + "lib/path/win32.js", + "lib/perf_hooks.js", + "lib/process.js", + "lib/punycode.js", + "lib/querystring.js", + "lib/readline.js", + "lib/readline/promises.js", + "lib/repl.js", + "lib/stream.js", + "lib/stream/consumers.js", + "lib/stream/promises.js", + "lib/stream/web.js", + "lib/string_decoder.js", + "lib/sys.js", + "lib/test.js", + "lib/test/reporters.js", + "lib/timers.js", + "lib/timers/promises.js", + "lib/tls.js", + "lib/trace_events.js", + "lib/tty.js", + "lib/url.js", + "lib/util.js", + "lib/util/types.js", + "lib/v8.js", + "lib/vm.js", + "lib/wasi.js", + "lib/worker_threads.js", + "lib/zlib.js" + ], + "node_module_version": 115, + "node_no_browser_globals": "false", + "node_prefix": "/usr/local/Cellar/node/20.6.1", + "node_release_urlbase": "", + "node_shared": "false", + "node_shared_brotli": "true", + "node_shared_cares": "true", + "node_shared_http_parser": "false", + "node_shared_libuv": "true", + "node_shared_nghttp2": "true", + "node_shared_nghttp3": "false", + "node_shared_ngtcp2": "false", + "node_shared_openssl": "true", + "node_shared_zlib": "true", + "node_tag": "", + "node_target_type": "executable", + "node_use_bundled_v8": "true", + "node_use_node_code_cache": "true", + "node_use_node_snapshot": "true", + "node_use_openssl": "true", + "node_use_v8_platform": "true", + "node_with_ltcg": "false", + "node_without_node_options": "false", + "openssl_is_fips": "false", + "openssl_quic": "false", + "ossfuzz": "false", + "shlib_suffix": "115.dylib", + "single_executable_application": "true", + "target_arch": "x64", + "v8_enable_31bit_smis_on_64bit_arch": 0, + "v8_enable_gdbjit": 0, + "v8_enable_hugepage": 0, + "v8_enable_i18n_support": 1, + "v8_enable_inspector": 1, + "v8_enable_javascript_promise_hooks": 1, + "v8_enable_lite_mode": 0, + "v8_enable_object_print": 1, + "v8_enable_pointer_compression": 0, + "v8_enable_shared_ro_heap": 1, + "v8_enable_short_builtin_calls": 1, + "v8_enable_webassembly": 1, + "v8_no_strict_aliasing": 1, + "v8_optimized_debug": 1, + "v8_promise_internal_field_count": 1, + "v8_random_seed": 0, + "v8_trace_maps": 0, + "v8_use_siphash": 1, + "want_separate_host_toolset": 0, + "nodedir": "/Users/spw/Library/Caches/node-gyp/20.6.1", + "standalone_static_library": 1, + "metrics_registry": "https://registry.npmjs.org/", + "global_prefix": "/usr/local", + "local_prefix": "/Users/spw/Documents/GitHub/sunpeiwen", + "globalconfig": "/usr/local/etc/npmrc", + "init_module": "/Users/spw/.npm-init.js", + "userconfig": "/Users/spw/.npmrc", + "npm_version": "9.8.1", + "node_gyp": "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js", + "cache": "/Users/spw/.npm", + "user_agent": "npm/9.8.1 node/v20.6.1 darwin x64 workspaces/false", + "prefix": "/usr/local" + } +} diff --git a/node_modules/cpu-features/build/cpufeatures.target.mk b/node_modules/cpu-features/build/cpufeatures.target.mk new file mode 100644 index 00000000..4106e99f --- /dev/null +++ b/node_modules/cpu-features/build/cpufeatures.target.mk @@ -0,0 +1,196 @@ +# This file is generated by gyp; do not edit. + +TOOLSET := target +TARGET := cpufeatures +DEFS_Debug := \ + '-DNODE_GYP_MODULE_NAME=cpufeatures' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-DV8_DEPRECATION_WARNINGS' \ + '-DV8_IMMINENT_DEPRECATION_WARNINGS' \ + '-D_GLIBCXX_USE_CXX11_ABI=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DCPU_FEATURES_VERSION_REV=8a494eb1e158ec2050e5f699a504fbc9b896a43b' \ + '-DBUILDING_NODE_EXTENSION' \ + '-DDEBUG' \ + '-D_DEBUG' \ + '-DV8_ENABLE_CHECKS' + +# Flags passed to all source files. +CFLAGS_Debug := \ + -O0 \ + -gdwarf-2 \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Debug := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Debug := \ + -std=gnu++17 \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Debug := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Debug := + +INCS_Debug := \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/src \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include \ + -I$(srcdir)/src \ + -I$(srcdir)/../nan \ + -I$(srcdir)/deps/cpu_features/include + +DEFS_Release := \ + '-DNODE_GYP_MODULE_NAME=cpufeatures' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-DV8_DEPRECATION_WARNINGS' \ + '-DV8_IMMINENT_DEPRECATION_WARNINGS' \ + '-D_GLIBCXX_USE_CXX11_ABI=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DCPU_FEATURES_VERSION_REV=8a494eb1e158ec2050e5f699a504fbc9b896a43b' \ + '-DBUILDING_NODE_EXTENSION' + +# Flags passed to all source files. +CFLAGS_Release := \ + -O3 \ + -gdwarf-2 \ + -flto \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Release := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Release := \ + -std=gnu++17 \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Release := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Release := + +INCS_Release := \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/src \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include \ + -I$(srcdir)/src \ + -I$(srcdir)/../nan \ + -I$(srcdir)/deps/cpu_features/include + +OBJS := \ + $(obj).target/$(TARGET)/src/binding.o + +# Add to the list of files we specially track dependencies for. +all_deps += $(OBJS) + +# Make sure our dependencies are built before any of us. +$(OBJS): | $(builddir)/cpu_features.a + +# CFLAGS et al overrides must be target-local. +# See "Target-specific Variable Values" in the GNU Make manual. +$(OBJS): TOOLSET := $(TOOLSET) +$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) +$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) + +# Suffix rules, putting all outputs into $(obj). + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# Try building from generated source, too. + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# End of this set of suffix rules +### Rules for final target. +LDFLAGS_Debug := \ + -undefined dynamic_lookup \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Debug := \ + -undefined dynamic_lookup \ + -Wl,-search_paths_first + +LDFLAGS_Release := \ + -undefined dynamic_lookup \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Release := \ + -undefined dynamic_lookup \ + -Wl,-search_paths_first + +LIBS := + +$(builddir)/cpufeatures.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) +$(builddir)/cpufeatures.node: LIBS := $(LIBS) +$(builddir)/cpufeatures.node: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE)) +$(builddir)/cpufeatures.node: TOOLSET := $(TOOLSET) +$(builddir)/cpufeatures.node: $(OBJS) $(builddir)/cpu_features.a FORCE_DO_CMD + $(call do_cmd,solink_module) + +all_deps += $(builddir)/cpufeatures.node +# Add target alias +.PHONY: cpufeatures +cpufeatures: $(builddir)/cpufeatures.node + +# Short alias for building this executable. +.PHONY: cpufeatures.node +cpufeatures.node: $(builddir)/cpufeatures.node + +# Add executable to "all" target. +.PHONY: all +all: $(builddir)/cpufeatures.node + diff --git a/node_modules/cpu-features/build/deps/cpu_features/cpu_features.Makefile b/node_modules/cpu-features/build/deps/cpu_features/cpu_features.Makefile new file mode 100644 index 00000000..c6b37bb4 --- /dev/null +++ b/node_modules/cpu-features/build/deps/cpu_features/cpu_features.Makefile @@ -0,0 +1,6 @@ +# This file is generated by gyp; do not edit. + +export builddir_name ?= ./build/deps/cpu_features/. +.PHONY: all +all: + $(MAKE) -C ../.. cpu_features diff --git a/node_modules/cpu-features/build/deps/cpu_features/cpu_features.target.mk b/node_modules/cpu-features/build/deps/cpu_features/cpu_features.target.mk new file mode 100644 index 00000000..7b029d03 --- /dev/null +++ b/node_modules/cpu-features/build/deps/cpu_features/cpu_features.target.mk @@ -0,0 +1,204 @@ +# This file is generated by gyp; do not edit. + +TOOLSET := target +TARGET := cpu_features +DEFS_Debug := \ + '-DNODE_GYP_MODULE_NAME=cpu_features' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-DV8_DEPRECATION_WARNINGS' \ + '-DV8_IMMINENT_DEPRECATION_WARNINGS' \ + '-D_GLIBCXX_USE_CXX11_ABI=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DNDEBUG' \ + '-DSTACK_LINE_READER_BUFFER_SIZE=1024' \ + '-DHAVE_SYSCTLBYNAME=1' \ + '-DDEBUG' \ + '-D_DEBUG' \ + '-DV8_ENABLE_CHECKS' + +# Flags passed to all source files. +CFLAGS_Debug := \ + -O0 \ + -gdwarf-2 \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Debug := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Debug := \ + -std=gnu++17 \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Debug := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Debug := + +INCS_Debug := \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/src \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include \ + -I$(srcdir)/deps/cpu_features/include \ + -I$(srcdir)/deps/cpu_features/include/internal + +DEFS_Release := \ + '-DNODE_GYP_MODULE_NAME=cpu_features' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-DV8_DEPRECATION_WARNINGS' \ + '-DV8_IMMINENT_DEPRECATION_WARNINGS' \ + '-D_GLIBCXX_USE_CXX11_ABI=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DNDEBUG' \ + '-DSTACK_LINE_READER_BUFFER_SIZE=1024' \ + '-DHAVE_SYSCTLBYNAME=1' + +# Flags passed to all source files. +CFLAGS_Release := \ + -O3 \ + -gdwarf-2 \ + -flto \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Release := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Release := \ + -std=gnu++17 \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Release := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Release := + +INCS_Release := \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/src \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include \ + -I$(srcdir)/deps/cpu_features/include \ + -I$(srcdir)/deps/cpu_features/include/internal + +OBJS := \ + $(obj).target/$(TARGET)/deps/cpu_features/src/impl_aarch64_linux_or_android.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/impl_arm_linux_or_android.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/impl_mips_linux_or_android.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/impl_ppc_linux.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/impl_x86_freebsd.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/impl_x86_linux_or_android.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/impl_x86_macos.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/impl_x86_windows.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/filesystem.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/stack_line_reader.o \ + $(obj).target/$(TARGET)/deps/cpu_features/src/string_view.o + +# Add to the list of files we specially track dependencies for. +all_deps += $(OBJS) + +# CFLAGS et al overrides must be target-local. +# See "Target-specific Variable Values" in the GNU Make manual. +$(OBJS): TOOLSET := $(TOOLSET) +$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) +$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) + +# Suffix rules, putting all outputs into $(obj). + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# Try building from generated source, too. + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# End of this set of suffix rules +### Rules for final target. +LDFLAGS_Debug := \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Debug := + +LDFLAGS_Release := \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Release := + +LIBS := + +$(builddir)/cpu_features.a: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) +$(builddir)/cpu_features.a: LIBS := $(LIBS) +$(builddir)/cpu_features.a: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE)) +$(builddir)/cpu_features.a: TOOLSET := $(TOOLSET) +$(builddir)/cpu_features.a: $(OBJS) FORCE_DO_CMD + $(call do_cmd,alink) + +all_deps += $(builddir)/cpu_features.a +# Add target alias +.PHONY: cpu_features +cpu_features: $(builddir)/cpu_features.a + +# Add target alias to "all" target. +.PHONY: all +all: cpu_features + +# Add target alias +.PHONY: cpu_features +cpu_features: $(builddir)/cpu_features.a + +# Short alias for building this static library. +.PHONY: cpu_features.a +cpu_features.a: $(builddir)/cpu_features.a + +# Add static library to "all" target. +.PHONY: all +all: $(builddir)/cpu_features.a + diff --git a/node_modules/cpu-features/build/gyp-mac-tool b/node_modules/cpu-features/build/gyp-mac-tool new file mode 100755 index 00000000..ffef860c --- /dev/null +++ b/node_modules/cpu-features/build/gyp-mac-tool @@ -0,0 +1,772 @@ +#!/usr/bin/env python3 +# Generated by gyp. Do not edit. +# Copyright (c) 2012 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Utility functions to perform Xcode-style build steps. + +These functions are executed via gyp-mac-tool when using the Makefile generator. +""" + + +import fcntl +import fnmatch +import glob +import json +import os +import plistlib +import re +import shutil +import struct +import subprocess +import sys +import tempfile + + +def main(args): + executor = MacTool() + exit_code = executor.Dispatch(args) + if exit_code is not None: + sys.exit(exit_code) + + +class MacTool: + """This class performs all the Mac tooling steps. The methods can either be + executed directly, or dispatched from an argument list.""" + + def Dispatch(self, args): + """Dispatches a string command to a method.""" + if len(args) < 1: + raise Exception("Not enough arguments") + + method = "Exec%s" % self._CommandifyName(args[0]) + return getattr(self, method)(*args[1:]) + + def _CommandifyName(self, name_string): + """Transforms a tool name like copy-info-plist to CopyInfoPlist""" + return name_string.title().replace("-", "") + + def ExecCopyBundleResource(self, source, dest, convert_to_binary): + """Copies a resource file to the bundle/Resources directory, performing any + necessary compilation on each resource.""" + convert_to_binary = convert_to_binary == "True" + extension = os.path.splitext(source)[1].lower() + if os.path.isdir(source): + # Copy tree. + # TODO(thakis): This copies file attributes like mtime, while the + # single-file branch below doesn't. This should probably be changed to + # be consistent with the single-file branch. + if os.path.exists(dest): + shutil.rmtree(dest) + shutil.copytree(source, dest) + elif extension == ".xib": + return self._CopyXIBFile(source, dest) + elif extension == ".storyboard": + return self._CopyXIBFile(source, dest) + elif extension == ".strings" and not convert_to_binary: + self._CopyStringsFile(source, dest) + else: + if os.path.exists(dest): + os.unlink(dest) + shutil.copy(source, dest) + + if convert_to_binary and extension in (".plist", ".strings"): + self._ConvertToBinary(dest) + + def _CopyXIBFile(self, source, dest): + """Compiles a XIB file with ibtool into a binary plist in the bundle.""" + + # ibtool sometimes crashes with relative paths. See crbug.com/314728. + base = os.path.dirname(os.path.realpath(__file__)) + if os.path.relpath(source): + source = os.path.join(base, source) + if os.path.relpath(dest): + dest = os.path.join(base, dest) + + args = ["xcrun", "ibtool", "--errors", "--warnings", "--notices"] + + if os.environ["XCODE_VERSION_ACTUAL"] > "0700": + args.extend(["--auto-activate-custom-fonts"]) + if "IPHONEOS_DEPLOYMENT_TARGET" in os.environ: + args.extend( + [ + "--target-device", + "iphone", + "--target-device", + "ipad", + "--minimum-deployment-target", + os.environ["IPHONEOS_DEPLOYMENT_TARGET"], + ] + ) + else: + args.extend( + [ + "--target-device", + "mac", + "--minimum-deployment-target", + os.environ["MACOSX_DEPLOYMENT_TARGET"], + ] + ) + + args.extend( + ["--output-format", "human-readable-text", "--compile", dest, source] + ) + + ibtool_section_re = re.compile(r"/\*.*\*/") + ibtool_re = re.compile(r".*note:.*is clipping its content") + try: + stdout = subprocess.check_output(args) + except subprocess.CalledProcessError as e: + print(e.output) + raise + current_section_header = None + for line in stdout.splitlines(): + if ibtool_section_re.match(line): + current_section_header = line + elif not ibtool_re.match(line): + if current_section_header: + print(current_section_header) + current_section_header = None + print(line) + return 0 + + def _ConvertToBinary(self, dest): + subprocess.check_call( + ["xcrun", "plutil", "-convert", "binary1", "-o", dest, dest] + ) + + def _CopyStringsFile(self, source, dest): + """Copies a .strings file using iconv to reconvert the input into UTF-16.""" + input_code = self._DetectInputEncoding(source) or "UTF-8" + + # Xcode's CpyCopyStringsFile / builtin-copyStrings seems to call + # CFPropertyListCreateFromXMLData() behind the scenes; at least it prints + # CFPropertyListCreateFromXMLData(): Old-style plist parser: missing + # semicolon in dictionary. + # on invalid files. Do the same kind of validation. + import CoreFoundation + + with open(source, "rb") as in_file: + s = in_file.read() + d = CoreFoundation.CFDataCreate(None, s, len(s)) + _, error = CoreFoundation.CFPropertyListCreateFromXMLData(None, d, 0, None) + if error: + return + + with open(dest, "wb") as fp: + fp.write(s.decode(input_code).encode("UTF-16")) + + def _DetectInputEncoding(self, file_name): + """Reads the first few bytes from file_name and tries to guess the text + encoding. Returns None as a guess if it can't detect it.""" + with open(file_name, "rb") as fp: + try: + header = fp.read(3) + except Exception: + return None + if header.startswith(b"\xFE\xFF"): + return "UTF-16" + elif header.startswith(b"\xFF\xFE"): + return "UTF-16" + elif header.startswith(b"\xEF\xBB\xBF"): + return "UTF-8" + else: + return None + + def ExecCopyInfoPlist(self, source, dest, convert_to_binary, *keys): + """Copies the |source| Info.plist to the destination directory |dest|.""" + # Read the source Info.plist into memory. + with open(source) as fd: + lines = fd.read() + + # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild). + plist = plistlib.readPlistFromString(lines) + if keys: + plist.update(json.loads(keys[0])) + lines = plistlib.writePlistToString(plist) + + # Go through all the environment variables and replace them as variables in + # the file. + IDENT_RE = re.compile(r"[_/\s]") + for key in os.environ: + if key.startswith("_"): + continue + evar = "${%s}" % key + evalue = os.environ[key] + lines = lines.replace(lines, evar, evalue) + + # Xcode supports various suffices on environment variables, which are + # all undocumented. :rfc1034identifier is used in the standard project + # template these days, and :identifier was used earlier. They are used to + # convert non-url characters into things that look like valid urls -- + # except that the replacement character for :identifier, '_' isn't valid + # in a URL either -- oops, hence :rfc1034identifier was born. + evar = "${%s:identifier}" % key + evalue = IDENT_RE.sub("_", os.environ[key]) + lines = lines.replace(lines, evar, evalue) + + evar = "${%s:rfc1034identifier}" % key + evalue = IDENT_RE.sub("-", os.environ[key]) + lines = lines.replace(lines, evar, evalue) + + # Remove any keys with values that haven't been replaced. + lines = lines.splitlines() + for i in range(len(lines)): + if lines[i].strip().startswith("${"): + lines[i] = None + lines[i - 1] = None + lines = "\n".join(line for line in lines if line is not None) + + # Write out the file with variables replaced. + with open(dest, "w") as fd: + fd.write(lines) + + # Now write out PkgInfo file now that the Info.plist file has been + # "compiled". + self._WritePkgInfo(dest) + + if convert_to_binary == "True": + self._ConvertToBinary(dest) + + def _WritePkgInfo(self, info_plist): + """This writes the PkgInfo file from the data stored in Info.plist.""" + plist = plistlib.readPlist(info_plist) + if not plist: + return + + # Only create PkgInfo for executable types. + package_type = plist["CFBundlePackageType"] + if package_type != "APPL": + return + + # The format of PkgInfo is eight characters, representing the bundle type + # and bundle signature, each four characters. If that is missing, four + # '?' characters are used instead. + signature_code = plist.get("CFBundleSignature", "????") + if len(signature_code) != 4: # Wrong length resets everything, too. + signature_code = "?" * 4 + + dest = os.path.join(os.path.dirname(info_plist), "PkgInfo") + with open(dest, "w") as fp: + fp.write(f"{package_type}{signature_code}") + + def ExecFlock(self, lockfile, *cmd_list): + """Emulates the most basic behavior of Linux's flock(1).""" + # Rely on exception handling to report errors. + fd = os.open(lockfile, os.O_RDONLY | os.O_NOCTTY | os.O_CREAT, 0o666) + fcntl.flock(fd, fcntl.LOCK_EX) + return subprocess.call(cmd_list) + + def ExecFilterLibtool(self, *cmd_list): + """Calls libtool and filters out '/path/to/libtool: file: foo.o has no + symbols'.""" + libtool_re = re.compile( + r"^.*libtool: (?:for architecture: \S* )?" r"file: .* has no symbols$" + ) + libtool_re5 = re.compile( + r"^.*libtool: warning for library: " + + r".* the table of contents is empty " + + r"\(no object file members in the library define global symbols\)$" + ) + env = os.environ.copy() + # Ref: + # http://www.opensource.apple.com/source/cctools/cctools-809/misc/libtool.c + # The problem with this flag is that it resets the file mtime on the file to + # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone. + env["ZERO_AR_DATE"] = "1" + libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env) + err = libtoolout.communicate()[1].decode("utf-8") + for line in err.splitlines(): + if not libtool_re.match(line) and not libtool_re5.match(line): + print(line, file=sys.stderr) + # Unconditionally touch the output .a file on the command line if present + # and the command succeeded. A bit hacky. + if not libtoolout.returncode: + for i in range(len(cmd_list) - 1): + if cmd_list[i] == "-o" and cmd_list[i + 1].endswith(".a"): + os.utime(cmd_list[i + 1], None) + break + return libtoolout.returncode + + def ExecPackageIosFramework(self, framework): + # Find the name of the binary based on the part before the ".framework". + binary = os.path.basename(framework).split(".")[0] + module_path = os.path.join(framework, "Modules") + if not os.path.exists(module_path): + os.mkdir(module_path) + module_template = ( + "framework module %s {\n" + ' umbrella header "%s.h"\n' + "\n" + " export *\n" + " module * { export * }\n" + "}\n" % (binary, binary) + ) + + with open(os.path.join(module_path, "module.modulemap"), "w") as module_file: + module_file.write(module_template) + + def ExecPackageFramework(self, framework, version): + """Takes a path to Something.framework and the Current version of that and + sets up all the symlinks.""" + # Find the name of the binary based on the part before the ".framework". + binary = os.path.basename(framework).split(".")[0] + + CURRENT = "Current" + RESOURCES = "Resources" + VERSIONS = "Versions" + + if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): + # Binary-less frameworks don't seem to contain symlinks (see e.g. + # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). + return + + # Move into the framework directory to set the symlinks correctly. + pwd = os.getcwd() + os.chdir(framework) + + # Set up the Current version. + self._Relink(version, os.path.join(VERSIONS, CURRENT)) + + # Set up the root symlinks. + self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) + self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) + + # Back to where we were before! + os.chdir(pwd) + + def _Relink(self, dest, link): + """Creates a symlink to |dest| named |link|. If |link| already exists, + it is overwritten.""" + if os.path.lexists(link): + os.remove(link) + os.symlink(dest, link) + + def ExecCompileIosFrameworkHeaderMap(self, out, framework, *all_headers): + framework_name = os.path.basename(framework).split(".")[0] + all_headers = [os.path.abspath(header) for header in all_headers] + filelist = {} + for header in all_headers: + filename = os.path.basename(header) + filelist[filename] = header + filelist[os.path.join(framework_name, filename)] = header + WriteHmap(out, filelist) + + def ExecCopyIosFrameworkHeaders(self, framework, *copy_headers): + header_path = os.path.join(framework, "Headers") + if not os.path.exists(header_path): + os.makedirs(header_path) + for header in copy_headers: + shutil.copy(header, os.path.join(header_path, os.path.basename(header))) + + def ExecCompileXcassets(self, keys, *inputs): + """Compiles multiple .xcassets files into a single .car file. + + This invokes 'actool' to compile all the inputs .xcassets files. The + |keys| arguments is a json-encoded dictionary of extra arguments to + pass to 'actool' when the asset catalogs contains an application icon + or a launch image. + + Note that 'actool' does not create the Assets.car file if the asset + catalogs does not contains imageset. + """ + command_line = [ + "xcrun", + "actool", + "--output-format", + "human-readable-text", + "--compress-pngs", + "--notices", + "--warnings", + "--errors", + ] + is_iphone_target = "IPHONEOS_DEPLOYMENT_TARGET" in os.environ + if is_iphone_target: + platform = os.environ["CONFIGURATION"].split("-")[-1] + if platform not in ("iphoneos", "iphonesimulator"): + platform = "iphonesimulator" + command_line.extend( + [ + "--platform", + platform, + "--target-device", + "iphone", + "--target-device", + "ipad", + "--minimum-deployment-target", + os.environ["IPHONEOS_DEPLOYMENT_TARGET"], + "--compile", + os.path.abspath(os.environ["CONTENTS_FOLDER_PATH"]), + ] + ) + else: + command_line.extend( + [ + "--platform", + "macosx", + "--target-device", + "mac", + "--minimum-deployment-target", + os.environ["MACOSX_DEPLOYMENT_TARGET"], + "--compile", + os.path.abspath(os.environ["UNLOCALIZED_RESOURCES_FOLDER_PATH"]), + ] + ) + if keys: + keys = json.loads(keys) + for key, value in keys.items(): + arg_name = "--" + key + if isinstance(value, bool): + if value: + command_line.append(arg_name) + elif isinstance(value, list): + for v in value: + command_line.append(arg_name) + command_line.append(str(v)) + else: + command_line.append(arg_name) + command_line.append(str(value)) + # Note: actool crashes if inputs path are relative, so use os.path.abspath + # to get absolute path name for inputs. + command_line.extend(map(os.path.abspath, inputs)) + subprocess.check_call(command_line) + + def ExecMergeInfoPlist(self, output, *inputs): + """Merge multiple .plist files into a single .plist file.""" + merged_plist = {} + for path in inputs: + plist = self._LoadPlistMaybeBinary(path) + self._MergePlist(merged_plist, plist) + plistlib.writePlist(merged_plist, output) + + def ExecCodeSignBundle(self, key, entitlements, provisioning, path, preserve): + """Code sign a bundle. + + This function tries to code sign an iOS bundle, following the same + algorithm as Xcode: + 1. pick the provisioning profile that best match the bundle identifier, + and copy it into the bundle as embedded.mobileprovision, + 2. copy Entitlements.plist from user or SDK next to the bundle, + 3. code sign the bundle. + """ + substitutions, overrides = self._InstallProvisioningProfile( + provisioning, self._GetCFBundleIdentifier() + ) + entitlements_path = self._InstallEntitlements( + entitlements, substitutions, overrides + ) + + args = ["codesign", "--force", "--sign", key] + if preserve == "True": + args.extend(["--deep", "--preserve-metadata=identifier,entitlements"]) + else: + args.extend(["--entitlements", entitlements_path]) + args.extend(["--timestamp=none", path]) + subprocess.check_call(args) + + def _InstallProvisioningProfile(self, profile, bundle_identifier): + """Installs embedded.mobileprovision into the bundle. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple containing two dictionary: variables substitutions and values + to overrides when generating the entitlements file. + """ + source_path, provisioning_data, team_id = self._FindProvisioningProfile( + profile, bundle_identifier + ) + target_path = os.path.join( + os.environ["BUILT_PRODUCTS_DIR"], + os.environ["CONTENTS_FOLDER_PATH"], + "embedded.mobileprovision", + ) + shutil.copy2(source_path, target_path) + substitutions = self._GetSubstitutions(bundle_identifier, team_id + ".") + return substitutions, provisioning_data["Entitlements"] + + def _FindProvisioningProfile(self, profile, bundle_identifier): + """Finds the .mobileprovision file to use for signing the bundle. + + Checks all the installed provisioning profiles (or if the user specified + the PROVISIONING_PROFILE variable, only consult it) and select the most + specific that correspond to the bundle identifier. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple of the path to the selected provisioning profile, the data of + the embedded plist in the provisioning profile and the team identifier + to use for code signing. + + Raises: + SystemExit: if no .mobileprovision can be used to sign the bundle. + """ + profiles_dir = os.path.join( + os.environ["HOME"], "Library", "MobileDevice", "Provisioning Profiles" + ) + if not os.path.isdir(profiles_dir): + print( + "cannot find mobile provisioning for %s" % (bundle_identifier), + file=sys.stderr, + ) + sys.exit(1) + provisioning_profiles = None + if profile: + profile_path = os.path.join(profiles_dir, profile + ".mobileprovision") + if os.path.exists(profile_path): + provisioning_profiles = [profile_path] + if not provisioning_profiles: + provisioning_profiles = glob.glob( + os.path.join(profiles_dir, "*.mobileprovision") + ) + valid_provisioning_profiles = {} + for profile_path in provisioning_profiles: + profile_data = self._LoadProvisioningProfile(profile_path) + app_id_pattern = profile_data.get("Entitlements", {}).get( + "application-identifier", "" + ) + for team_identifier in profile_data.get("TeamIdentifier", []): + app_id = f"{team_identifier}.{bundle_identifier}" + if fnmatch.fnmatch(app_id, app_id_pattern): + valid_provisioning_profiles[app_id_pattern] = ( + profile_path, + profile_data, + team_identifier, + ) + if not valid_provisioning_profiles: + print( + "cannot find mobile provisioning for %s" % (bundle_identifier), + file=sys.stderr, + ) + sys.exit(1) + # If the user has multiple provisioning profiles installed that can be + # used for ${bundle_identifier}, pick the most specific one (ie. the + # provisioning profile whose pattern is the longest). + selected_key = max(valid_provisioning_profiles, key=lambda v: len(v)) + return valid_provisioning_profiles[selected_key] + + def _LoadProvisioningProfile(self, profile_path): + """Extracts the plist embedded in a provisioning profile. + + Args: + profile_path: string, path to the .mobileprovision file + + Returns: + Content of the plist embedded in the provisioning profile as a dictionary. + """ + with tempfile.NamedTemporaryFile() as temp: + subprocess.check_call( + ["security", "cms", "-D", "-i", profile_path, "-o", temp.name] + ) + return self._LoadPlistMaybeBinary(temp.name) + + def _MergePlist(self, merged_plist, plist): + """Merge |plist| into |merged_plist|.""" + for key, value in plist.items(): + if isinstance(value, dict): + merged_value = merged_plist.get(key, {}) + if isinstance(merged_value, dict): + self._MergePlist(merged_value, value) + merged_plist[key] = merged_value + else: + merged_plist[key] = value + else: + merged_plist[key] = value + + def _LoadPlistMaybeBinary(self, plist_path): + """Loads into a memory a plist possibly encoded in binary format. + + This is a wrapper around plistlib.readPlist that tries to convert the + plist to the XML format if it can't be parsed (assuming that it is in + the binary format). + + Args: + plist_path: string, path to a plist file, in XML or binary format + + Returns: + Content of the plist as a dictionary. + """ + try: + # First, try to read the file using plistlib that only supports XML, + # and if an exception is raised, convert a temporary copy to XML and + # load that copy. + return plistlib.readPlist(plist_path) + except Exception: + pass + with tempfile.NamedTemporaryFile() as temp: + shutil.copy2(plist_path, temp.name) + subprocess.check_call(["plutil", "-convert", "xml1", temp.name]) + return plistlib.readPlist(temp.name) + + def _GetSubstitutions(self, bundle_identifier, app_identifier_prefix): + """Constructs a dictionary of variable substitutions for Entitlements.plist. + + Args: + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + app_identifier_prefix: string, value for AppIdentifierPrefix + + Returns: + Dictionary of substitutions to apply when generating Entitlements.plist. + """ + return { + "CFBundleIdentifier": bundle_identifier, + "AppIdentifierPrefix": app_identifier_prefix, + } + + def _GetCFBundleIdentifier(self): + """Extracts CFBundleIdentifier value from Info.plist in the bundle. + + Returns: + Value of CFBundleIdentifier in the Info.plist located in the bundle. + """ + info_plist_path = os.path.join( + os.environ["TARGET_BUILD_DIR"], os.environ["INFOPLIST_PATH"] + ) + info_plist_data = self._LoadPlistMaybeBinary(info_plist_path) + return info_plist_data["CFBundleIdentifier"] + + def _InstallEntitlements(self, entitlements, substitutions, overrides): + """Generates and install the ${BundleName}.xcent entitlements file. + + Expands variables "$(variable)" pattern in the source entitlements file, + add extra entitlements defined in the .mobileprovision file and the copy + the generated plist to "${BundlePath}.xcent". + + Args: + entitlements: string, optional, path to the Entitlements.plist template + to use, defaults to "${SDKROOT}/Entitlements.plist" + substitutions: dictionary, variable substitutions + overrides: dictionary, values to add to the entitlements + + Returns: + Path to the generated entitlements file. + """ + source_path = entitlements + target_path = os.path.join( + os.environ["BUILT_PRODUCTS_DIR"], os.environ["PRODUCT_NAME"] + ".xcent" + ) + if not source_path: + source_path = os.path.join(os.environ["SDKROOT"], "Entitlements.plist") + shutil.copy2(source_path, target_path) + data = self._LoadPlistMaybeBinary(target_path) + data = self._ExpandVariables(data, substitutions) + if overrides: + for key in overrides: + if key not in data: + data[key] = overrides[key] + plistlib.writePlist(data, target_path) + return target_path + + def _ExpandVariables(self, data, substitutions): + """Expands variables "$(variable)" in data. + + Args: + data: object, can be either string, list or dictionary + substitutions: dictionary, variable substitutions to perform + + Returns: + Copy of data where each references to "$(variable)" has been replaced + by the corresponding value found in substitutions, or left intact if + the key was not found. + """ + if isinstance(data, str): + for key, value in substitutions.items(): + data = data.replace("$(%s)" % key, value) + return data + if isinstance(data, list): + return [self._ExpandVariables(v, substitutions) for v in data] + if isinstance(data, dict): + return {k: self._ExpandVariables(data[k], substitutions) for k in data} + return data + + +def NextGreaterPowerOf2(x): + return 2 ** (x).bit_length() + + +def WriteHmap(output_name, filelist): + """Generates a header map based on |filelist|. + + Per Mark Mentovai: + A header map is structured essentially as a hash table, keyed by names used + in #includes, and providing pathnames to the actual files. + + The implementation below and the comment above comes from inspecting: + http://www.opensource.apple.com/source/distcc/distcc-2503/distcc_dist/include_server/headermap.py?txt + while also looking at the implementation in clang in: + https://llvm.org/svn/llvm-project/cfe/trunk/lib/Lex/HeaderMap.cpp + """ + magic = 1751998832 + version = 1 + _reserved = 0 + count = len(filelist) + capacity = NextGreaterPowerOf2(count) + strings_offset = 24 + (12 * capacity) + max_value_length = max(len(value) for value in filelist.values()) + + out = open(output_name, "wb") + out.write( + struct.pack( + " bazel.gpg + sudo mv bazel.gpg /etc/apt/trusted.gpg.d/ + echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list + sudo apt-get update + sudo apt-get install bazel + bazel --version + - name: Test + run: bazel test -s --verbose_failures //... diff --git a/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_cmake.yml b/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_cmake.yml new file mode 100644 index 00000000..90ccc800 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_cmake.yml @@ -0,0 +1,31 @@ +name: amd64 Linux CMake + +on: + push: + pull_request: + schedule: + # min hours day(month) month day(week) + - cron: '0 0 7,22 * *' + +jobs: + # Building using the github runner environement directly. + make: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Env + run: make --directory=cmake/ci amd64_env + - name: Devel + run: make --directory=cmake/ci amd64_devel + - name: Build + run: make --directory=cmake/ci amd64_build + - name: Test + run: make --directory=cmake/ci amd64_test + - name: Install Env + run: make --directory=cmake/ci amd64_install_env + - name: Install Devel + run: make --directory=cmake/ci amd64_install_devel + - name: Install Build + run: make --directory=cmake/ci amd64_install_build + - name: Install Test + run: make --directory=cmake/ci amd64_install_test diff --git a/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_macos_cmake.yml b/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_macos_cmake.yml new file mode 100644 index 00000000..37565004 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_macos_cmake.yml @@ -0,0 +1,43 @@ +name: amd64 MacOS CMake + +on: + push: + pull_request: + schedule: + # min hours day(month) month day(week) + - cron: '0 0 7,22 * *' + +jobs: + # Building using the github runner environement directly. + xcode: + runs-on: macos-latest + env: + CTEST_OUTPUT_ON_FAILURE: 1 + steps: + - uses: actions/checkout@v2 + - name: Check cmake + run: cmake --version + - name: Configure + run: cmake -S. -Bbuild -G "Xcode" -DCMAKE_CONFIGURATION_TYPES=Release + - name: Build + run: cmake --build build --config Release --target ALL_BUILD -v + - name: Test + run: cmake --build build --config Release --target RUN_TESTS -v + - name: Install + run: cmake --build build --config Release --target install -v + make: + runs-on: macos-latest + env: + CTEST_OUTPUT_ON_FAILURE: 1 + steps: + - uses: actions/checkout@v2 + - name: Check cmake + run: cmake --version + - name: Configure + run: cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release + - name: Build + run: cmake --build build --target all -v + - name: Test + run: cmake --build build --target test -v + - name: Install + run: cmake --build build --target install -v diff --git a/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_windows_cmake.yml b/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_windows_cmake.yml new file mode 100644 index 00000000..7118533e --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_windows_cmake.yml @@ -0,0 +1,25 @@ +name: amd64 Windows CMake + +on: + push: + pull_request: + schedule: + # min hours day(month) month day(week) + - cron: '0 0 7,22 * *' + +jobs: + # Building using the github runner environement directly. + msvc: + runs-on: windows-latest + env: + CTEST_OUTPUT_ON_FAILURE: 1 + steps: + - uses: actions/checkout@v2 + - name: Configure + run: cmake -S. -Bbuild -G "Visual Studio 17 2022" -DCMAKE_CONFIGURATION_TYPES=Release + - name: Build + run: cmake --build build --config Release --target ALL_BUILD -- /maxcpucount + - name: Test + run: cmake --build build --config Release --target RUN_TESTS -- /maxcpucount + - name: Install + run: cmake --build build --config Release --target INSTALL -- /maxcpucount diff --git a/node_modules/cpu-features/deps/cpu_features/.github/workflows/arm_linux_cmake.yml b/node_modules/cpu-features/deps/cpu_features/.github/workflows/arm_linux_cmake.yml new file mode 100644 index 00000000..87bb6bb1 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.github/workflows/arm_linux_cmake.yml @@ -0,0 +1,31 @@ +name: ARM Linux CMake + +on: + push: + pull_request: + schedule: + # min hours day(month) month day(week) + - cron: '0 0 7,22 * *' + +jobs: + # Building using the github runner environement directly. + make: + runs-on: ubuntu-latest + strategy: + matrix: + targets: [ + [arm-linux-gnueabihf], + [armv8l-linux-gnueabihf], + [arm-linux-gnueabi], + [armeb-linux-gnueabihf], + [armeb-linux-gnueabi] + ] + fail-fast: false + env: + TARGET: ${{ matrix.targets[0] }} + steps: + - uses: actions/checkout@v2 + - name: Build + run: make --directory=cmake/ci ${TARGET}_build + - name: Test + run: make --directory=cmake/ci ${TARGET}_test diff --git a/node_modules/cpu-features/deps/cpu_features/.github/workflows/clang_format.yml b/node_modules/cpu-features/deps/cpu_features/.github/workflows/clang_format.yml new file mode 100644 index 00000000..1afd391a --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.github/workflows/clang_format.yml @@ -0,0 +1,24 @@ +name: clang-format Check + +on: [push, pull_request] + +jobs: + # Building using the github runner environement directly. + clang-format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Fetch origin/main + run: git fetch origin main + - name: List of changed file(s) + run: git diff --name-only FETCH_HEAD + + - name: Build clang-format docker + run: cd .github/workflows && docker build --tag=linter . + - name: Check clang-format + run: docker run --rm --init -v $(pwd):/repo linter:latest clang-format --version + - name: clang-format help + run: docker run --rm --init -v $(pwd):/repo linter:latest clang-format --help + + - name: Check current commit + run: docker run --rm --init -v $(pwd):/repo -w /repo linter:latest sh -c "git diff --diff-filter=d --name-only FETCH_HEAD | grep '\.c$\|\.h$\|\.cc$' | xargs clang-format --style=file --dry-run --Werror " diff --git a/node_modules/cpu-features/deps/cpu_features/.github/workflows/mips_linux_cmake.yml b/node_modules/cpu-features/deps/cpu_features/.github/workflows/mips_linux_cmake.yml new file mode 100644 index 00000000..9ce7901d --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.github/workflows/mips_linux_cmake.yml @@ -0,0 +1,30 @@ +name: MIPS Linux CMake + +on: + push: + pull_request: + schedule: + # min hours day(month) month day(week) + - cron: '0 0 7,22 * *' + +jobs: + # Building using the github runner environement directly. + make: + runs-on: ubuntu-latest + strategy: + matrix: + targets: [ + [mips32], + [mips32el], + [mips64], + [mips64el] + ] + fail-fast: false + env: + TARGET: ${{ matrix.targets[0] }} + steps: + - uses: actions/checkout@v2 + - name: Build + run: make --directory=cmake/ci ${TARGET}_build + - name: Test + run: make --directory=cmake/ci ${TARGET}_test diff --git a/node_modules/cpu-features/deps/cpu_features/.github/workflows/power_linux_cmake.yml b/node_modules/cpu-features/deps/cpu_features/.github/workflows/power_linux_cmake.yml new file mode 100644 index 00000000..bc890e2e --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.github/workflows/power_linux_cmake.yml @@ -0,0 +1,29 @@ +name: POWER Linux CMake + +on: + push: + pull_request: + schedule: + # min hours day(month) month day(week) + - cron: '0 0 7,22 * *' + +jobs: + # Building using the github runner environement directly. + make: + runs-on: ubuntu-latest + strategy: + matrix: + targets: [ + [ppc], + [ppc64], + [ppc64le], + ] + fail-fast: false + env: + TARGET: ${{ matrix.targets[0] }} + steps: + - uses: actions/checkout@v2 + - name: Build + run: make --directory=cmake/ci ${TARGET}_build + - name: Test + run: make --directory=cmake/ci ${TARGET}_test diff --git a/node_modules/cpu-features/deps/cpu_features/.github/workflows/riscv_linux_cmake.yml b/node_modules/cpu-features/deps/cpu_features/.github/workflows/riscv_linux_cmake.yml new file mode 100644 index 00000000..ef7586ab --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.github/workflows/riscv_linux_cmake.yml @@ -0,0 +1,28 @@ +name: RISCV Linux CMake + +on: + push: + pull_request: + schedule: + # min hours day(month) month day(week) + - cron: '0 0 7,22 * *' + +jobs: + # Building using the github runner environement directly. + make: + runs-on: ubuntu-latest + strategy: + matrix: + targets: [ + [riscv32], + [riscv64], + ] + fail-fast: false + env: + TARGET: ${{ matrix.targets[0] }} + steps: + - uses: actions/checkout@v2 + - name: Build + run: make --directory=cmake/ci ${TARGET}_build + - name: Test + run: make --directory=cmake/ci ${TARGET}_test diff --git a/node_modules/cpu-features/deps/cpu_features/.github/workflows/s390x_linux_cmake.yml b/node_modules/cpu-features/deps/cpu_features/.github/workflows/s390x_linux_cmake.yml new file mode 100644 index 00000000..5be96a1f --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.github/workflows/s390x_linux_cmake.yml @@ -0,0 +1,27 @@ +name: s390x Linux CMake + +on: + push: + pull_request: + schedule: + # min hours day(month) month day(week) + - cron: '0 0 7,22 * *' + +jobs: + # Building using the github runner environement directly. + make: + runs-on: ubuntu-latest + strategy: + matrix: + targets: [ + [s390x], + ] + fail-fast: false + env: + TARGET: ${{ matrix.targets[0] }} + steps: + - uses: actions/checkout@v2 + - name: Build + run: make --directory=cmake/ci ${TARGET}_build + - name: Test + run: make --directory=cmake/ci ${TARGET}_test diff --git a/node_modules/cpu-features/deps/cpu_features/.grenrc.yml b/node_modules/cpu-features/deps/cpu_features/.grenrc.yml new file mode 100644 index 00000000..77dd7553 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.grenrc.yml @@ -0,0 +1,21 @@ +--- + dataSource: "prs" + ignoreLabels: + - "Apple M1" + - "duplicate" + - "help wanted" + - "invalid" + - "question" + - "wontfix" + onlyMilestones: false + groupBy: + "API Change": + - "API Change" + "New features / Enhancements": + - "enhancement" + - "internal" + "Bug Fixes": + - "bug" + "Misc": + - "misc" + changelogFilename: "CHANGELOG.md" diff --git a/node_modules/cpu-features/deps/cpu_features/.npmignore b/node_modules/cpu-features/deps/cpu_features/.npmignore new file mode 100644 index 00000000..f918154b --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/.npmignore @@ -0,0 +1,19 @@ +# Build folders +build/ +cmake_build/ +build_cross/ +cmake-build-*/ +out/ + +# IDEs / CI temp files +.idea/ +.vagrant/ +.vscode/ +.vs/ +*.swp + +# Bazel artifacts +**/bazel-* + +# Per-user bazelrc files +user.bazelrc diff --git a/node_modules/cpu-features/deps/cpu_features/BUILD.bazel b/node_modules/cpu-features/deps/cpu_features/BUILD.bazel new file mode 100644 index 00000000..116ef6ac --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/BUILD.bazel @@ -0,0 +1,329 @@ +# cpu_features, a cross platform C99 library to get cpu features at runtime. + +load("@bazel_skylib//lib:selects.bzl", "selects") +load("//:bazel/platforms.bzl", "PLATFORM_CPU_ARM", "PLATFORM_CPU_ARM64", "PLATFORM_CPU_MIPS", "PLATFORM_CPU_PPC", "PLATFORM_CPU_X86_64") + +package( + default_visibility = ["//visibility:public"], + licenses = ["notice"], +) + +exports_files(["LICENSE"]) + +INCLUDES = ["include"] + +C99_FLAGS = [ + "-std=c99", + "-Wall", + "-Wextra", + "-Wmissing-declarations", + "-Wmissing-prototypes", + "-Wno-implicit-fallthrough", + "-Wno-unused-function", + "-Wold-style-definition", + "-Wshadow", + "-Wsign-compare", + "-Wstrict-prototypes", +] + +cc_library( + name = "cpu_features_macros", + copts = C99_FLAGS, + includes = INCLUDES, + textual_hdrs = ["include/cpu_features_macros.h"], +) + +cc_library( + name = "cpu_features_cache_info", + copts = C99_FLAGS, + includes = INCLUDES, + textual_hdrs = ["include/cpu_features_cache_info.h"], + deps = [":cpu_features_macros"], +) + +cc_library( + name = "bit_utils", + copts = C99_FLAGS, + includes = INCLUDES, + textual_hdrs = ["include/internal/bit_utils.h"], + deps = [":cpu_features_macros"], +) + +cc_test( + name = "bit_utils_test", + srcs = ["test/bit_utils_test.cc"], + includes = INCLUDES, + deps = [ + ":bit_utils", + "@com_google_googletest//:gtest_main", + ], +) + +cc_library( + name = "memory_utils", + copts = C99_FLAGS, + includes = INCLUDES, + textual_hdrs = [ + "src/copy.inl", + "src/equals.inl", + ], +) + +cc_library( + name = "string_view", + srcs = [ + "src/string_view.c", + ], + copts = C99_FLAGS, + includes = INCLUDES, + textual_hdrs = ["include/internal/string_view.h"], + deps = [ + ":cpu_features_macros", + ":memory_utils", + ], +) + +cc_test( + name = "string_view_test", + srcs = ["test/string_view_test.cc"], + includes = INCLUDES, + deps = [ + ":string_view", + "@com_google_googletest//:gtest_main", + ], +) + +cc_library( + name = "filesystem", + srcs = ["src/filesystem.c"], + copts = C99_FLAGS, + includes = INCLUDES, + textual_hdrs = ["include/internal/filesystem.h"], + deps = [":cpu_features_macros"], +) + +cc_library( + name = "filesystem_for_testing", + testonly = 1, + srcs = [ + "src/filesystem.c", + "test/filesystem_for_testing.cc", + ], + hdrs = [ + "include/internal/filesystem.h", + "test/filesystem_for_testing.h", + ], + defines = ["CPU_FEATURES_MOCK_FILESYSTEM"], + includes = INCLUDES, + deps = [ + ":cpu_features_macros", + ], +) + +cc_library( + name = "stack_line_reader", + srcs = ["src/stack_line_reader.c"], + copts = C99_FLAGS, + defines = ["STACK_LINE_READER_BUFFER_SIZE=1024"], + includes = INCLUDES, + textual_hdrs = ["include/internal/stack_line_reader.h"], + deps = [ + ":cpu_features_macros", + ":filesystem", + ":string_view", + ], +) + +cc_test( + name = "stack_line_reader_test", + srcs = [ + "include/internal/stack_line_reader.h", + "src/stack_line_reader.c", + "test/stack_line_reader_test.cc", + ], + defines = ["STACK_LINE_READER_BUFFER_SIZE=16"], + includes = INCLUDES, + deps = [ + ":cpu_features_macros", + ":filesystem_for_testing", + ":string_view", + "@com_google_googletest//:gtest_main", + ], +) + +cc_library( + name = "stack_line_reader_to_use_with_filesystem_for_testing", + testonly = 1, + srcs = ["src/stack_line_reader.c"], + hdrs = ["include/internal/stack_line_reader.h"], + copts = C99_FLAGS, + defines = ["STACK_LINE_READER_BUFFER_SIZE=1024"], + includes = INCLUDES, + deps = [ + ":cpu_features_macros", + ":filesystem_for_testing", + ":string_view", + ], +) + +cc_library( + name = "hwcaps", + srcs = ["src/hwcaps.c"], + copts = C99_FLAGS, + defines = ["HAVE_STRONG_GETAUXVAL"], + includes = INCLUDES, + textual_hdrs = ["include/internal/hwcaps.h"], + deps = [ + ":cpu_features_macros", + ":filesystem", + ":string_view", + ], +) + +cc_library( + name = "hwcaps_for_testing", + testonly = 1, + srcs = [ + "src/hwcaps.c", + "test/hwcaps_for_testing.cc", + ], + hdrs = [ + "include/internal/hwcaps.h", + "test/hwcaps_for_testing.h", + ], + defines = [ + "CPU_FEATURES_MOCK_GET_ELF_HWCAP_FROM_GETAUXVAL", + "CPU_FEATURES_TEST", + ], + includes = INCLUDES, + deps = [ + ":cpu_features_macros", + ":filesystem_for_testing", + ":string_view", + ], +) + +cc_library( + name = "cpuinfo", + srcs = selects.with_or({ + PLATFORM_CPU_X86_64: [ + "src/impl_x86_freebsd.c", + "src/impl_x86_linux_or_android.c", + "src/impl_x86_macos.c", + "src/impl_x86_windows.c", + ], + PLATFORM_CPU_ARM: ["src/impl_arm_linux_or_android.c"], + PLATFORM_CPU_ARM64: ["src/impl_aarch64_linux_or_android.c"], + PLATFORM_CPU_MIPS: ["src/impl_mips_linux_or_android.c"], + PLATFORM_CPU_PPC: ["src/impl_ppc_linux.c"], + }), + copts = C99_FLAGS, + includes = INCLUDES, + textual_hdrs = selects.with_or({ + PLATFORM_CPU_X86_64: [ + "src/impl_x86__base_implementation.inl", + "include/cpuinfo_x86.h", + "include/internal/cpuid_x86.h", + "include/internal/windows_utils.h", + ], + PLATFORM_CPU_ARM: ["include/cpuinfo_arm.h"], + PLATFORM_CPU_ARM64: ["include/cpuinfo_aarch64.h"], + PLATFORM_CPU_MIPS: ["include/cpuinfo_mips.h"], + PLATFORM_CPU_PPC: ["include/cpuinfo_ppc.h"], + }) + [ + "src/define_introspection.inl", + "src/define_introspection_and_hwcaps.inl", + ], + deps = [ + ":bit_utils", + ":cpu_features_cache_info", + ":cpu_features_macros", + ":filesystem", + ":hwcaps", + ":memory_utils", + ":stack_line_reader", + ":string_view", + ], +) + +cc_library( + name = "cpuinfo_for_testing", + testonly = 1, + srcs = selects.with_or({ + PLATFORM_CPU_X86_64: [ + "src/impl_x86_freebsd.c", + "src/impl_x86_linux_or_android.c", + "src/impl_x86_macos.c", + "src/impl_x86_windows.c", + ], + PLATFORM_CPU_ARM: ["src/impl_arm_linux_or_android.c"], + PLATFORM_CPU_ARM64: ["src/impl_aarch64_linux_or_android.c"], + PLATFORM_CPU_MIPS: ["src/impl_mips_linux_or_android.c"], + PLATFORM_CPU_PPC: ["src/impl_ppc_linux.c"], + }), + hdrs = selects.with_or({ + PLATFORM_CPU_X86_64: [ + "include/cpuinfo_x86.h", + "include/internal/cpuid_x86.h", + "include/internal/windows_utils.h", + ], + PLATFORM_CPU_ARM: ["include/cpuinfo_arm.h"], + PLATFORM_CPU_ARM64: ["include/cpuinfo_aarch64.h"], + PLATFORM_CPU_MIPS: ["include/cpuinfo_mips.h"], + PLATFORM_CPU_PPC: ["include/cpuinfo_ppc.h"], + }), + copts = C99_FLAGS, + defines = selects.with_or({ + PLATFORM_CPU_X86_64: ["CPU_FEATURES_MOCK_CPUID_X86"], + "//conditions:default": [], + }), + includes = INCLUDES, + textual_hdrs = selects.with_or({ + PLATFORM_CPU_X86_64: ["src/impl_x86__base_implementation.inl"], + "//conditions:default": [], + }) + [ + "src/define_introspection.inl", + "src/define_introspection_and_hwcaps.inl", + ], + deps = [ + ":bit_utils", + ":cpu_features_cache_info", + ":cpu_features_macros", + ":filesystem_for_testing", + ":hwcaps_for_testing", + ":memory_utils", + ":stack_line_reader_to_use_with_filesystem_for_testing", + ":string_view", + ], +) + +cc_test( + name = "cpuinfo_test", + srcs = selects.with_or({ + PLATFORM_CPU_ARM64: ["test/cpuinfo_aarch64_test.cc"], + PLATFORM_CPU_ARM: ["test/cpuinfo_arm_test.cc"], + PLATFORM_CPU_MIPS: ["test/cpuinfo_mips_test.cc"], + PLATFORM_CPU_PPC: ["test/cpuinfo_ppc_test.cc"], + PLATFORM_CPU_X86_64: ["test/cpuinfo_x86_test.cc"], + }), + includes = INCLUDES, + deps = [ + ":cpuinfo_for_testing", + ":filesystem_for_testing", + ":hwcaps_for_testing", + ":string_view", + "@com_google_googletest//:gtest_main", + ], +) + +cc_binary( + name = "list_cpu_features", + srcs = ["src/utils/list_cpu_features.c"], + copts = C99_FLAGS, + includes = INCLUDES, + deps = [ + ":bit_utils", + ":cpu_features_macros", + ":cpuinfo", + ], +) diff --git a/node_modules/cpu-features/deps/cpu_features/CMakeLists.txt b/node_modules/cpu-features/deps/cpu_features/CMakeLists.txt new file mode 100644 index 00000000..7a4f6414 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/CMakeLists.txt @@ -0,0 +1,261 @@ +cmake_minimum_required(VERSION 3.19.2) + +# option() honors normal variables. +# see: https://cmake.org/cmake/help/git-stage/policy/CMP0077.html +if(POLICY CMP0077) + cmake_policy(SET CMP0077 NEW) +endif() + +project(CpuFeatures VERSION 0.8.0 LANGUAGES C) + +set(CMAKE_C_STANDARD 99) + +# Default Build Type to be Release +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." + FORCE) +endif(NOT CMAKE_BUILD_TYPE) + +# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make +# it prominent in the GUI. +# cpu_features uses bit-fields which are - to some extends - implementation-defined (see https://en.cppreference.com/w/c/language/bit_field). +# As a consequence it is discouraged to use cpu_features as a shared library because different compilers may interpret the code in different ways. +# Prefer static linking from source whenever possible. +option(BUILD_SHARED_LIBS "Build library as shared." OFF) + +# Force PIC on unix when building shared libs +# see: https://en.wikipedia.org/wiki/Position-independent_code +if(BUILD_SHARED_LIBS AND UNIX) + option(CMAKE_POSITION_INDEPENDENT_CODE "Build with Position Independant Code." ON) +endif() + +include(CheckIncludeFile) +include(CheckSymbolExists) +include(GNUInstallDirs) + +macro(setup_include_and_definitions TARGET_NAME) + target_include_directories(${TARGET_NAME} + PUBLIC $ + PRIVATE $ + ) + target_compile_definitions(${TARGET_NAME} + PUBLIC STACK_LINE_READER_BUFFER_SIZE=1024 + ) +endmacro() + +set(PROCESSOR_IS_MIPS FALSE) +set(PROCESSOR_IS_ARM FALSE) +set(PROCESSOR_IS_AARCH64 FALSE) +set(PROCESSOR_IS_X86 FALSE) +set(PROCESSOR_IS_POWER FALSE) +set(PROCESSOR_IS_S390X FALSE) +set(PROCESSOR_IS_RISCV FALSE) + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") + set(PROCESSOR_IS_MIPS TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)") + set(PROCESSOR_IS_AARCH64 TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") + set(PROCESSOR_IS_ARM TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)") + set(PROCESSOR_IS_X86 TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") + set(PROCESSOR_IS_POWER TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x)") + set(PROCESSOR_IS_S390X TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^riscv") + set(PROCESSOR_IS_RISCV TRUE) +endif() + +macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_macros.h) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_cache_info.h) + file(GLOB IMPL_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/impl_*.c") + list(APPEND ${SRCS_LIST_NAME} ${IMPL_SOURCES}) + if(PROCESSOR_IS_MIPS) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_mips.h) + elseif(PROCESSOR_IS_ARM) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_arm.h) + elseif(PROCESSOR_IS_AARCH64) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_aarch64.h) + list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/windows_utils.h) + elseif(PROCESSOR_IS_X86) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_x86.h) + list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/cpuid_x86.h) + list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/windows_utils.h) + elseif(PROCESSOR_IS_POWER) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_ppc.h) + elseif(PROCESSOR_IS_S390X) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_s390x.h) + elseif(PROCESSOR_IS_RISCV) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_riscv.h) + else() + message(FATAL_ERROR "Unsupported architectures ${CMAKE_SYSTEM_PROCESSOR}") + endif() +endmacro() + +# +# library : utils +# + +add_library(utils OBJECT + ${PROJECT_SOURCE_DIR}/include/internal/bit_utils.h + ${PROJECT_SOURCE_DIR}/include/internal/filesystem.h + ${PROJECT_SOURCE_DIR}/include/internal/stack_line_reader.h + ${PROJECT_SOURCE_DIR}/include/internal/string_view.h + ${PROJECT_SOURCE_DIR}/src/filesystem.c + ${PROJECT_SOURCE_DIR}/src/stack_line_reader.c + ${PROJECT_SOURCE_DIR}/src/string_view.c +) +setup_include_and_definitions(utils) + +# +# library : unix_based_hardware_detection +# + +if(UNIX) + add_library(unix_based_hardware_detection OBJECT + ${PROJECT_SOURCE_DIR}/include/internal/hwcaps.h + ${PROJECT_SOURCE_DIR}/src/hwcaps.c + ) + setup_include_and_definitions(unix_based_hardware_detection) + check_include_file(dlfcn.h HAVE_DLFCN_H) + if(HAVE_DLFCN_H) + target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_DLFCN_H) + endif() + check_symbol_exists(getauxval "sys/auxv.h" HAVE_STRONG_GETAUXVAL) + if(HAVE_STRONG_GETAUXVAL) + target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_STRONG_GETAUXVAL) + endif() +endif() + +# +# library : cpu_features +# +set (CPU_FEATURES_HDRS) +set (CPU_FEATURES_SRCS) +add_cpu_features_headers_and_sources(CPU_FEATURES_HDRS CPU_FEATURES_SRCS) +list(APPEND CPU_FEATURES_SRCS $) +if(NOT PROCESSOR_IS_X86 AND UNIX) + list(APPEND CPU_FEATURES_SRCS $) +endif() +add_library(cpu_features ${CPU_FEATURES_HDRS} ${CPU_FEATURES_SRCS}) +set_target_properties(cpu_features PROPERTIES PUBLIC_HEADER "${CPU_FEATURES_HDRS}") +setup_include_and_definitions(cpu_features) +target_link_libraries(cpu_features PUBLIC ${CMAKE_DL_LIBS}) +target_include_directories(cpu_features + PUBLIC $ +) +if(PROCESSOR_IS_X86 OR PROCESSOR_IS_AARCH64) + if(APPLE) + target_compile_definitions(cpu_features PRIVATE HAVE_SYSCTLBYNAME) + endif() +endif() +add_library(CpuFeature::cpu_features ALIAS cpu_features) + +# +# program : list_cpu_features +# + +add_executable(list_cpu_features ${PROJECT_SOURCE_DIR}/src/utils/list_cpu_features.c) +target_link_libraries(list_cpu_features PRIVATE cpu_features) +add_executable(CpuFeature::list_cpu_features ALIAS list_cpu_features) + +# +# ndk_compat +# + +if(ANDROID) +add_subdirectory(ndk_compat) +endif() + +# +# tests +# + +include(CTest) +if(BUILD_TESTING) + # Automatically incorporate googletest into the CMake Project if target not + # found. + enable_language(CXX) + + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_CXX_EXTENSIONS OFF) # prefer use of -std14 instead of -gnustd14 + + if(NOT TARGET gtest OR NOT TARGET gmock_main) + # Download and unpack googletest at configure time. + configure_file( + cmake/googletest.CMakeLists.txt.in + googletest-download/CMakeLists.txt + ) + + execute_process( + COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download) + + if(result) + message(FATAL_ERROR "CMake step for googletest failed: ${result}") + endif() + + execute_process( + COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download) + + if(result) + message(FATAL_ERROR "Build step for googletest failed: ${result}") + endif() + + # Prevent overriding the parent project's compiler/linker settings on + # Windows. + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + + # Add googletest directly to our build. This defines the gtest and + # gtest_main targets. + add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src + ${CMAKE_BINARY_DIR}/googletest-build + EXCLUDE_FROM_ALL) + endif() + + add_subdirectory(test) +endif() + +# +# Install cpu_features and list_cpu_features +# + +include(GNUInstallDirs) +install(TARGETS cpu_features list_cpu_features + EXPORT CpuFeaturesTargets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cpu_features + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} +) +install(EXPORT CpuFeaturesTargets + NAMESPACE CpuFeatures:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures + COMPONENT Devel +) +include(CMakePackageConfigHelpers) +configure_package_config_file(cmake/CpuFeaturesConfig.cmake.in + "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures" + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO +) +write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake" + COMPATIBILITY SameMajorVersion +) +install( + FILES + "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake" + "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures" + COMPONENT Devel +) diff --git a/node_modules/cpu-features/deps/cpu_features/CONTRIBUTING.md b/node_modules/cpu-features/deps/cpu_features/CONTRIBUTING.md new file mode 100644 index 00000000..c980350f --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# How to Contribute + +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. + +## Contributor License Agreement + +Contributions to this project must be accompanied by a Contributor License +Agreement. You (or your employer) retain the copyright to your contribution; +this simply gives us permission to use and redistribute your contributions as +part of the project. Head over to to see +your current agreements on file or to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted one +(even if it was for a different project), you probably don't need to do it +again. + +## Code reviews + +All submissions, including submissions by project members, require review. We +use GitHub pull requests for this purpose. Consult +[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more +information on using pull requests. diff --git a/node_modules/cpu-features/deps/cpu_features/LICENSE b/node_modules/cpu-features/deps/cpu_features/LICENSE new file mode 100644 index 00000000..a7043c6f --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/LICENSE @@ -0,0 +1,230 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +-------------------------------------------------------------------------------- +For files in the `ndk_compat` folder: +-------------------------------------------------------------------------------- + +Copyright (C) 2010 The Android Open Source Project +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/node_modules/cpu-features/deps/cpu_features/README.md b/node_modules/cpu-features/deps/cpu_features/README.md new file mode 100644 index 00000000..ee0ce70b --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/README.md @@ -0,0 +1,272 @@ +# cpu_features + +A cross-platform C library to retrieve CPU features (such as available +instructions) at runtime. + +# GitHub-CI Status + +[comment]: <> (The following lines are generated by "scripts/generate_badges.d" that you can run online https://run.dlang.io/) + +| Os | amd64 | AArch64 | ARM | MIPS | POWER | RISCV | s390x | +| :-- | --: | --: | --: | --: | --: | --: | --: | +| Linux | [![][i1a0]][l1a0]
[![][i1a1]][l1a1] | [![][i1b0]][l1b0]
![][d1] | [![][i1c0]][l1c0]
![][d1] | [![][i1d0]][l1d0]
![][d1] | [![][i1e0]][l1e0]
![][d1] | [![][i1f0]][l1f0]
![][d1] | [![][i1g0]][l1g0]
![][d1] | +| FreeBSD | [![][i2a0]][l2a0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | +| MacOS | [![][i3a0]][l3a0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | +| Windows | [![][i4a0]][l4a0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | ![][d0]
![][d1] | + +[d0]: https://img.shields.io/badge/CMake-N%2FA-lightgrey +[d1]: https://img.shields.io/badge/Bazel-N%2FA-lightgrey +[i1a0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/amd64_linux_cmake.yml?branch=main&label=CMake +[i1a1]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/amd64_linux_bazel.yml?branch=main&label=Bazel +[i1b0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/aarch64_linux_cmake.yml?branch=main&label=CMake +[i1c0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/arm_linux_cmake.yml?branch=main&label=CMake +[i1d0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/mips_linux_cmake.yml?branch=main&label=CMake +[i1e0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/power_linux_cmake.yml?branch=main&label=CMake +[i1f0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/riscv_linux_cmake.yml?branch=main&label=CMake +[i1g0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/s390x_linux_cmake.yml?branch=main&label=CMake +[i2a0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/amd64_freebsd_cmake.yml?branch=main&label=CMake +[i3a0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/amd64_macos_cmake.yml?branch=main&label=CMake +[i4a0]: https://img.shields.io/github/actions/workflow/status/google/cpu_features/amd64_windows_cmake.yml?branch=main&label=CMake +[l1a0]: https://github.com/google/cpu_features/actions/workflows/amd64_linux_cmake.yml +[l1a1]: https://github.com/google/cpu_features/actions/workflows/amd64_linux_bazel.yml +[l1b0]: https://github.com/google/cpu_features/actions/workflows/aarch64_linux_cmake.yml +[l1c0]: https://github.com/google/cpu_features/actions/workflows/arm_linux_cmake.yml +[l1d0]: https://github.com/google/cpu_features/actions/workflows/mips_linux_cmake.yml +[l1e0]: https://github.com/google/cpu_features/actions/workflows/power_linux_cmake.yml +[l1f0]: https://github.com/google/cpu_features/actions/workflows/riscv_linux_cmake.yml +[l1g0]: https://github.com/google/cpu_features/actions/workflows/s390x_linux_cmake.yml +[l2a0]: https://github.com/google/cpu_features/actions/workflows/amd64_freebsd_cmake.yml +[l3a0]: https://github.com/google/cpu_features/actions/workflows/amd64_macos_cmake.yml +[l4a0]: https://github.com/google/cpu_features/actions/workflows/amd64_windows_cmake.yml + +## Table of Contents + +- [Design Rationale](#rationale) +- [Code samples](#codesample) +- [Running sample code](#usagesample) +- [What's supported](#support) +- [Android NDK's drop in replacement](#ndk) +- [License](#license) +- [Build with cmake](#cmake) +- [Community Bindings](#bindings) + + +## Design Rationale + +- **Simple to use.** See the snippets below for examples. +- **Extensible.** Easy to add missing features or architectures. +- **Compatible with old compilers** and available on many architectures so it + can be used widely. To ensure that cpu_features works on as many platforms + as possible, we implemented it in a highly portable version of C: C99. +- **Sandbox-compatible.** The library uses a variety of strategies to cope + with sandboxed environments or when `cpuid` is unavailable. This is useful + when running integration tests in hermetic environments. +- **Thread safe, no memory allocation, and raises no exceptions.** + cpu_features is suitable for implementing fundamental libc functions like + `malloc`, `memcpy`, and `memcmp`. +- **Unit tested.** + + +## Code samples + +**Note:** For C++ code, the library functions are defined in the `cpu_features` namespace. + +### Checking features at runtime + +Here's a simple example that executes a codepath if the CPU supports both the +AES and the SSE4.2 instruction sets: + +```c +#include "cpuinfo_x86.h" + +// For C++, add `using namespace cpu_features;` +static const X86Features features = GetX86Info().features; + +void Compute(void) { + if (features.aes && features.sse4_2) { + // Run optimized code. + } else { + // Run standard code. + } +} +``` + +### Caching for faster evaluation of complex checks + +If you wish, you can read all the features at once into a global variable, and +then query for the specific features you care about. Below, we store all the ARM +features and then check whether AES and NEON are supported. + +```c +#include +#include "cpuinfo_arm.h" + +// For C++, add `using namespace cpu_features;` +static const ArmFeatures features = GetArmInfo().features; +static const bool has_aes_and_neon = features.aes && features.neon; + +// use has_aes_and_neon. +``` + +This is a good approach to take if you're checking for combinations of features +when using a compiler that is slow to extract individual bits from bit-packed +structures. + +### Checking compile time flags + +The following code determines whether the compiler was told to use the AVX +instruction set (e.g., `g++ -mavx`) and sets `has_avx` accordingly. + +```c +#include +#include "cpuinfo_x86.h" + +// For C++, add `using namespace cpu_features;` +static const X86Features features = GetX86Info().features; +static const bool has_avx = CPU_FEATURES_COMPILED_X86_AVX || features.avx; + +// use has_avx. +``` + +`CPU_FEATURES_COMPILED_X86_AVX` is set to 1 if the compiler was instructed to +use AVX and 0 otherwise, combining compile time and runtime knowledge. + +### Rejecting poor hardware implementations based on microarchitecture + +On x86, the first incarnation of a feature in a microarchitecture might not be +the most efficient (e.g. AVX on Sandy Bridge). We provide a function to retrieve +the underlying microarchitecture so you can decide whether to use it. + +Below, `has_fast_avx` is set to 1 if the CPU supports the AVX instruction +set—but only if it's not Sandy Bridge. + +```c +#include +#include "cpuinfo_x86.h" + +// For C++, add `using namespace cpu_features;` +static const X86Info info = GetX86Info(); +static const X86Microarchitecture uarch = GetX86Microarchitecture(&info); +static const bool has_fast_avx = info.features.avx && uarch != INTEL_SNB; + +// use has_fast_avx. +``` + +This feature is currently available only for x86 microarchitectures. + + +### Running sample code + +Building `cpu_features` (check [quickstart](#quickstart) below) brings a small executable to test the library. + +```shell + % ./build/list_cpu_features +arch : x86 +brand : Intel(R) Xeon(R) CPU E5-1650 0 @ 3.20GHz +family : 6 (0x06) +model : 45 (0x2D) +stepping : 7 (0x07) +uarch : INTEL_SNB +flags : aes,avx,cx16,smx,sse4_1,sse4_2,ssse3 +``` + +```shell +% ./build/list_cpu_features --json +{"arch":"x86","brand":" Intel(R) Xeon(R) CPU E5-1650 0 @ 3.20GHz","family":6,"model":45,"stepping":7,"uarch":"INTEL_SNB","flags":["aes","avx","cx16","smx","sse4_1","sse4_2","ssse3"]} +``` + + +## What's supported + +| | x86³ | AArch64 | ARM | MIPS⁴ | POWER | RISCV | s390x | +|---------|:----:|:-------:|:-------:|:-------:|:-------:|:-------:|:-------:| +| Linux | yes² | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ | +| FreeBSD | yes² | not yet | not yet | not yet | not yet | N/A | not yet | +| MacOs | yes² | not yet | N/A | N/A | no | N/A | no | +| Windows | yes² | not yet | not yet | N/A | N/A | N/A | N/A | +| Android | yes² | yes¹ | yes¹ | yes¹ | N/A | N/A | N/A | +| iOS | N/A | not yet | not yet | N/A | N/A | N/A | N/A | + +1. **Features revealed from Linux.** We gather data from several sources + depending on availability: + + from glibc's + [getauxval](https://www.gnu.org/software/libc/manual/html_node/Auxiliary-Vector.html) + + by parsing `/proc/self/auxv` + + by parsing `/proc/cpuinfo` +2. **Features revealed from CPU.** features are retrieved by using the `cpuid` + instruction. +3. **Microarchitecture detection.** On x86 some features are not always + implemented efficiently in hardware (e.g. AVX on Sandybridge). Exposing the + microarchitecture allows the client to reject particular microarchitectures. +4. All flavors of Mips are supported, little and big endian as well as 32/64 + bits. + + +## Android NDK's drop in replacement + +[cpu_features](https://github.com/google/cpu_features) is now officially +supporting Android and offers a drop in replacement of for the NDK's [cpu-features.h](https://android.googlesource.com/platform/ndk/+/main/sources/android/cpufeatures/cpu-features.h) +, see [ndk_compat](ndk_compat) folder for details. + + +## License + +The cpu_features library is licensed under the terms of the Apache license. +See [LICENSE](LICENSE) for more information. + + +## Build with CMake + +Please check the [CMake build instructions](cmake/README.md). + + +### Quickstart + +- Run `list_cpu_features` + ```sh + cmake -S. -Bbuild -DBUILD_TESTING=OFF -DCMAKE_BUILD_TYPE=Release + cmake --build build --config Release -j + ./build/list_cpu_features --json + ``` + + _Note_: Use `--target ALL_BUILD` on the second line for `Visual Studio` and `XCode`. + +- run tests + ```sh + cmake -S. -Bbuild -DBUILD_TESTING=ON -DCMAKE_BUILD_TYPE=Debug + cmake --build build --config Debug -j + cmake --build build --config Debug --target test + ``` + + _Note_: Use `--target RUN_TESTS` on the last line for `Visual Studio` and `--target RUN_TEST` for `XCode`. + + +- install `cpu_features` + ```sh + cmake --build build --config Release --target install -v + ``` + + _Note_: Use `--target INSTALL` for `Visual Studio`. + + _Note_: When using `Makefile` or `XCode` generator, you can use + [`DESTDIR`](https://www.gnu.org/software/make/manual/html_node/DESTDIR.html) + to install on a local repository.
+ e.g. + ```sh + cmake --build build --config Release --target install -v -- DESTDIR=install + ``` + + +## Community bindings + +Links provided here are not affiliated with Google but are kindly provided by the OSS Community. + + - .Net + - https://github.com/toor1245/cpu_features.NET + - Python + - https://github.com/Narasimha1997/py_cpu + - Java + - https://github.com/aecsocket/cpu-features-java + + +_Send PR to showcase your wrapper here_ diff --git a/node_modules/cpu-features/deps/cpu_features/WORKSPACE b/node_modules/cpu-features/deps/cpu_features/WORKSPACE new file mode 100644 index 00000000..c26a7725 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/WORKSPACE @@ -0,0 +1,19 @@ +workspace(name = "com_google_cpufeatures") + +load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") + +git_repository( + name = "com_google_googletest", + tag = "release-1.11.0", + remote = "https://github.com/google/googletest.git", +) + +git_repository( + name = "bazel_skylib", + tag = "1.2.0", + remote = "https://github.com/bazelbuild/bazel-skylib.git", +) + +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") + +bazel_skylib_workspace() diff --git a/node_modules/cpu-features/deps/cpu_features/bazel/ci/README.md b/node_modules/cpu-features/deps/cpu_features/bazel/ci/README.md new file mode 100644 index 00000000..c5fcde93 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/bazel/ci/README.md @@ -0,0 +1,5 @@ +## Usage +To build tests with bazel +```sh +bazel test -s --verbose_failures //... +``` diff --git a/node_modules/cpu-features/deps/cpu_features/bazel/platforms.bzl b/node_modules/cpu-features/deps/cpu_features/bazel/platforms.bzl new file mode 100644 index 00000000..5671add2 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/bazel/platforms.bzl @@ -0,0 +1,11 @@ +"""Defines global variables that lists target cpus""" + +PLATFORM_CPU_X86_64 = ("@platforms//cpu:x86_64") + +PLATFORM_CPU_ARM = ("@platforms//cpu:arm") + +PLATFORM_CPU_ARM64 = ("@platforms//cpu:arm64") + +PLATFORM_CPU_MIPS = ("@platforms//cpu:mips64") + +PLATFORM_CPU_PPC = ("@platforms//cpu:ppc") diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesConfig.cmake.in b/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesConfig.cmake.in new file mode 100644 index 00000000..e0bf10e4 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesConfig.cmake.in @@ -0,0 +1,3 @@ +# CpuFeatures CMake configuration file + +include("${CMAKE_CURRENT_LIST_DIR}/CpuFeaturesTargets.cmake") diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesNdkCompatConfig.cmake.in b/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesNdkCompatConfig.cmake.in new file mode 100644 index 00000000..5a53ffda --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesNdkCompatConfig.cmake.in @@ -0,0 +1,3 @@ +# CpuFeaturesNdkCompat CMake configuration file + +include("${CMAKE_CURRENT_LIST_DIR}/CpuFeaturesNdkCompatTargets.cmake") diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/README.md b/node_modules/cpu-features/deps/cpu_features/cmake/README.md new file mode 100644 index 00000000..de33b234 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/README.md @@ -0,0 +1,30 @@ +# CMake build instructions + +## Recommended usage : Incorporating cpu_features into a CMake project + +For API / ABI compatibility reasons, it is recommended to build and use +cpu_features in a subdirectory of your project or as an embedded dependency. + +This is similar to the recommended usage of the googletest framework +( https://github.com/google/googletest/blob/main/googletest/README.md ) + +Build and use step-by-step + + +1- Download cpu_features and copy it in a sub-directory in your project. +or add cpu_features as a git-submodule in your project + +2- You can then use the cmake command `add_subdirectory()` to include +cpu_features directly and use the `cpu_features` target in your project. + +3- Add the `CpuFeature::cpu_features` target to the `target_link_libraries()` section of +your executable or of your library. + +## Disabling tests + +CMake default options for cpu_features is `Release` built type with tests +enabled. To disable testing set cmake `BUILD_TESTING` variable to `OFF`. +e.g. +```sh +cmake -S. -Bbuild -DBUILD_TESTING=OFF +``` diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/Makefile b/node_modules/cpu-features/deps/cpu_features/cmake/ci/Makefile new file mode 100644 index 00000000..f655fc35 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/Makefile @@ -0,0 +1,252 @@ +PROJECT := cpu_features +BRANCH := $(shell git rev-parse --abbrev-ref HEAD) +SHA1 := $(shell git rev-parse --verify HEAD) + +# General commands +.PHONY: help +BOLD=\e[1m +RESET=\e[0m + +help: + @echo -e "${BOLD}SYNOPSIS${RESET}" + @echo -e "\tmake [NOCACHE=1]" + @echo + @echo -e "${BOLD}DESCRIPTION${RESET}" + @echo -e "\ttest build inside docker container to have a reproductible build." + @echo + @echo -e "${BOLD}MAKE TARGETS${RESET}" + @echo -e "\t${BOLD}help${RESET}: display this help and exit." + @echo + @echo -e "\t${BOLD}amd64_${RESET}: build docker image using an Ubuntu:latest x86_64 base image." + @echo -e "\t${BOLD}save_amd64_${RESET}: Save the docker image." + @echo -e "\t${BOLD}sh_amd64_${RESET}: run a container using the docker image (debug purpose)." + @echo -e "\t${BOLD}clean_amd64_${RESET}: Remove cache and docker image." + @echo + @echo -e "\tWith ${BOLD}${RESET}:" + @echo -e "\t\t${BOLD}env${RESET}" + @echo -e "\t\t${BOLD}devel${RESET}" + @echo -e "\t\t${BOLD}build${RESET}" + @echo -e "\t\t${BOLD}test${RESET}" + @echo -e "\t\t${BOLD}install_env${RESET}" + @echo -e "\t\t${BOLD}install_devel${RESET}" + @echo -e "\t\t${BOLD}install_build${RESET}" + @echo -e "\t\t${BOLD}install_test${RESET}" + @echo -e "\te.g. 'make amd64_build'" + @echo + @echo -e "\t${BOLD}_${RESET}: build docker image for a specific toolchain target." + @echo -e "\t${BOLD}save__${RESET}: Save the docker image for a specific platform." + @echo -e "\t${BOLD}sh__${RESET}: run a container using the docker image specified (debug purpose)." + @echo -e "\t${BOLD}clean__${RESET}: Remove cache and docker image." + @echo + @echo -e "\tWith ${BOLD}${RESET}:" + @echo -e "\t\t${BOLD}arm-linux-gnueabihf${RESET} (linaro toolchain)" + @echo -e "\t\t${BOLD}armv8l-linux-gnueabihf${RESET} (linaro toolchain)" + @echo -e "\t\t${BOLD}arm-linux-gnueabi${RESET} (linaro toolchain)" + @echo -e "\t\t${BOLD}armeb-linux-gnueabihf${RESET} (linaro toolchain)" + @echo -e "\t\t${BOLD}armeb-linux-gnueabi${RESET} (linaro toolchain)" + @echo -e "\t\t${BOLD}aarch64-linux-gnu${RESET} (linaro toolchain)" + @echo -e "\t\t${BOLD}aarch64${RESET} (bootlin toolchain)" + @echo -e "\t\t${BOLD}aarch64_be-linux-gnu${RESET} (linaro toolchain)" + @echo -e "\t\t${BOLD}aarch64be${RESET} (bootlin toolchain)" + @echo -e "\t\t${BOLD}mips32${RESET} (codespace toolchain)" + @echo -e "\t\t${BOLD}mips64${RESET} (codespace toolchain)" + @echo -e "\t\t${BOLD}mips32el${RESET} (codespace toolchain)" + @echo -e "\t\t${BOLD}mips64el${RESET} (codespace toolchain)" + @echo -e "\t\t${BOLD}ppc${RESET} (bootlin toolchain)" + @echo -e "\t\t${BOLD}ppc64${RESET} (bootlin toolchain)" + @echo -e "\t\t${BOLD}ppc64le${RESET} (bootlin toolchain)" + @echo -e "\t\t${BOLD}riscv32${RESET} (bootlin toolchain)" + @echo -e "\t\t${BOLD}riscv64${RESET} (bootlin toolchain)" + @echo -e "\t\t${BOLD}s390x${RESET} (bootlin toolchain)" + @echo + @echo -e "\tWith ${BOLD}${RESET}:" + @echo -e "\t\t${BOLD}env${RESET}" + @echo -e "\t\t${BOLD}devel${RESET}" + @echo -e "\t\t${BOLD}build${RESET}" + @echo -e "\t\t${BOLD}test${RESET}" + @echo -e "\te.g. 'make aarch64_test'" + @echo + @echo -e "\t${BOLD}${RESET}: build the vagrant virtual machine." + @echo -e "\t${BOLD}clean_${RESET}: Remove virtual machine for the specified vm." + @echo + @echo -e "\t${BOLD}${RESET}:" + @echo -e "\t\t${BOLD}freebsd${RESET} (FreeBSD)" + @echo + @echo -e "\t${BOLD}clean${RESET}: Remove cache and ALL docker images." + @echo + @echo -e "\t${BOLD}NOCACHE=1${RESET}: use 'docker build --no-cache' when building container (default use cache)." + @echo + @echo -e "branch: $(BRANCH)" + @echo -e "sha1: $(SHA1)" + +# Need to add cmd_platform to PHONY otherwise target are ignored since they do not +# contain recipe (using FORCE do not work here) +.PHONY: all +all: build + +# Delete all implicit rules to speed up makefile +MAKEFLAGS += --no-builtin-rules +.SUFFIXES: +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = +# Keep all intermediate files +# ToDo: try to remove it later +.SECONDARY: + +# Docker image name prefix. +IMAGE := ${PROJECT} + +ifdef NOCACHE +DOCKER_BUILD_CMD := docker build --no-cache +else +DOCKER_BUILD_CMD := docker build +endif + +DOCKER_RUN_CMD := docker run --rm --init --net=host + +# $* stem +# $< first prerequist +# $@ target name + +############ +## NATIVE ## +############ +STAGES = env devel build test install_env install_devel install_build install_test + +targets_amd64 = $(addprefix amd64_, $(STAGES)) +.PHONY: $(targets_amd64) +$(targets_amd64): amd64_%: docker/amd64/Dockerfile + #@docker image rm -f ${IMAGE}:amd64_$* 2>/dev/null + ${DOCKER_BUILD_CMD} \ + --tag ${IMAGE}:amd64_$* \ + --target=$* \ + -f $< \ + ../.. + +#$(info Create targets: save_amd64 $(addprefix save_amd64_, $(STAGES)) (debug).) +save_targets_amd64 = $(addprefix save_amd64_, $(STAGES)) +.PHONY: $(save_targets_amd64) +$(save_targets_amd64): save_amd64_%: cache/amd64/docker_%.tar +cache/amd64/docker_%.tar: amd64_% + @rm -f $@ + mkdir -p cache/amd64 + docker save ${IMAGE}:amd64_$* -o $@ + +#$(info Create targets: $(addprefix sh_amd64_, $(STAGES)) (debug).) +sh_targets_amd64 = $(addprefix sh_amd64_, $(STAGES)) +.PHONY: $(sh_targets_amd64) +$(sh_targets_amd64): sh_amd64_%: amd64_% + ${DOCKER_RUN_CMD} -it --name ${IMAGE}_amd64_$* ${IMAGE}:amd64_$* + +#$(info Create targets: $(addprefix clean_amd64_, $(STAGES)).) +clean_targets_amd64 = $(addprefix clean_amd64_, $(STAGES)) +.PHONY: clean_amd64 $(clean_targets_amd64) +clean_amd64: $(clean_targets_amd64) +$(clean_targets_amd64): clean_amd64_%: + docker image rm -f ${IMAGE}:amd64_$* 2>/dev/null + rm -f cache/amd64/docker_$*.tar + + +############### +## TOOLCHAIN ## +############### +TOOLCHAIN_TARGETS = \ + aarch64 aarch64be \ + arm-linux-gnueabihf armv8l-linux-gnueabihf arm-linux-gnueabi armeb-linux-gnueabihf armeb-linux-gnueabi \ + aarch64-linux-gnu aarch64_be-linux-gnu \ + mips32 mips32el mips64 mips64el \ + ppc ppc64 ppc64le \ + riscv32 riscv64 \ + s390x +TOOLCHAIN_STAGES = env devel build test +define toolchain-stage-target = +#$$(info STAGE: $1) +#$$(info Create targets: toolchain_$1 $(addsuffix _$1, $(TOOLCHAIN_TARGETS)).) +targets_toolchain_$1 = $(addsuffix _$1, $(TOOLCHAIN_TARGETS)) +.PHONY: toolchain_$1 $$(targets_toolchain_$1) +toolchain_$1: $$(targets_toolchain_$1) +$$(targets_toolchain_$1): %_$1: docker/toolchain/Dockerfile + #@docker image rm -f ${IMAGE}:$$*_$1 2>/dev/null + ${DOCKER_BUILD_CMD} \ + --tag ${IMAGE}:$$*_$1 \ + --build-arg TARGET=$$* \ + --target=$1 \ + -f $$< \ + ../.. + +#$$(info Create targets: save_toolchain_$1 $(addprefix save_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))) (debug).) +save_targets_toolchain_$1 = $(addprefix save_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))) +.PHONY: save_toolchain_$1 $$(save_targets_toolchain_$1) +save_toolchain_$1: $$(save_targets_toolchain_$1) +$$(save_targets_toolchain_$1): save_%_$1: cache/%/docker_$1.tar +cache/%/docker_$1.tar: %_$1 + @rm -f $$@ + mkdir -p cache/$$* + docker save ${IMAGE}:$$*_$1 -o $$@ + +#$$(info Create targets: $(addprefix sh_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))) (debug).) +sh_targets_toolchain_$1 = $(addprefix sh_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))) +.PHONY: $$(sh_targets_toolchain_$1) +$$(sh_targets_toolchain_$1): sh_%_$1: %_$1 + ${DOCKER_RUN_CMD} -it --name ${IMAGE}_$$*_$1 ${IMAGE}:$$*_$1 + +#$$(info Create targets: clean_toolchain_$1 $(addprefix clean_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))).) +clean_targets_toolchain_$1 = $(addprefix clean_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))) +.PHONY: clean_toolchain_$1 $$(clean_targets_toolchain_$1) +clean_toolchain_$1: $$(clean_targets_toolchain_$1) +$$(clean_targets_toolchain_$1): clean_%_$1: + docker image rm -f ${IMAGE}:$$*_$1 2>/dev/null + rm -f cache/$$*/docker_$1.tar +endef + +$(foreach stage,$(TOOLCHAIN_STAGES),$(eval $(call toolchain-stage-target,$(stage)))) + +## MERGE ## +.PHONY: clean_toolchain +clean_toolchain: $(addprefix clean_toolchain_, $(TOOLCHAIN_STAGES)) + -rmdir $(addprefix cache/, $(TOOLCHAIN_TARGETS)) + +.PHONY: env devel build test +env: amd64_env toolchain_env +devel: amd64_devel toolchain_devel +build: amd64_build toolchain_build +test: amd64_test toolchain_test + +.PHONY: install_env install_devel install_build install_test +install_env: amd64_install_env +install_devel: amd64_install_devel +install_build: amd64_install_build +install_test: amd64_install_test + +############# +## VAGRANT ## +############# +VMS = freebsd + +vms_targets = $(addsuffix _build, $(VMS)) +.PHONY: $(vms_targets) +$(vms_targets): %_build: vagrant/%/Vagrantfile + @cd vagrant/$* && vagrant destroy -f + cd vagrant/$* && vagrant up + +clean_vms_targets = $(addprefix clean_, $(VMS)) +.PHONY: clean_vms $(clean_vms_targets) +clean_vms: $(clean_vms_targets) +$(clean_vms_targets): clean_%: + cd vagrant/$* && vagrant destroy -f + -rm -rf vagrant/$*/.vagrant + +########### +## CLEAN ## +########### +.PHONY: clean +clean: clean_amd64 clean_toolchain clean_vms + docker container prune -f + docker image prune -f + -rmdir cache + +.PHONY: distclean +distclean: clean + -docker container rm -f $$(docker container ls -aq) + -docker image rm -f $$(docker image ls -aq) + -vagrant box remove -f generic/freebsd12 diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/README.md b/node_modules/cpu-features/deps/cpu_features/cmake/ci/README.md new file mode 100644 index 00000000..0d898d84 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/README.md @@ -0,0 +1,40 @@ +## Makefile/Docker testing +To test the build on various distro, we are using docker containers and a Makefile for orchestration. + +pros: +* You are independent of third party CI runner config + (e.g. [github action virtual-environnments](https://github.com/actions/virtual-environments)). +* You can run it locally on your linux system. +* Most CI provide runners with docker and Makefile installed. + +cons: +* Only GNU/Linux distro supported. + +### Usage +To get the help simply type: +```sh +make +``` + +note: you can also use from top directory +```sh +make --directory=cmake/ci +``` + +### Example +For example to test mips32 inside an container: +```sh +make mips32_test +``` + +### Docker layers +Dockerfile is splitted in several stages. + +![docker](doc/docker.svg) + + +## Makefile/Vagrant testing +To test build for FreeBSD we are using Vagrant and VirtualBox box. + +This is similar to the docker stuff but use `vagrant` as `docker` cli and +VirtuaBox to replace the docker engine daemon. diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.dot b/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.dot new file mode 100644 index 00000000..a00ef1f7 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.dot @@ -0,0 +1,64 @@ +@startdot +digraph DockerDeps { + //rankdir=BT; + rankdir=TD; + node [shape=cylinder, style="rounded,filled", color=black, fillcolor=royalblue]; + DISTRO_IMG [label="ubuntu:latest"]; + PKG [label="packages\ne.g. cmake, g++", shape=box3d]; + SRC [label="git repo", shape=folder]; + SPL [label="sample", shape=folder]; + + subgraph clusterDockerfile { + ENV_IMG [label="cpu_features:amd64_env\nenv"]; + DEVEL_IMG [label="cpu_features:amd64_devel\ndevel"]; + BUILD_IMG [label="cpu_features:amd64_build\nbuild"]; + TEST_IMG [label="cpu_features:amd64_test\ntest"]; + INSTALL_ENV_IMG [label="cpu_features:amd64_install_env\ninstall_env"]; + INSTALL_DEVEL_IMG [label="cpu_features:amd64_install_devel\ninstall_devel"]; + INSTALL_BUILD_IMG [label="cpu_features:amd64_install_build\ninstall_build"]; + INSTALL_TEST_IMG [label="cpu_features:amd64_install_test\ninstall_test"]; + + ENV_IMG -> DEVEL_IMG; + DEVEL_IMG -> BUILD_IMG; + BUILD_IMG -> TEST_IMG; + + ENV_IMG -> INSTALL_ENV_IMG; + BUILD_IMG -> INSTALL_ENV_IMG [label="copy install", style="dashed"]; + INSTALL_ENV_IMG -> INSTALL_DEVEL_IMG; + SPL -> INSTALL_DEVEL_IMG [label="copy", style="dashed"]; + INSTALL_DEVEL_IMG -> INSTALL_BUILD_IMG; + INSTALL_BUILD_IMG -> INSTALL_TEST_IMG; + + color=royalblue; + label = "docker/amd64/Dockerfile"; + } + DISTRO_IMG -> ENV_IMG; + PKG -> ENV_IMG [label="install", style="dashed"]; + SRC -> DEVEL_IMG [label="copy", style="dashed"]; + + subgraph clusterCache { + node [shape=note, style="rounded,filled", color=black, fillcolor=royalblue]; + ENV_TAR [label="docker_amd64_env.tar"]; + DEVEL_TAR [label="docker_amd64_devel.tar"]; + BUILD_TAR [label="docker_amd64_build.tar"]; + TEST_TAR [label="docker_amd64_test.tar"]; + INSTALL_ENV_TAR [label="docker_amd64_install_env.tar"]; + INSTALL_DEVEL_TAR [label="docker_amd64_install_devel.tar"]; + INSTALL_BUILD_TAR [label="docker_amd64_install_build.tar"]; + INSTALL_TEST_TAR [label="docker_amd64_install_test.tar"]; + + edge [color=red]; + ENV_IMG -> ENV_TAR [label="make save_amd64_env"]; + DEVEL_IMG -> DEVEL_TAR [label="make save_amd64_devel"]; + BUILD_IMG -> BUILD_TAR [label="make save_amd64_build"]; + TEST_IMG -> TEST_TAR [label="make save_amd64_test"]; + INSTALL_ENV_IMG -> INSTALL_ENV_TAR [label="make save_amd64_install_env"]; + INSTALL_DEVEL_IMG -> INSTALL_DEVEL_TAR [label="make save_amd64_install_devel"]; + INSTALL_BUILD_IMG -> INSTALL_BUILD_TAR [label="make save_amd64_install_build"]; + INSTALL_TEST_IMG -> INSTALL_TEST_TAR [label="make save_amd64_install_test"]; + + color=royalblue; + label = "cache/amd64/"; + } +} +@enddot diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.svg b/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.svg new file mode 100644 index 00000000..bd9bd6db --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.svg @@ -0,0 +1,312 @@ + + + + + + +DockerDeps + + +clusterDockerfile + +docker/amd64/Dockerfile + + +clusterCache + +cache/amd64/ + + + +DISTRO_IMG + + +ubuntu:latest + + + +ENV_IMG + + +cpu_features:amd64_env +env + + + +DISTRO_IMG->ENV_IMG + + + + + +PKG + + + + +packages +e.g. cmake, g++ + + + +PKG->ENV_IMG + + +install + + + +SRC + +git repo + + + +DEVEL_IMG + + +cpu_features:amd64_devel +devel + + + +SRC->DEVEL_IMG + + +copy + + + +SPL + +sample + + + +INSTALL_DEVEL_IMG + + +cpu_features:amd64_install_devel +install_devel + + + +SPL->INSTALL_DEVEL_IMG + + +copy + + + +ENV_IMG->DEVEL_IMG + + + + + +INSTALL_ENV_IMG + + +cpu_features:amd64_install_env +install_env + + + +ENV_IMG->INSTALL_ENV_IMG + + + + + +ENV_TAR + + + +docker_amd64_env.tar + + + +ENV_IMG->ENV_TAR + + +make save_amd64_env + + + +BUILD_IMG + + +cpu_features:amd64_build +build + + + +DEVEL_IMG->BUILD_IMG + + + + + +DEVEL_TAR + + + +docker_amd64_devel.tar + + + +DEVEL_IMG->DEVEL_TAR + + +make save_amd64_devel + + + +TEST_IMG + + +cpu_features:amd64_test +test + + + +BUILD_IMG->TEST_IMG + + + + + +BUILD_IMG->INSTALL_ENV_IMG + + +copy install + + + +BUILD_TAR + + + +docker_amd64_build.tar + + + +BUILD_IMG->BUILD_TAR + + +make save_amd64_build + + + +TEST_TAR + + + +docker_amd64_test.tar + + + +TEST_IMG->TEST_TAR + + +make save_amd64_test + + + +INSTALL_ENV_IMG->INSTALL_DEVEL_IMG + + + + + +INSTALL_ENV_TAR + + + +docker_amd64_install_env.tar + + + +INSTALL_ENV_IMG->INSTALL_ENV_TAR + + +make save_amd64_install_env + + + +INSTALL_BUILD_IMG + + +cpu_features:amd64_install_build +install_build + + + +INSTALL_DEVEL_IMG->INSTALL_BUILD_IMG + + + + + +INSTALL_DEVEL_TAR + + + +docker_amd64_install_devel.tar + + + +INSTALL_DEVEL_IMG->INSTALL_DEVEL_TAR + + +make save_amd64_install_devel + + + +INSTALL_TEST_IMG + + +cpu_features:amd64_install_test +install_test + + + +INSTALL_BUILD_IMG->INSTALL_TEST_IMG + + + + + +INSTALL_BUILD_TAR + + + +docker_amd64_install_build.tar + + + +INSTALL_BUILD_IMG->INSTALL_BUILD_TAR + + +make save_amd64_install_build + + + +INSTALL_TEST_TAR + + + +docker_amd64_install_test.tar + + + +INSTALL_TEST_IMG->INSTALL_TEST_TAR + + +make save_amd64_install_test + + + diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/generate_image.sh b/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/generate_image.sh new file mode 100755 index 00000000..15f17745 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/generate_image.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -ex + +rm -f ./*.svg ./*.png +for i in *.dot; do + plantuml -Tsvg "$i"; +done diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/amd64/Dockerfile b/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/amd64/Dockerfile new file mode 100644 index 00000000..2cc32703 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/amd64/Dockerfile @@ -0,0 +1,48 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/ubuntu +FROM ubuntu:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=/usr/local/bin:$PATH +RUN apt-get update -qq \ +&& DEBIAN_FRONTEND=noninteractive apt-get install -yq git wget libssl-dev build-essential \ + ninja-build python3 pkgconf libglib2.0-dev \ +&& apt-get clean \ +&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +ENTRYPOINT ["/usr/bin/bash", "-c"] +CMD ["/usr/bin/bash"] + +# Install CMake 3.21.3 +RUN wget "https://cmake.org/files/v3.21/cmake-3.21.3-linux-x86_64.sh" \ +&& chmod a+x cmake-3.21.3-linux-x86_64.sh \ +&& ./cmake-3.21.3-linux-x86_64.sh --prefix=/usr/local/ --skip-license \ +&& rm cmake-3.21.3-linux-x86_64.sh + +FROM env AS devel +WORKDIR /home/project +COPY . . + +FROM devel AS build +RUN cmake -version +RUN cmake -S. -Bbuild +RUN cmake --build build --target all -v +RUN cmake --build build --target install -v + +FROM build AS test +ENV CTEST_OUTPUT_ON_FAILURE=1 +RUN cmake --build build --target test -v + +# Test install rules +FROM env AS install_env +COPY --from=build /usr/local /usr/local/ + +FROM install_env AS install_devel +WORKDIR /home/sample +COPY cmake/ci/sample . + +FROM install_devel AS install_build +RUN cmake -S. -Bbuild +RUN cmake --build build --target all -v + +FROM install_build AS install_test +RUN cmake --build build --target test diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/toolchain/Dockerfile b/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/toolchain/Dockerfile new file mode 100644 index 00000000..1bf25ed3 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/toolchain/Dockerfile @@ -0,0 +1,34 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/ubuntu +FROM ubuntu:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=/usr/local/bin:$PATH +RUN apt-get update -qq \ +&& DEBIAN_FRONTEND=noninteractive apt-get install -yq git wget libssl-dev build-essential \ + ninja-build python3 pkgconf libglib2.0-dev \ +&& apt-get clean \ +&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +ENTRYPOINT ["/usr/bin/bash", "-c"] +CMD ["/usr/bin/bash"] + +# Install CMake 3.21.3 +RUN wget "https://cmake.org/files/v3.21/cmake-3.21.3-linux-x86_64.sh" \ +&& chmod a+x cmake-3.21.3-linux-x86_64.sh \ +&& ./cmake-3.21.3-linux-x86_64.sh --prefix=/usr/local/ --skip-license \ +&& rm cmake-3.21.3-linux-x86_64.sh + +FROM env AS devel +WORKDIR /home/project +COPY . . + +ARG TARGET +ENV TARGET ${TARGET:-unknown} + +FROM devel AS build +RUN cmake -version +RUN ./scripts/run_integration.sh build + +FROM build AS test +RUN ./scripts/run_integration.sh qemu +RUN ./scripts/run_integration.sh test diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/CMakeLists.txt b/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/CMakeLists.txt new file mode 100644 index 00000000..b60e92f8 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.15) +project(Sample VERSION 1.0.0 LANGUAGES CXX) + +include(CTest) +find_package(CpuFeatures REQUIRED) + +add_executable(sample main.cpp) +target_compile_features(sample PUBLIC cxx_std_11) +set_target_properties(sample PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + VERSION ${PROJECT_VERSION}) +target_link_libraries(sample PRIVATE CpuFeatures::cpu_features) + +if(BUILD_TESTING) + add_test(NAME sample_test COMMAND sample) +endif() + +include(GNUInstallDirs) +install(TARGETS sample + EXPORT SampleTargets + DESTINATION ${CMAKE_INSTALL_BIN_DIR}) diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/main.cpp b/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/main.cpp new file mode 100644 index 00000000..45ec651b --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/main.cpp @@ -0,0 +1,11 @@ +#include + +#include "cpuinfo_x86.h" + +using namespace cpu_features; + +int main(int /*argc*/, char** /*argv*/) { + static const X86Features features = GetX86Info().features; + std::cout << std::endl; + return 0; +} diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/ci/vagrant/freebsd/Vagrantfile b/node_modules/cpu-features/deps/cpu_features/cmake/ci/vagrant/freebsd/Vagrantfile new file mode 100644 index 00000000..6234ff63 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/ci/vagrant/freebsd/Vagrantfile @@ -0,0 +1,107 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.guest = :freebsd + config.vm.box = "generic/freebsd12" + + config.ssh.shell = "sh" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # NOTE: This will enable public access to the opened port + # config.vm.network "forwarded_port", guest: 80, host: 8080 + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine and only allow access + # via 127.0.0.1 to disable public access + # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network "private_network", ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network "public_network" + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + #config.vm.synced_folder "../../..", "/home/vagrant/project" + config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", disabled: true + + config.vm.provision "file", source: "../../../../CMakeLists.txt", destination: "$HOME/project/" + config.vm.provision "file", source: "../../../../cmake", destination: "$HOME/project/" + config.vm.provision "file", source: "../../../../include", destination: "$HOME/project/" + config.vm.provision "file", source: "../../../../src", destination: "$HOME/project/" + config.vm.provision "file", source: "../../../../test", destination: "$HOME/project/" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + # config.vm.provider "virtualbox" do |vb| + # # Display the VirtualBox GUI when booting the machine + # vb.gui = true + # + # # Customize the amount of memory on the VM: + # vb.memory = "1024" + # end + # + # View the documentation for the provider you are using for more + # information on available options. + + # Enable provisioning with a shell script. Additional provisioners such as + # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the + # documentation for more information about their specific syntax and use. + # note: clang installed by default + config.vm.provision "env", type: "shell", inline:<<-SHELL + set -x + pkg update -f + pkg install -y git cmake + SHELL + config.vm.provision "devel", type: "shell", inline:<<-SHELL + set -x + cd project + ls + SHELL + config.vm.provision "configure", type: "shell", inline:<<-SHELL + set -x + cd project + cmake -S. -Bbuild -DBUILD_TESTING=ON + SHELL + config.vm.provision "build", type: "shell", inline:<<-SHELL + set -x + cd project + cmake --build build -v + SHELL + config.vm.provision "test", type: "shell", inline:<<-SHELL + set -x + cd project + cmake --build build --target test -v + SHELL + config.vm.provision "test", type: "shell", inline:<<-SHELL + set -x + cd project + cmake --build build --target install -v + SHELL +end diff --git a/node_modules/cpu-features/deps/cpu_features/cmake/googletest.CMakeLists.txt.in b/node_modules/cpu-features/deps/cpu_features/cmake/googletest.CMakeLists.txt.in new file mode 100644 index 00000000..8003c2c0 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cmake/googletest.CMakeLists.txt.in @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8.2) + +project(googletest-download NONE) + +include(ExternalProject) +ExternalProject_Add(googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG main + SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src" + BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) \ No newline at end of file diff --git a/node_modules/cpu-features/deps/cpu_features/cpu_features.gyp b/node_modules/cpu-features/deps/cpu_features/cpu_features.gyp new file mode 100644 index 00000000..28467387 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/cpu_features.gyp @@ -0,0 +1,104 @@ +{ + 'targets': [ + { + 'target_name': 'cpu_features', + 'type': 'static_library', + + 'cflags': [ '-O3' ], + + 'include_dirs': [ + 'include', + 'include/internal', + ], + 'sources': [ + 'include/cpu_features_cache_info.h', + 'include/cpu_features_macros.h', + + # platform-specific cpu checking implementations + 'src/impl_aarch64_linux_or_android.c', + 'src/impl_aarch64_macos_or_iphone.c', + 'src/impl_arm_linux_or_android.c', + 'src/impl_mips_linux_or_android.c', + 'src/impl_ppc_linux.c', + 'src/impl_x86_freebsd.c', + 'src/impl_x86_linux_or_android.c', + 'src/impl_x86_macos.c', + 'src/impl_x86_windows.c', + + # utils + 'include/internal/bit_utils.h', + 'include/internal/filesystem.h', + 'include/internal/stack_line_reader.h', + 'include/internal/string_view.h', + 'src/filesystem.c', + 'src/stack_line_reader.c', + 'src/string_view.c', + ], + 'conditions': [ + ['target_arch in "mips mipsel mips64 mips64el"', { + 'sources': [ + 'include/cpuinfo_mips.h', + ], + }], + ['target_arch=="arm"', { + 'sources': [ + 'include/cpuinfo_arm.h', + ], + }], + ['target_arch=="arm64"', { + 'sources': [ + 'include/cpuinfo_aarch64.h', + 'include/internal/windows_utils.h', + ], + }], + ['target_arch in "ia32 x32 x64"', { + 'sources': [ + 'include/internal/cpuid_x86.h', + 'include/cpuinfo_x86.h', + 'include/internal/windows_utils.h', + ], + }], + ['target_arch in "ppc ppc64"', { + 'sources': [ + 'include/cpuinfo_ppc.h', + ], + }], + ['target_arch in "s390x"', { + 'sources': [ + 'include/cpuinfo_s390x.h', + ], + }], + ['target_arch in "riscv64"', { + 'sources': [ + 'include/cpuinfo_riscv.h', + ], + }], + + ['OS=="mac" and target_arch in "ia32 x32 x64 arm64"', { + 'defines': [ + 'HAVE_SYSCTLBYNAME=1', + ], + }], + ], + 'defines': [ + 'NDEBUG', + 'STACK_LINE_READER_BUFFER_SIZE=1024', + ], + + # Use generated config + 'includes': [ + '../../buildcheck.gypi', + ], + + 'direct_dependent_settings': { + 'include_dirs': [ + 'include', + ], + 'defines': [ + # Manually-tracked git revision + 'CPU_FEATURES_VERSION_REV=8a494eb1e158ec2050e5f699a504fbc9b896a43b', + ], + }, + }, + ], +} diff --git a/node_modules/cpu-features/deps/cpu_features/include/cpu_features_cache_info.h b/node_modules/cpu-features/deps/cpu_features/include/cpu_features_cache_info.h new file mode 100644 index 00000000..1a61ee1e --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/cpu_features_cache_info.h @@ -0,0 +1,54 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_COMMON_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_COMMON_H_ + +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef enum { + CPU_FEATURE_CACHE_NULL = 0, + CPU_FEATURE_CACHE_DATA = 1, + CPU_FEATURE_CACHE_INSTRUCTION = 2, + CPU_FEATURE_CACHE_UNIFIED = 3, + CPU_FEATURE_CACHE_TLB = 4, + CPU_FEATURE_CACHE_DTLB = 5, + CPU_FEATURE_CACHE_STLB = 6, + CPU_FEATURE_CACHE_PREFETCH = 7 +} CacheType; + +typedef struct { + int level; + CacheType cache_type; + int cache_size; // Cache size in bytes + int ways; // Associativity, 0 undefined, 0xFF fully associative + int line_size; // Cache line size in bytes + int tlb_entries; // number of entries for TLB + int partitioning; // number of lines per sector +} CacheLevelInfo; + +// Increase this value if more cache levels are needed. +#ifndef CPU_FEATURES_MAX_CACHE_LEVEL +#define CPU_FEATURES_MAX_CACHE_LEVEL 10 +#endif +typedef struct { + int size; + CacheLevelInfo levels[CPU_FEATURES_MAX_CACHE_LEVEL]; +} CacheInfo; + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_COMMON_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/cpu_features_macros.h b/node_modules/cpu-features/deps/cpu_features/include/cpu_features_macros.h new file mode 100644 index 00000000..652335da --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/cpu_features_macros.h @@ -0,0 +1,384 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_ +#define CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_ + +//////////////////////////////////////////////////////////////////////////////// +// Architectures +//////////////////////////////////////////////////////////////////////////////// + +#if defined(__pnacl__) || defined(__CLR_VER) +#define CPU_FEATURES_ARCH_VM +#endif + +#if (defined(_M_IX86) || defined(__i386__)) && !defined(CPU_FEATURES_ARCH_VM) +#define CPU_FEATURES_ARCH_X86_32 +#endif + +#if (defined(_M_X64) || defined(__x86_64__)) && !defined(CPU_FEATURES_ARCH_VM) +#define CPU_FEATURES_ARCH_X86_64 +#endif + +#if defined(CPU_FEATURES_ARCH_X86_32) || defined(CPU_FEATURES_ARCH_X86_64) +#define CPU_FEATURES_ARCH_X86 +#endif + +#if (defined(__arm__) || defined(_M_ARM)) +#define CPU_FEATURES_ARCH_ARM +#endif + +#if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64)) +#define CPU_FEATURES_ARCH_AARCH64 +#endif + +#if (defined(CPU_FEATURES_ARCH_AARCH64) || defined(CPU_FEATURES_ARCH_ARM)) +#define CPU_FEATURES_ARCH_ANY_ARM +#endif + +#if defined(__mips64) +#define CPU_FEATURES_ARCH_MIPS64 +#endif + +#if defined(__mips__) && !defined(__mips64) // mips64 also declares __mips__ +#define CPU_FEATURES_ARCH_MIPS32 +#endif + +#if defined(CPU_FEATURES_ARCH_MIPS32) || defined(CPU_FEATURES_ARCH_MIPS64) +#define CPU_FEATURES_ARCH_MIPS +#endif + +#if defined(__powerpc__) +#define CPU_FEATURES_ARCH_PPC +#endif + +#if defined(__s390x__) +#define CPU_FEATURES_ARCH_S390X +#endif + +#if defined(__riscv) +#define CPU_FEATURES_ARCH_RISCV +#endif + +#if defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 32 +#define CPU_FEATURES_ARCH_RISCV32 +#endif + +#if defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64 +#define CPU_FEATURES_ARCH_RISCV64 +#endif + +#if defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 128 +#define CPU_FEATURES_ARCH_RISCV128 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Os +//////////////////////////////////////////////////////////////////////////////// + +#if (defined(__freebsd__) || defined(__FreeBSD__)) +#define CPU_FEATURES_OS_FREEBSD +#endif + +#if defined(__ANDROID__) +#define CPU_FEATURES_OS_ANDROID +#endif + +#if defined(__linux__) && !defined(CPU_FEATURES_OS_FREEBSD) && \ + !defined(CPU_FEATURES_OS_ANDROID) +#define CPU_FEATURES_OS_LINUX +#endif + +#if (defined(_WIN64) || defined(_WIN32)) +#define CPU_FEATURES_OS_WINDOWS +#endif + +#if (defined(__apple__) || defined(__APPLE__) || defined(__MACH__)) +// From https://stackoverflow.com/a/49560690 +#include "TargetConditionals.h" +#if defined(TARGET_OS_OSX) +#define CPU_FEATURES_OS_MACOS +#endif +#if defined(TARGET_OS_IPHONE) +// This is set for any non-Mac Apple products (IOS, TV, WATCH) +#define CPU_FEATURES_OS_IPHONE +#endif +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Compilers +//////////////////////////////////////////////////////////////////////////////// + +#if defined(__clang__) +#define CPU_FEATURES_COMPILER_CLANG +#endif + +#if defined(__GNUC__) && !defined(__clang__) +#define CPU_FEATURES_COMPILER_GCC +#endif + +#if defined(_MSC_VER) +#define CPU_FEATURES_COMPILER_MSC +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Cpp +//////////////////////////////////////////////////////////////////////////////// + +#if defined(__cplusplus) +#define CPU_FEATURES_START_CPP_NAMESPACE \ + namespace cpu_features { \ + extern "C" { +#define CPU_FEATURES_END_CPP_NAMESPACE \ + } \ + } +#else +#define CPU_FEATURES_START_CPP_NAMESPACE +#define CPU_FEATURES_END_CPP_NAMESPACE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Compiler flags +//////////////////////////////////////////////////////////////////////////////// + +// Use the following to check if a feature is known to be available at +// compile time. See README.md for an example. +#if defined(CPU_FEATURES_ARCH_X86) + +#if defined(__AES__) +#define CPU_FEATURES_COMPILED_X86_AES 1 +#else +#define CPU_FEATURES_COMPILED_X86_AES 0 +#endif // defined(__AES__) + +#if defined(__F16C__) +#define CPU_FEATURES_COMPILED_X86_F16C 1 +#else +#define CPU_FEATURES_COMPILED_X86_F16C 0 +#endif // defined(__F16C__) + +#if defined(__BMI__) +#define CPU_FEATURES_COMPILED_X86_BMI 1 +#else +#define CPU_FEATURES_COMPILED_X86_BMI 0 +#endif // defined(__BMI__) + +#if defined(__BMI2__) +#define CPU_FEATURES_COMPILED_X86_BMI2 1 +#else +#define CPU_FEATURES_COMPILED_X86_BMI2 0 +#endif // defined(__BMI2__) + +#if (defined(__SSE__) || (_M_IX86_FP >= 1)) +#define CPU_FEATURES_COMPILED_X86_SSE 1 +#else +#define CPU_FEATURES_COMPILED_X86_SSE 0 +#endif + +#if (defined(__SSE2__) || (_M_IX86_FP >= 2)) +#define CPU_FEATURES_COMPILED_X86_SSE2 1 +#else +#define CPU_FEATURES_COMPILED_X86_SSE2 0 +#endif + +#if defined(__SSE3__) +#define CPU_FEATURES_COMPILED_X86_SSE3 1 +#else +#define CPU_FEATURES_COMPILED_X86_SSE3 0 +#endif // defined(__SSE3__) + +#if defined(__SSSE3__) +#define CPU_FEATURES_COMPILED_X86_SSSE3 1 +#else +#define CPU_FEATURES_COMPILED_X86_SSSE3 0 +#endif // defined(__SSSE3__) + +#if defined(__SSE4_1__) +#define CPU_FEATURES_COMPILED_X86_SSE4_1 1 +#else +#define CPU_FEATURES_COMPILED_X86_SSE4_1 0 +#endif // defined(__SSE4_1__) + +#if defined(__SSE4_2__) +#define CPU_FEATURES_COMPILED_X86_SSE4_2 1 +#else +#define CPU_FEATURES_COMPILED_X86_SSE4_2 0 +#endif // defined(__SSE4_2__) + +#if defined(__AVX__) +#define CPU_FEATURES_COMPILED_X86_AVX 1 +#else +#define CPU_FEATURES_COMPILED_X86_AVX 0 +#endif // defined(__AVX__) + +#if defined(__AVX2__) +#define CPU_FEATURES_COMPILED_X86_AVX2 1 +#else +#define CPU_FEATURES_COMPILED_X86_AVX2 0 +#endif // defined(__AVX2__) + +#endif // defined(CPU_FEATURES_ARCH_X86) + +#if defined(CPU_FEATURES_ARCH_ANY_ARM) +#if defined(__ARM_NEON__) +#define CPU_FEATURES_COMPILED_ANY_ARM_NEON 1 +#else +#define CPU_FEATURES_COMPILED_ANY_ARM_NEON 0 +#endif // defined(__ARM_NEON__) +#endif // defined(CPU_FEATURES_ARCH_ANY_ARM) + +#if defined(CPU_FEATURES_ARCH_MIPS) +#if defined(__mips_msa) +#define CPU_FEATURES_COMPILED_MIPS_MSA 1 +#else +#define CPU_FEATURES_COMPILED_MIPS_MSA 0 +#endif // defined(__mips_msa) +#if defined(__mips3d) +#define CPU_FEATURES_COMPILED_MIPS_MIPS3D 1 +#else +#define CPU_FEATURES_COMPILED_MIPS_MIPS3D 0 +#endif +#endif // defined(CPU_FEATURES_ARCH_MIPS) + +#if defined(CPU_FEATURES_ARCH_RISCV) +#if defined(__riscv_e) +#define CPU_FEATURES_COMPILED_RISCV_E 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_E 0 +#endif +#if defined(__riscv_i) +#define CPU_FEATURES_COMPILED_RISCV_I 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_I 0 +#endif +#if defined(__riscv_m) +#define CPU_FEATURES_COMPILED_RISCV_M 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_M 0 +#endif +#if defined(__riscv_a) +#define CPU_FEATURES_COMPILED_RISCV_A 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_A 0 +#endif +#if defined(__riscv_f) +#define CPU_FEATURES_COMPILED_RISCV_F 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_F 0 +#endif +#if defined(__riscv_d) +#define CPU_FEATURES_COMPILED_RISCV_D 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_D 0 +#endif +#if defined(__riscv_q) +#define CPU_FEATURES_COMPILED_RISCV_Q 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_Q 0 +#endif +#if defined(__riscv_c) +#define CPU_FEATURES_COMPILED_RISCV_C 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_C 0 +#endif +#if defined(__riscv_v) +#define CPU_FEATURES_COMPILED_RISCV_V 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_V 0 +#endif +#if defined(__riscv_zba) +#define CPU_FEATURES_COMPILED_RISCV_ZBA 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZBA 0 +#endif +#if defined(__riscv_zbb) +#define CPU_FEATURES_COMPILED_RISCV_ZBB 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZBB 0 +#endif +#if defined(__riscv_zbc) +#define CPU_FEATURES_COMPILED_RISCV_ZBC 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZBC 0 +#endif +#if defined(__riscv_zbs) +#define CPU_FEATURES_COMPILED_RISCV_ZBS 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZBS 0 +#endif +#if defined(__riscv_zfh) +#define CPU_FEATURES_COMPILED_RISCV_ZFH 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZFH 0 +#endif +#if defined(__riscv_zfhmin) +#define CPU_FEATURES_COMPILED_RISCV_ZFHMIN 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZFHMIN 0 +#endif +#if defined(__riscv_zknd) +#define CPU_FEATURES_COMPILED_RISCV_ZKND 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZKND 0 +#endif +#if defined(__riscv_zkne) +#define CPU_FEATURES_COMPILED_RISCV_ZKNE 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZKNE 0 +#endif +#if defined(__riscv_zknh) +#define CPU_FEATURES_COMPILED_RISCV_ZKNH 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZKNH 0 +#endif +#if defined(__riscv_zksed) +#define CPU_FEATURES_COMPILED_RISCV_ZKSED 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZKSED 0 +#endif +#if defined(__riscv_zksh) +#define CPU_FEATURES_COMPILED_RISCV_ZKSH 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZKSH 0 +#endif +#if defined(__riscv_zkr) +#define CPU_FEATURES_COMPILED_RISCV_ZKR 1 +#else +#define CPU_FEATURES_COMPILED_RISCV_ZKR 0 +#endif +#endif // defined(CPU_FEATURES_ARCH_RISCV) + +//////////////////////////////////////////////////////////////////////////////// +// Utils +//////////////////////////////////////////////////////////////////////////////// + +// Communicates to the compiler that the block is unreachable +#if defined(CPU_FEATURES_COMPILER_CLANG) || defined(CPU_FEATURES_COMPILER_GCC) +#define CPU_FEATURES_UNREACHABLE() __builtin_unreachable() +#elif defined(CPU_FEATURES_COMPILER_MSC) +#define CPU_FEATURES_UNREACHABLE() __assume(0) +#else +#define CPU_FEATURES_UNREACHABLE() +#endif + +// Communicates to the compiler that the function is now deprecated +#if defined(CPU_FEATURES_COMPILER_CLANG) || defined(CPU_FEATURES_COMPILER_GCC) +#define CPU_FEATURES_DEPRECATED(message) __attribute__((deprecated(message))) +#elif defined(CPU_FEATURES_COMPILER_MSC) +#define CPU_FEATURES_DEPRECATED(message) __declspec(deprecated(message)) +#else +#define CPU_FEATURES_DEPRECATED(message) +#endif + +#endif // CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_aarch64.h b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_aarch64.h new file mode 100644 index 00000000..d124b5ff --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_aarch64.h @@ -0,0 +1,259 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//////////////////////////////////////////////////////////////////////////////// +// A note on Windows AArch64 implementation +//////////////////////////////////////////////////////////////////////////////// + +// Getting cpu info via EL1 system registers is not possible, so we delegate it +// to the Windows API (i.e., IsProcessorFeaturePresent and GetNativeSystemInfo). +// The `implementer`, `variant` and `part` fields of the `Aarch64Info` struct +// are not used, so they are set to 0. To get `revision` we use +// `wProcessorRevision` from `SYSTEM_INFO`. +// +// Cryptographic Extension: +// ----------------------------------------------------------------------------- +// According to documentation Arm Architecture Reference Manual for +// A-profile architecture. A2.3 The Armv8 Cryptographic Extension. The Armv8.0 +// Cryptographic Extension provides instructions for the acceleration of +// encryption and decryption, and includes the following features: FEAT_AES, +// FEAT_PMULL, FEAT_SHA1, FEAT_SHA256. +// see: https://developer.arm.com/documentation/ddi0487/latest +// +// We use `PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE` to detect all Armv8.0 crypto +// features. This value reports all features or nothing, so even if you only +// have support FEAT_AES and FEAT_PMULL, it will still return false. +// +// From Armv8.2, an implementation of the Armv8.0 Cryptographic Extension can +// include either or both of: +// +// • The AES functionality, including support for multiplication of 64-bit +// polynomials. The ID_AA64ISAR0_EL1.AES field indicates whether this +// functionality is supported. +// • The SHA1 and SHA2-256 functionality. The ID_AA64ISAR0_EL1.{SHA2, SHA1} +// fields indicate whether this functionality is supported. +// +// ID_AA64ISAR0_EL1.AES, bits [7:4]: +// Indicates support for AES instructions in AArch64 state. Defined values are: +// - 0b0000 No AES instructions implemented. +// - 0b0001 AESE, AESD, AESMC, and AESIMC instructions implemented. +// - 0b0010 As for 0b0001, plus PMULL/PMULL2 instructions operating on 64-bit +// data quantities. +// +// FEAT_AES implements the functionality identified by the value 0b0001. +// FEAT_PMULL implements the functionality identified by the value 0b0010. +// From Armv8, the permitted values are 0b0000 and 0b0010. +// +// ID_AA64ISAR0_EL1.SHA1, bits [11:8]: +// Indicates support for SHA1 instructions in AArch64 state. Defined values are: +// - 0b0000 No SHA1 instructions implemented. +// - 0b0001 SHA1C, SHA1P, SHA1M, SHA1H, SHA1SU0, and SHA1SU1 instructions +// implemented. +// +// FEAT_SHA1 implements the functionality identified by the value 0b0001. +// From Armv8, the permitted values are 0b0000 and 0b0001. +// If the value of ID_AA64ISAR0_EL1.SHA2 is 0b0000, this field must have the +// value 0b0000. +// +// ID_AA64ISAR0_EL1.SHA2, bits [15:12]: +// Indicates support for SHA2 instructions in AArch64 state. Defined values are: +// - 0b0000 No SHA2 instructions implemented. +// - 0b0001 Implements instructions: SHA256H, SHA256H2, SHA256SU0, and +// SHA256SU1. +// - 0b0010 Implements instructions: +// • SHA256H, SHA256H2, SHA256SU0, and SHA256SU1. +// • SHA512H, SHA512H2, SHA512SU0, and SHA512SU1. +// +// FEAT_SHA256 implements the functionality identified by the value 0b0001. +// FEAT_SHA512 implements the functionality identified by the value 0b0010. +// +// In Armv8, the permitted values are 0b0000 and 0b0001. +// From Armv8.2, the permitted values are 0b0000, 0b0001, and 0b0010. +// +// If the value of ID_AA64ISAR0_EL1.SHA1 is 0b0000, this field must have the +// value 0b0000. +// +// If the value of this field is 0b0010, ID_AA64ISAR0_EL1.SHA3 +// must have the value 0b0001. +// +// Other cryptographic features that we cannot detect such as sha512, sha3, sm3, +// sm4, sveaes, svepmull, svesha3, svesm4 we set to 0. +// +// FP/SIMD: +// ----------------------------------------------------------------------------- +// FP/SIMD must be implemented on all Armv8.0 implementations, but +// implementations targeting specialized markets may support the following +// combinations: +// +// • No NEON or floating-point. +// • Full floating-point and SIMD support with exception trapping. +// • Full floating-point and SIMD support without exception trapping. +// +// ref: +// https://developer.arm.com/documentation/den0024/a/AArch64-Floating-point-and-NEON +// +// So, we use `PF_ARM_VFP_32_REGISTERS_AVAILABLE`, +// `PF_ARM_NEON_INSTRUCTIONS_AVAILABLE` to detect `asimd` and `fp` + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_AARCH64_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_AARCH64_H_ + +#include "cpu_features_cache_info.h" +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef struct { + int fp : 1; // Floating-point. + int asimd : 1; // Advanced SIMD. + int evtstrm : 1; // Generic timer generated events. + int aes : 1; // Hardware-accelerated Advanced Encryption Standard. + int pmull : 1; // Polynomial multiply long. + int sha1 : 1; // Hardware-accelerated SHA1. + int sha2 : 1; // Hardware-accelerated SHA2-256. + int crc32 : 1; // Hardware-accelerated CRC-32. + int atomics : 1; // Armv8.1 atomic instructions. + int fphp : 1; // Half-precision floating point support. + int asimdhp : 1; // Advanced SIMD half-precision support. + int cpuid : 1; // Access to certain ID registers. + int asimdrdm : 1; // Rounding Double Multiply Accumulate/Subtract. + int jscvt : 1; // Support for JavaScript conversion. + int fcma : 1; // Floating point complex numbers. + int lrcpc : 1; // Support for weaker release consistency. + int dcpop : 1; // Data persistence writeback. + int sha3 : 1; // Hardware-accelerated SHA3. + int sm3 : 1; // Hardware-accelerated SM3. + int sm4 : 1; // Hardware-accelerated SM4. + int asimddp : 1; // Dot product instruction. + int sha512 : 1; // Hardware-accelerated SHA512. + int sve : 1; // Scalable Vector Extension. + int asimdfhm : 1; // Additional half-precision instructions. + int dit : 1; // Data independent timing. + int uscat : 1; // Unaligned atomics support. + int ilrcpc : 1; // Additional support for weaker release consistency. + int flagm : 1; // Flag manipulation instructions. + int ssbs : 1; // Speculative Store Bypass Safe PSTATE bit. + int sb : 1; // Speculation barrier. + int paca : 1; // Address authentication. + int pacg : 1; // Generic authentication. + int dcpodp : 1; // Data cache clean to point of persistence. + int sve2 : 1; // Scalable Vector Extension (version 2). + int sveaes : 1; // SVE AES instructions. + int svepmull : 1; // SVE polynomial multiply long instructions. + int svebitperm : 1; // SVE bit permute instructions. + int svesha3 : 1; // SVE SHA3 instructions. + int svesm4 : 1; // SVE SM4 instructions. + int flagm2 : 1; // Additional flag manipulation instructions. + int frint : 1; // Floating point to integer rounding. + int svei8mm : 1; // SVE Int8 matrix multiplication instructions. + int svef32mm : 1; // SVE FP32 matrix multiplication instruction. + int svef64mm : 1; // SVE FP64 matrix multiplication instructions. + int svebf16 : 1; // SVE BFloat16 instructions. + int i8mm : 1; // Int8 matrix multiplication instructions. + int bf16 : 1; // BFloat16 instructions. + int dgh : 1; // Data Gathering Hint instruction. + int rng : 1; // True random number generator support. + int bti : 1; // Branch target identification. + int mte : 1; // Memory tagging extension. + int ecv : 1; // Enhanced counter virtualization. + int afp : 1; // Alternate floating-point behaviour. + int rpres : 1; // 12-bit reciprocal (square root) estimate precision. + + // Make sure to update Aarch64FeaturesEnum below if you add a field here. +} Aarch64Features; + +typedef struct { + Aarch64Features features; + int implementer; // We set 0 for Windows. + int variant; // We set 0 for Windows. + int part; // We set 0 for Windows. + int revision; // We use GetNativeSystemInfo to get processor revision for + // Windows. +} Aarch64Info; + +Aarch64Info GetAarch64Info(void); + +//////////////////////////////////////////////////////////////////////////////// +// Introspection functions + +typedef enum { + AARCH64_FP, + AARCH64_ASIMD, + AARCH64_EVTSTRM, + AARCH64_AES, + AARCH64_PMULL, + AARCH64_SHA1, + AARCH64_SHA2, + AARCH64_CRC32, + AARCH64_ATOMICS, + AARCH64_FPHP, + AARCH64_ASIMDHP, + AARCH64_CPUID, + AARCH64_ASIMDRDM, + AARCH64_JSCVT, + AARCH64_FCMA, + AARCH64_LRCPC, + AARCH64_DCPOP, + AARCH64_SHA3, + AARCH64_SM3, + AARCH64_SM4, + AARCH64_ASIMDDP, + AARCH64_SHA512, + AARCH64_SVE, + AARCH64_ASIMDFHM, + AARCH64_DIT, + AARCH64_USCAT, + AARCH64_ILRCPC, + AARCH64_FLAGM, + AARCH64_SSBS, + AARCH64_SB, + AARCH64_PACA, + AARCH64_PACG, + AARCH64_DCPODP, + AARCH64_SVE2, + AARCH64_SVEAES, + AARCH64_SVEPMULL, + AARCH64_SVEBITPERM, + AARCH64_SVESHA3, + AARCH64_SVESM4, + AARCH64_FLAGM2, + AARCH64_FRINT, + AARCH64_SVEI8MM, + AARCH64_SVEF32MM, + AARCH64_SVEF64MM, + AARCH64_SVEBF16, + AARCH64_I8MM, + AARCH64_BF16, + AARCH64_DGH, + AARCH64_RNG, + AARCH64_BTI, + AARCH64_MTE, + AARCH64_ECV, + AARCH64_AFP, + AARCH64_RPRES, + AARCH64_LAST_, +} Aarch64FeaturesEnum; + +int GetAarch64FeaturesEnumValue(const Aarch64Features* features, + Aarch64FeaturesEnum value); + +const char* GetAarch64FeaturesEnumName(Aarch64FeaturesEnum); + +CPU_FEATURES_END_CPP_NAMESPACE + +#if !defined(CPU_FEATURES_ARCH_AARCH64) +#error "Including cpuinfo_aarch64.h from a non-aarch64 target." +#endif + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_AARCH64_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_arm.h b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_arm.h new file mode 100644 index 00000000..0952d7c2 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_arm.h @@ -0,0 +1,121 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_ARM_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_ARM_H_ + +#include // uint32_t + +#include "cpu_features_cache_info.h" +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef struct { + int swp : 1; // SWP instruction (atomic read-modify-write) + int half : 1; // Half-word loads and stores + int thumb : 1; // Thumb (16-bit instruction set) + int _26bit : 1; // "26 Bit" Model (Processor status register folded into + // program counter) + int fastmult : 1; // 32x32->64-bit multiplication + int fpa : 1; // Floating point accelerator + int vfp : 1; // Vector Floating Point. + int edsp : 1; // DSP extensions (the 'e' variant of the ARM9 CPUs, and all + // others above) + int java : 1; // Jazelle (Java bytecode accelerator) + int iwmmxt : 1; // Intel Wireless MMX Technology. + int crunch : 1; // MaverickCrunch coprocessor + int thumbee : 1; // ThumbEE + int neon : 1; // Advanced SIMD. + int vfpv3 : 1; // VFP version 3 + int vfpv3d16 : 1; // VFP version 3 with 16 D-registers + int tls : 1; // TLS register + int vfpv4 : 1; // VFP version 4 with fast context switching + int idiva : 1; // SDIV and UDIV hardware division in ARM mode. + int idivt : 1; // SDIV and UDIV hardware division in Thumb mode. + int vfpd32 : 1; // VFP with 32 D-registers + int lpae : 1; // Large Physical Address Extension (>4GB physical memory on + // 32-bit architecture) + int evtstrm : 1; // kernel event stream using generic architected timer + int aes : 1; // Hardware-accelerated Advanced Encryption Standard. + int pmull : 1; // Polynomial multiply long. + int sha1 : 1; // Hardware-accelerated SHA1. + int sha2 : 1; // Hardware-accelerated SHA2-256. + int crc32 : 1; // Hardware-accelerated CRC-32. + + // Make sure to update ArmFeaturesEnum below if you add a field here. +} ArmFeatures; + +typedef struct { + ArmFeatures features; + int implementer; + int architecture; + int variant; + int part; + int revision; +} ArmInfo; + +// TODO(user): Add macros to know which features are present at compile +// time. + +ArmInfo GetArmInfo(void); + +// Compute CpuId from ArmInfo. +uint32_t GetArmCpuId(const ArmInfo* const info); + +//////////////////////////////////////////////////////////////////////////////// +// Introspection functions + +typedef enum { + ARM_SWP, + ARM_HALF, + ARM_THUMB, + ARM_26BIT, + ARM_FASTMULT, + ARM_FPA, + ARM_VFP, + ARM_EDSP, + ARM_JAVA, + ARM_IWMMXT, + ARM_CRUNCH, + ARM_THUMBEE, + ARM_NEON, + ARM_VFPV3, + ARM_VFPV3D16, + ARM_TLS, + ARM_VFPV4, + ARM_IDIVA, + ARM_IDIVT, + ARM_VFPD32, + ARM_LPAE, + ARM_EVTSTRM, + ARM_AES, + ARM_PMULL, + ARM_SHA1, + ARM_SHA2, + ARM_CRC32, + ARM_LAST_, +} ArmFeaturesEnum; + +int GetArmFeaturesEnumValue(const ArmFeatures* features, ArmFeaturesEnum value); + +const char* GetArmFeaturesEnumName(ArmFeaturesEnum); + +CPU_FEATURES_END_CPP_NAMESPACE + +#if !defined(CPU_FEATURES_ARCH_ARM) +#error "Including cpuinfo_arm.h from a non-arm target." +#endif + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_ARM_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_mips.h b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_mips.h new file mode 100644 index 00000000..321d3c88 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_mips.h @@ -0,0 +1,74 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_MIPS_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_MIPS_H_ + +#include "cpu_features_cache_info.h" +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef struct { + int msa : 1; // MIPS SIMD Architecture + // https://www.mips.com/products/architectures/ase/simd/ + int eva : 1; // Enhanced Virtual Addressing + // https://www.mips.com/products/architectures/mips64/ + int r6 : 1; // True if is release 6 of the processor. + int mips16 : 1; // Compressed instructions + int mdmx : 1; // MIPS Digital Media Extension + int mips3d : 1; // 3D graphics acceleration + // MIPS(r) Architecture for Programmers, Volume IV-c + int smart : 1; // Smart-card cryptography + // MIPS(r) Architecture for Programmers, Volume IV-d + int dsp : 1; // Digital Signal Processing + // MIPS(r) Architecture for Programmers, Volume IV-e + // https://www.mips.com/products/architectures/ase/dsp/ + + // Make sure to update MipsFeaturesEnum below if you add a field here. +} MipsFeatures; + +typedef struct { + MipsFeatures features; +} MipsInfo; + +MipsInfo GetMipsInfo(void); + +//////////////////////////////////////////////////////////////////////////////// +// Introspection functions + +typedef enum { + MIPS_MSA, + MIPS_EVA, + MIPS_R6, + MIPS_MIPS16, + MIPS_MDMX, + MIPS_MIPS3D, + MIPS_SMART, + MIPS_DSP, + MIPS_LAST_, +} MipsFeaturesEnum; + +int GetMipsFeaturesEnumValue(const MipsFeatures* features, + MipsFeaturesEnum value); + +const char* GetMipsFeaturesEnumName(MipsFeaturesEnum); + +CPU_FEATURES_END_CPP_NAMESPACE + +#if !defined(CPU_FEATURES_ARCH_MIPS) +#error "Including cpuinfo_mips.h from a non-mips target." +#endif + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_MIPS_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_ppc.h b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_ppc.h new file mode 100644 index 00000000..da3e6961 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_ppc.h @@ -0,0 +1,149 @@ +// Copyright 2018 IBM +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_PPC_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_PPC_H_ + +#include "cpu_features_cache_info.h" +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef struct { + int ppc32 : 1; + int ppc64 : 1; + int ppc601 : 1; + int altivec : 1; + int fpu : 1; + int mmu : 1; + int mac_4xx : 1; + int unifiedcache : 1; + int spe : 1; + int efpsingle : 1; + int efpdouble : 1; + int no_tb : 1; + int power4 : 1; + int power5 : 1; + int power5plus : 1; + int cell : 1; + int booke : 1; + int smt : 1; + int icachesnoop : 1; + int arch205 : 1; + int pa6t : 1; + int dfp : 1; + int power6ext : 1; + int arch206 : 1; + int vsx : 1; + int pseries_perfmon_compat : 1; + int truele : 1; + int ppcle : 1; + int arch207 : 1; + int htm : 1; + int dscr : 1; + int ebb : 1; + int isel : 1; + int tar : 1; + int vcrypto : 1; + int htm_nosc : 1; + int arch300 : 1; + int ieee128 : 1; + int darn : 1; + int scv : 1; + int htm_no_suspend : 1; + + // Make sure to update PPCFeaturesEnum below if you add a field here. +} PPCFeatures; + +typedef struct { + PPCFeatures features; +} PPCInfo; + +PPCInfo GetPPCInfo(void); + +typedef struct { + char platform[64]; // 0 terminated string + char base_platform[64]; // 0 terminated string +} PPCPlatformTypeStrings; + +typedef struct { + char platform[64]; // 0 terminated string + char model[64]; // 0 terminated string + char machine[64]; // 0 terminated string + char cpu[64]; // 0 terminated string + PPCPlatformTypeStrings type; +} PPCPlatformStrings; + +PPCPlatformStrings GetPPCPlatformStrings(void); + +//////////////////////////////////////////////////////////////////////////////// +// Introspection functions + +typedef enum { + PPC_32, /* 32 bit mode execution */ + PPC_64, /* 64 bit mode execution */ + PPC_601_INSTR, /* Old POWER ISA */ + PPC_HAS_ALTIVEC, /* SIMD Unit*/ + PPC_HAS_FPU, /* Floating Point Unit */ + PPC_HAS_MMU, /* Memory management unit */ + PPC_HAS_4xxMAC, + PPC_UNIFIED_CACHE, /* Unified instruction and data cache */ + PPC_HAS_SPE, /* Signal processing extention unit */ + PPC_HAS_EFP_SINGLE, /* SPE single precision fpu */ + PPC_HAS_EFP_DOUBLE, /* SPE double precision fpu */ + PPC_NO_TB, /* No timebase */ + PPC_POWER4, + PPC_POWER5, + PPC_POWER5_PLUS, + PPC_CELL, /* Cell broadband engine */ + PPC_BOOKE, /* Embedded ISA */ + PPC_SMT, /* Simultaneous multi-threading */ + PPC_ICACHE_SNOOP, + PPC_ARCH_2_05, /* ISA 2.05 - POWER6 */ + PPC_PA6T, /* PA Semi 6T core ISA */ + PPC_HAS_DFP, /* Decimal floating point unit */ + PPC_POWER6_EXT, + PPC_ARCH_2_06, /* ISA 2.06 - POWER7 */ + PPC_HAS_VSX, /* Vector-scalar extension */ + PPC_PSERIES_PERFMON_COMPAT, /* Set of backwards compatibile performance + monitoring events */ + PPC_TRUE_LE, + PPC_PPC_LE, + PPC_ARCH_2_07, /* ISA 2.07 - POWER8 */ + PPC_HTM, /* Hardware Transactional Memory */ + PPC_DSCR, /* Data stream control register */ + PPC_EBB, /* Event base branching */ + PPC_ISEL, /* Integer select instructions */ + PPC_TAR, /* Target address register */ + PPC_VEC_CRYPTO, /* Vector cryptography instructions */ + PPC_HTM_NOSC, /* Transactions aborted when syscall made*/ + PPC_ARCH_3_00, /* ISA 3.00 - POWER9 */ + PPC_HAS_IEEE128, /* VSX IEEE Binary Float 128-bit */ + PPC_DARN, /* Deliver a random number instruction */ + PPC_SCV, /* scv syscall */ + PPC_HTM_NO_SUSPEND, /* TM w/out suspended state */ + PPC_LAST_, +} PPCFeaturesEnum; + +int GetPPCFeaturesEnumValue(const PPCFeatures* features, PPCFeaturesEnum value); + +const char* GetPPCFeaturesEnumName(PPCFeaturesEnum); + +CPU_FEATURES_END_CPP_NAMESPACE + +#if !defined(CPU_FEATURES_ARCH_PPC) +#error "Including cpuinfo_ppc.h from a non-ppc target." +#endif + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_PPC_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_riscv.h b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_riscv.h new file mode 100644 index 00000000..1fa7aa51 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_riscv.h @@ -0,0 +1,72 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_RISCV_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_RISCV_H_ + +#include "cpu_features_cache_info.h" +#include "cpu_features_macros.h" + +#if !defined(CPU_FEATURES_ARCH_RISCV) +#error "Including cpuinfo_riscv.h from a non-riscv target." +#endif + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef struct { + // Base + int RV32I : 1; // Base Integer Instruction Set, 32-bit + int RV64I : 1; // Base Integer Instruction Set, 64-bit + + // Extension + int M : 1; // Standard Extension for Integer Multiplication/Division + int A : 1; // Standard Extension for Atomic Instructions + int F : 1; // Standard Extension for Single-Precision Floating-Point + int D : 1; // Standard Extension for Double-Precision Floating-Point + int Q : 1; // Standard Extension for Quad-Precision Floating-Point + int C : 1; // Standard Extension for Compressed Instructions + int V : 1; // Standard Extension for Vector Instructions + int Zicsr : 1; // Control and Status Register (CSR) + int Zifencei : 1; // Instruction-Fetch Fence +} RiscvFeatures; + +typedef struct { + RiscvFeatures features; + char uarch[64]; // 0 terminated string + char vendor[64]; // 0 terminated string +} RiscvInfo; + +typedef enum { + RISCV_RV32I, + RISCV_RV64I, + RISCV_M, + RISCV_A, + RISCV_F, + RISCV_D, + RISCV_Q, + RISCV_C, + RISCV_V, + RISCV_Zicsr, + RISCV_Zifencei, + RISCV_LAST_, +} RiscvFeaturesEnum; + +RiscvInfo GetRiscvInfo(void); +int GetRiscvFeaturesEnumValue(const RiscvFeatures* features, + RiscvFeaturesEnum value); +const char* GetRiscvFeaturesEnumName(RiscvFeaturesEnum); + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_RISCV_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_s390x.h b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_s390x.h new file mode 100644 index 00000000..48864de3 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_s390x.h @@ -0,0 +1,108 @@ +// Copyright 2022 IBM +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_S390X_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_S390X_H_ + +#include "cpu_features_cache_info.h" +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef struct { + int esan3: 1; // instructions named N3, "backported" to esa-mode + int zarch: 1; // z/Architecture mode active + int stfle: 1; // store-facility-list-extended + int msa: 1; // message-security assist + int ldisp: 1; // long-displacement + int eimm: 1; // extended-immediate + int dfp: 1; // decimal floating point & perform floating point operation + int edat: 1; // huge page support + int etf3eh: 1; // extended-translation facility 3 enhancement + int highgprs: 1; // 64-bit register support for 31-bit processes + int te: 1; // transactional execution + int vx: 1; // vector extension facility + int vxd: 1; // vector-packed-decimal facility + int vxe: 1; // vector-enhancement facility 1 + int gs: 1; // guarded-storage facility + int vxe2: 1; // vector-enhancements facility 2 + int vxp: 1; // vector-packed-decimal-enhancement facility + int sort: 1; // enhanced-sort facility + int dflt: 1; // deflate-conversion facility + int vxp2: 1; // vector-packed-decimal-enhancement facility 2 + int nnpa: 1; // neural network processing assist facility + int pcimio: 1; // PCI mio facility + int sie: 1; // virtualization support + + // Make sure to update S390XFeaturesEnum below if you add a field here. +} S390XFeatures; + +typedef struct { + S390XFeatures features; +} S390XInfo; + +S390XInfo GetS390XInfo(void); + +typedef struct { + char platform[64]; // 0 terminated string +} S390XPlatformTypeStrings; + +typedef struct { + int num_processors; // -1 if N/A + S390XPlatformTypeStrings type; +} S390XPlatformStrings; + +S390XPlatformStrings GetS390XPlatformStrings(void); + +//////////////////////////////////////////////////////////////////////////////// +// Introspection functions + +typedef enum { + S390_ESAN3, + S390_ZARCH, + S390_STFLE, + S390_MSA, + S390_LDISP, + S390_EIMM, + S390_DFP, + S390_EDAT, + S390_ETF3EH, + S390_HIGHGPRS, + S390_TE, + S390_VX, + S390_VXD, + S390_VXE, + S390_GS, + S390_VXE2, + S390_VXP, + S390_SORT, + S390_DFLT, + S390_VXP2, + S390_NNPA, + S390_PCIMIO, + S390_SIE, + S390X_LAST_, +} S390XFeaturesEnum; + +int GetS390XFeaturesEnumValue(const S390XFeatures* features, S390XFeaturesEnum value); + +const char* GetS390XFeaturesEnumName(S390XFeaturesEnum); + +CPU_FEATURES_END_CPP_NAMESPACE + +#if !defined(CPU_FEATURES_ARCH_S390X) +#error "Including cpuinfo_s390x.h from a non-s390x target." +#endif + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_S390X_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_x86.h b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_x86.h new file mode 100644 index 00000000..e897500e --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_x86.h @@ -0,0 +1,288 @@ +// Copyright 2017 Google LLC +// Copyright 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_X86_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_X86_H_ + +#include "cpu_features_cache_info.h" +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +// CPUID Vendors +#define CPU_FEATURES_VENDOR_GENUINE_INTEL "GenuineIntel" +#define CPU_FEATURES_VENDOR_AUTHENTIC_AMD "AuthenticAMD" +#define CPU_FEATURES_VENDOR_HYGON_GENUINE "HygonGenuine" +#define CPU_FEATURES_VENDOR_CENTAUR_HAULS "CentaurHauls" +#define CPU_FEATURES_VENDOR_SHANGHAI " Shanghai " + +// See https://en.wikipedia.org/wiki/CPUID for a list of x86 cpu features. +// The field names are based on the short name provided in the wikipedia tables. +typedef struct { + int fpu : 1; + int tsc : 1; + int cx8 : 1; + int clfsh : 1; + int mmx : 1; + int aes : 1; + int erms : 1; + int f16c : 1; + int fma4 : 1; + int fma3 : 1; + int vaes : 1; + int vpclmulqdq : 1; + int bmi1 : 1; + int hle : 1; + int bmi2 : 1; + int rtm : 1; + int rdseed : 1; + int clflushopt : 1; + int clwb : 1; + + int sse : 1; + int sse2 : 1; + int sse3 : 1; + int ssse3 : 1; + int sse4_1 : 1; + int sse4_2 : 1; + int sse4a : 1; + + int avx : 1; + int avx_vnni : 1; + int avx2 : 1; + + int avx512f : 1; + int avx512cd : 1; + int avx512er : 1; + int avx512pf : 1; + int avx512bw : 1; + int avx512dq : 1; + int avx512vl : 1; + int avx512ifma : 1; + int avx512vbmi : 1; + int avx512vbmi2 : 1; + int avx512vnni : 1; + int avx512bitalg : 1; + int avx512vpopcntdq : 1; + int avx512_4vnniw : 1; + int avx512_4vbmi2 : 1; // Note: this is an alias to avx512_4fmaps. + int avx512_second_fma : 1; + int avx512_4fmaps : 1; + int avx512_bf16 : 1; + int avx512_vp2intersect : 1; + int avx512_fp16 : 1; + int amx_bf16 : 1; + int amx_tile : 1; + int amx_int8 : 1; + + int pclmulqdq : 1; + int smx : 1; + int sgx : 1; + int cx16 : 1; // aka. CMPXCHG16B + int sha : 1; + int popcnt : 1; + int movbe : 1; + int rdrnd : 1; + + int dca : 1; + int ss : 1; + int adx : 1; + int lzcnt : 1; // Note: this flag is called ABM for AMD, LZCNT for Intel. + int gfni : 1; + int movdiri : 1; + int movdir64b : 1; + int fs_rep_mov : 1; // Fast short REP MOV + int fz_rep_movsb : 1; // Fast zero-length REP MOVSB + int fs_rep_stosb : 1; // Fast short REP STOSB + int fs_rep_cmpsb_scasb : 1; // Fast short REP CMPSB/SCASB + // Make sure to update X86FeaturesEnum below if you add a field here. +} X86Features; + +typedef struct { + X86Features features; + int family; + int model; + int stepping; + char vendor[13]; // 0 terminated string + char brand_string[49]; // 0 terminated string +} X86Info; + +// Calls cpuid and returns an initialized X86info. +X86Info GetX86Info(void); + +// Returns cache hierarchy informations. +// Can call cpuid multiple times. +CacheInfo GetX86CacheInfo(void); + +typedef enum { + X86_UNKNOWN, + ZHAOXIN_ZHANGJIANG, // ZhangJiang + ZHAOXIN_WUDAOKOU, // WuDaoKou + ZHAOXIN_LUJIAZUI, // LuJiaZui + ZHAOXIN_YONGFENG, // YongFeng + INTEL_80486, // 80486 + INTEL_P5, // P5 + INTEL_LAKEMONT, // LAKEMONT + INTEL_CORE, // CORE + INTEL_PNR, // PENRYN + INTEL_NHM, // NEHALEM + INTEL_ATOM_BNL, // BONNELL + INTEL_WSM, // WESTMERE + INTEL_SNB, // SANDYBRIDGE + INTEL_IVB, // IVYBRIDGE + INTEL_ATOM_SMT, // SILVERMONT + INTEL_HSW, // HASWELL + INTEL_BDW, // BROADWELL + INTEL_SKL, // SKYLAKE + INTEL_CCL, // CASCADELAKE + INTEL_ATOM_GMT, // GOLDMONT + INTEL_ATOM_GMT_PLUS, // GOLDMONT+ + INTEL_ATOM_TMT, // TREMONT + INTEL_KBL, // KABY LAKE + INTEL_CFL, // COFFEE LAKE + INTEL_WHL, // WHISKEY LAKE + INTEL_CML, // COMET LAKE + INTEL_CNL, // CANNON LAKE + INTEL_ICL, // ICE LAKE + INTEL_TGL, // TIGER LAKE + INTEL_SPR, // SAPPHIRE RAPIDS + INTEL_ADL, // ALDER LAKE + INTEL_RCL, // ROCKET LAKE + INTEL_RPL, // RAPTOR LAKE + INTEL_KNIGHTS_M, // KNIGHTS MILL + INTEL_KNIGHTS_L, // KNIGHTS LANDING + INTEL_KNIGHTS_F, // KNIGHTS FERRY + INTEL_KNIGHTS_C, // KNIGHTS CORNER + INTEL_NETBURST, // NETBURST + AMD_HAMMER, // K8 HAMMER + AMD_K10, // K10 + AMD_K11, // K11 + AMD_K12, // K12 LLANO + AMD_BOBCAT, // K14 BOBCAT + AMD_PILEDRIVER, // K15 PILEDRIVER + AMD_STREAMROLLER, // K15 STREAMROLLER + AMD_EXCAVATOR, // K15 EXCAVATOR + AMD_BULLDOZER, // K15 BULLDOZER + AMD_JAGUAR, // K16 JAGUAR + AMD_PUMA, // K16 PUMA + AMD_ZEN, // K17 ZEN + AMD_ZEN_PLUS, // K17 ZEN+ + AMD_ZEN2, // K17 ZEN 2 + AMD_ZEN3, // K19 ZEN 3 + AMD_ZEN4, // K19 ZEN 4 + X86_MICROARCHITECTURE_LAST_, +} X86Microarchitecture; + +// Returns the underlying microarchitecture by looking at X86Info's vendor, +// family and model. +X86Microarchitecture GetX86Microarchitecture(const X86Info* info); + +// Calls cpuid and fills the brand_string. +// - brand_string *must* be of size 49 (beware of array decaying). +// - brand_string will be zero terminated. +CPU_FEATURES_DEPRECATED("brand_string is now embedded in X86Info by default") +void FillX86BrandString(char brand_string[49]); + +//////////////////////////////////////////////////////////////////////////////// +// Introspection functions + +typedef enum { + X86_FPU, + X86_TSC, + X86_CX8, + X86_CLFSH, + X86_MMX, + X86_AES, + X86_ERMS, + X86_F16C, + X86_FMA4, + X86_FMA3, + X86_VAES, + X86_VPCLMULQDQ, + X86_BMI1, + X86_HLE, + X86_BMI2, + X86_RTM, + X86_RDSEED, + X86_CLFLUSHOPT, + X86_CLWB, + X86_SSE, + X86_SSE2, + X86_SSE3, + X86_SSSE3, + X86_SSE4_1, + X86_SSE4_2, + X86_SSE4A, + X86_AVX, + X86_AVX_VNNI, + X86_AVX2, + X86_AVX512F, + X86_AVX512CD, + X86_AVX512ER, + X86_AVX512PF, + X86_AVX512BW, + X86_AVX512DQ, + X86_AVX512VL, + X86_AVX512IFMA, + X86_AVX512VBMI, + X86_AVX512VBMI2, + X86_AVX512VNNI, + X86_AVX512BITALG, + X86_AVX512VPOPCNTDQ, + X86_AVX512_4VNNIW, + X86_AVX512_4VBMI2, // Note: this is an alias to X86_AVX512_4FMAPS. + X86_AVX512_SECOND_FMA, + X86_AVX512_4FMAPS, + X86_AVX512_BF16, + X86_AVX512_VP2INTERSECT, + X86_AVX512_FP16, + X86_AMX_BF16, + X86_AMX_TILE, + X86_AMX_INT8, + X86_PCLMULQDQ, + X86_SMX, + X86_SGX, + X86_CX16, + X86_SHA, + X86_POPCNT, + X86_MOVBE, + X86_RDRND, + X86_DCA, + X86_SS, + X86_ADX, + X86_LZCNT, + X86_GFNI, + X86_MOVDIRI, + X86_MOVDIR64B, + X86_FS_REP_MOV, + X86_FZ_REP_MOVSB, + X86_FS_REP_STOSB, + X86_FS_REP_CMPSB_SCASB, + X86_LAST_, +} X86FeaturesEnum; + +int GetX86FeaturesEnumValue(const X86Features* features, X86FeaturesEnum value); + +const char* GetX86FeaturesEnumName(X86FeaturesEnum); + +const char* GetX86MicroarchitectureName(X86Microarchitecture); + +CPU_FEATURES_END_CPP_NAMESPACE + +#if !defined(CPU_FEATURES_ARCH_X86) +#error "Including cpuinfo_x86.h from a non-x86 target." +#endif + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_X86_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/internal/bit_utils.h b/node_modules/cpu-features/deps/cpu_features/include/internal/bit_utils.h new file mode 100644 index 00000000..3467ff93 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/internal/bit_utils.h @@ -0,0 +1,40 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_INTERNAL_BIT_UTILS_H_ +#define CPU_FEATURES_INCLUDE_INTERNAL_BIT_UTILS_H_ + +#include +#include +#include + +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +inline static bool IsBitSet(uint32_t reg, uint32_t bit) { + return (reg >> bit) & 0x1; +} + +inline static uint32_t ExtractBitRange(uint32_t reg, uint32_t msb, + uint32_t lsb) { + const uint64_t bits = msb - lsb + 1ULL; + const uint64_t mask = (1ULL << bits) - 1ULL; + assert(msb >= lsb); + return (reg >> lsb) & mask; +} + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_INTERNAL_BIT_UTILS_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/internal/cpuid_x86.h b/node_modules/cpu-features/deps/cpu_features/include/internal/cpuid_x86.h new file mode 100644 index 00000000..33327a47 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/internal/cpuid_x86.h @@ -0,0 +1,37 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_INTERNAL_CPUID_X86_H_ +#define CPU_FEATURES_INCLUDE_INTERNAL_CPUID_X86_H_ + +#include + +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +// A struct to hold the result of a call to cpuid. +typedef struct { + uint32_t eax, ebx, ecx, edx; +} Leaf; + +// Returns the result of a call to the cpuid instruction. +Leaf GetCpuidLeaf(uint32_t leaf_id, int ecx); + +// Returns the eax value of the XCR0 register. +uint32_t GetXCR0Eax(void); + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_INTERNAL_CPUID_X86_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/internal/filesystem.h b/node_modules/cpu-features/deps/cpu_features/include/internal/filesystem.h new file mode 100644 index 00000000..d8f2f6a4 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/internal/filesystem.h @@ -0,0 +1,39 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// An interface for the filesystem that allows mocking the filesystem in +// unittests. +#ifndef CPU_FEATURES_INCLUDE_INTERNAL_FILESYSTEM_H_ +#define CPU_FEATURES_INCLUDE_INTERNAL_FILESYSTEM_H_ + +#include +#include + +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +// Same as linux "open(filename, O_RDONLY)", retries automatically on EINTR. +int CpuFeatures_OpenFile(const char* filename); + +// Same as linux "read(file_descriptor, buffer, buffer_size)", retries +// automatically on EINTR. +int CpuFeatures_ReadFile(int file_descriptor, void* buffer, size_t buffer_size); + +// Same as linux "close(file_descriptor)". +void CpuFeatures_CloseFile(int file_descriptor); + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_INTERNAL_FILESYSTEM_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/internal/hwcaps.h b/node_modules/cpu-features/deps/cpu_features/include/internal/hwcaps.h new file mode 100644 index 00000000..3290cc9a --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/internal/hwcaps.h @@ -0,0 +1,240 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Interface to retrieve hardware capabilities. It relies on Linux's getauxval +// or `/proc/self/auxval` under the hood. +#ifndef CPU_FEATURES_INCLUDE_INTERNAL_HWCAPS_H_ +#define CPU_FEATURES_INCLUDE_INTERNAL_HWCAPS_H_ + +#include +#include + +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +// To avoid depending on the linux kernel we reproduce the architecture specific +// constants here. + +// http://elixir.free-electrons.com/linux/latest/source/arch/arm64/include/uapi/asm/hwcap.h +#define AARCH64_HWCAP_FP (1UL << 0) +#define AARCH64_HWCAP_ASIMD (1UL << 1) +#define AARCH64_HWCAP_EVTSTRM (1UL << 2) +#define AARCH64_HWCAP_AES (1UL << 3) +#define AARCH64_HWCAP_PMULL (1UL << 4) +#define AARCH64_HWCAP_SHA1 (1UL << 5) +#define AARCH64_HWCAP_SHA2 (1UL << 6) +#define AARCH64_HWCAP_CRC32 (1UL << 7) +#define AARCH64_HWCAP_ATOMICS (1UL << 8) +#define AARCH64_HWCAP_FPHP (1UL << 9) +#define AARCH64_HWCAP_ASIMDHP (1UL << 10) +#define AARCH64_HWCAP_CPUID (1UL << 11) +#define AARCH64_HWCAP_ASIMDRDM (1UL << 12) +#define AARCH64_HWCAP_JSCVT (1UL << 13) +#define AARCH64_HWCAP_FCMA (1UL << 14) +#define AARCH64_HWCAP_LRCPC (1UL << 15) +#define AARCH64_HWCAP_DCPOP (1UL << 16) +#define AARCH64_HWCAP_SHA3 (1UL << 17) +#define AARCH64_HWCAP_SM3 (1UL << 18) +#define AARCH64_HWCAP_SM4 (1UL << 19) +#define AARCH64_HWCAP_ASIMDDP (1UL << 20) +#define AARCH64_HWCAP_SHA512 (1UL << 21) +#define AARCH64_HWCAP_SVE (1UL << 22) +#define AARCH64_HWCAP_ASIMDFHM (1UL << 23) +#define AARCH64_HWCAP_DIT (1UL << 24) +#define AARCH64_HWCAP_USCAT (1UL << 25) +#define AARCH64_HWCAP_ILRCPC (1UL << 26) +#define AARCH64_HWCAP_FLAGM (1UL << 27) +#define AARCH64_HWCAP_SSBS (1UL << 28) +#define AARCH64_HWCAP_SB (1UL << 29) +#define AARCH64_HWCAP_PACA (1UL << 30) +#define AARCH64_HWCAP_PACG (1UL << 31) + +#define AARCH64_HWCAP2_DCPODP (1UL << 0) +#define AARCH64_HWCAP2_SVE2 (1UL << 1) +#define AARCH64_HWCAP2_SVEAES (1UL << 2) +#define AARCH64_HWCAP2_SVEPMULL (1UL << 3) +#define AARCH64_HWCAP2_SVEBITPERM (1UL << 4) +#define AARCH64_HWCAP2_SVESHA3 (1UL << 5) +#define AARCH64_HWCAP2_SVESM4 (1UL << 6) +#define AARCH64_HWCAP2_FLAGM2 (1UL << 7) +#define AARCH64_HWCAP2_FRINT (1UL << 8) +#define AARCH64_HWCAP2_SVEI8MM (1UL << 9) +#define AARCH64_HWCAP2_SVEF32MM (1UL << 10) +#define AARCH64_HWCAP2_SVEF64MM (1UL << 11) +#define AARCH64_HWCAP2_SVEBF16 (1UL << 12) +#define AARCH64_HWCAP2_I8MM (1UL << 13) +#define AARCH64_HWCAP2_BF16 (1UL << 14) +#define AARCH64_HWCAP2_DGH (1UL << 15) +#define AARCH64_HWCAP2_RNG (1UL << 16) +#define AARCH64_HWCAP2_BTI (1UL << 17) +#define AARCH64_HWCAP2_MTE (1UL << 18) +#define AARCH64_HWCAP2_ECV (1UL << 19) +#define AARCH64_HWCAP2_AFP (1UL << 20) +#define AARCH64_HWCAP2_RPRES (1UL << 21) + +// http://elixir.free-electrons.com/linux/latest/source/arch/arm/include/uapi/asm/hwcap.h +#define ARM_HWCAP_SWP (1UL << 0) +#define ARM_HWCAP_HALF (1UL << 1) +#define ARM_HWCAP_THUMB (1UL << 2) +#define ARM_HWCAP_26BIT (1UL << 3) +#define ARM_HWCAP_FAST_MULT (1UL << 4) +#define ARM_HWCAP_FPA (1UL << 5) +#define ARM_HWCAP_VFP (1UL << 6) +#define ARM_HWCAP_EDSP (1UL << 7) +#define ARM_HWCAP_JAVA (1UL << 8) +#define ARM_HWCAP_IWMMXT (1UL << 9) +#define ARM_HWCAP_CRUNCH (1UL << 10) +#define ARM_HWCAP_THUMBEE (1UL << 11) +#define ARM_HWCAP_NEON (1UL << 12) +#define ARM_HWCAP_VFPV3 (1UL << 13) +#define ARM_HWCAP_VFPV3D16 (1UL << 14) +#define ARM_HWCAP_TLS (1UL << 15) +#define ARM_HWCAP_VFPV4 (1UL << 16) +#define ARM_HWCAP_IDIVA (1UL << 17) +#define ARM_HWCAP_IDIVT (1UL << 18) +#define ARM_HWCAP_VFPD32 (1UL << 19) +#define ARM_HWCAP_LPAE (1UL << 20) +#define ARM_HWCAP_EVTSTRM (1UL << 21) +#define ARM_HWCAP2_AES (1UL << 0) +#define ARM_HWCAP2_PMULL (1UL << 1) +#define ARM_HWCAP2_SHA1 (1UL << 2) +#define ARM_HWCAP2_SHA2 (1UL << 3) +#define ARM_HWCAP2_CRC32 (1UL << 4) + +// http://elixir.free-electrons.com/linux/latest/source/arch/mips/include/uapi/asm/hwcap.h +#define MIPS_HWCAP_R6 (1UL << 0) +#define MIPS_HWCAP_MSA (1UL << 1) +#define MIPS_HWCAP_CRC32 (1UL << 2) +#define MIPS_HWCAP_MIPS16 (1UL << 3) +#define MIPS_HWCAP_MDMX (1UL << 4) +#define MIPS_HWCAP_MIPS3D (1UL << 5) +#define MIPS_HWCAP_SMARTMIPS (1UL << 6) +#define MIPS_HWCAP_DSP (1UL << 7) +#define MIPS_HWCAP_DSP2 (1UL << 8) +#define MIPS_HWCAP_DSP3 (1UL << 9) + +// http://elixir.free-electrons.com/linux/latest/source/arch/powerpc/include/uapi/asm/cputable.h +#ifndef _UAPI__ASM_POWERPC_CPUTABLE_H +/* in AT_HWCAP */ +#define PPC_FEATURE_32 0x80000000 +#define PPC_FEATURE_64 0x40000000 +#define PPC_FEATURE_601_INSTR 0x20000000 +#define PPC_FEATURE_HAS_ALTIVEC 0x10000000 +#define PPC_FEATURE_HAS_FPU 0x08000000 +#define PPC_FEATURE_HAS_MMU 0x04000000 +#define PPC_FEATURE_HAS_4xxMAC 0x02000000 +#define PPC_FEATURE_UNIFIED_CACHE 0x01000000 +#define PPC_FEATURE_HAS_SPE 0x00800000 +#define PPC_FEATURE_HAS_EFP_SINGLE 0x00400000 +#define PPC_FEATURE_HAS_EFP_DOUBLE 0x00200000 +#define PPC_FEATURE_NO_TB 0x00100000 +#define PPC_FEATURE_POWER4 0x00080000 +#define PPC_FEATURE_POWER5 0x00040000 +#define PPC_FEATURE_POWER5_PLUS 0x00020000 +#define PPC_FEATURE_CELL 0x00010000 +#define PPC_FEATURE_BOOKE 0x00008000 +#define PPC_FEATURE_SMT 0x00004000 +#define PPC_FEATURE_ICACHE_SNOOP 0x00002000 +#define PPC_FEATURE_ARCH_2_05 0x00001000 +#define PPC_FEATURE_PA6T 0x00000800 +#define PPC_FEATURE_HAS_DFP 0x00000400 +#define PPC_FEATURE_POWER6_EXT 0x00000200 +#define PPC_FEATURE_ARCH_2_06 0x00000100 +#define PPC_FEATURE_HAS_VSX 0x00000080 + +#define PPC_FEATURE_PSERIES_PERFMON_COMPAT 0x00000040 + +/* Reserved - do not use 0x00000004 */ +#define PPC_FEATURE_TRUE_LE 0x00000002 +#define PPC_FEATURE_PPC_LE 0x00000001 + +/* in AT_HWCAP2 */ +#define PPC_FEATURE2_ARCH_2_07 0x80000000 +#define PPC_FEATURE2_HTM 0x40000000 +#define PPC_FEATURE2_DSCR 0x20000000 +#define PPC_FEATURE2_EBB 0x10000000 +#define PPC_FEATURE2_ISEL 0x08000000 +#define PPC_FEATURE2_TAR 0x04000000 +#define PPC_FEATURE2_VEC_CRYPTO 0x02000000 +#define PPC_FEATURE2_HTM_NOSC 0x01000000 +#define PPC_FEATURE2_ARCH_3_00 0x00800000 +#define PPC_FEATURE2_HAS_IEEE128 0x00400000 +#define PPC_FEATURE2_DARN 0x00200000 +#define PPC_FEATURE2_SCV 0x00100000 +#define PPC_FEATURE2_HTM_NO_SUSPEND 0x00080000 +#endif + +// https://elixir.bootlin.com/linux/v6.0-rc6/source/arch/s390/include/asm/elf.h +#define HWCAP_S390_ESAN3 1 +#define HWCAP_S390_ZARCH 2 +#define HWCAP_S390_STFLE 4 +#define HWCAP_S390_MSA 8 +#define HWCAP_S390_LDISP 16 +#define HWCAP_S390_EIMM 32 +#define HWCAP_S390_DFP 64 +#define HWCAP_S390_HPAGE 128 +#define HWCAP_S390_ETF3EH 256 +#define HWCAP_S390_HIGH_GPRS 512 +#define HWCAP_S390_TE 1024 +#define HWCAP_S390_VX 2048 +#define HWCAP_S390_VXRS HWCAP_S390_VX +#define HWCAP_S390_VXD 4096 +#define HWCAP_S390_VXRS_BCD HWCAP_S390_VXD +#define HWCAP_S390_VXE 8192 +#define HWCAP_S390_VXRS_EXT HWCAP_S390_VXE +#define HWCAP_S390_GS 16384 +#define HWCAP_S390_VXRS_EXT2 32768 +#define HWCAP_S390_VXRS_PDE 65536 +#define HWCAP_S390_SORT 131072 +#define HWCAP_S390_DFLT 262144 +#define HWCAP_S390_VXRS_PDE2 524288 +#define HWCAP_S390_NNPA 1048576 +#define HWCAP_S390_PCI_MIO 2097152 +#define HWCAP_S390_SIE 4194304 + +// https://elixir.bootlin.com/linux/latest/source/arch/riscv/include/uapi/asm/hwcap.h +#define RISCV_HWCAP_32 0x32 +#define RISCV_HWCAP_64 0x64 +#define RISCV_HWCAP_128 0x128 +#define RISCV_HWCAP_M (1UL << ('M' - 'A')) +#define RISCV_HWCAP_A (1UL << ('A' - 'A')) +#define RISCV_HWCAP_F (1UL << ('F' - 'A')) +#define RISCV_HWCAP_D (1UL << ('D' - 'A')) +#define RISCV_HWCAP_Q (1UL << ('Q' - 'A')) +#define RISCV_HWCAP_C (1UL << ('C' - 'A')) +#define RISCV_HWCAP_V (1UL << ('V' - 'A')) + +typedef struct { + unsigned long hwcaps; + unsigned long hwcaps2; +} HardwareCapabilities; + +// Retrieves values from auxiliary vector for types AT_HWCAP and AT_HWCAP2. +// First tries to call getauxval(), if not available falls back to reading +// "/proc/self/auxv". +HardwareCapabilities CpuFeatures_GetHardwareCapabilities(void); + +// Checks whether value for AT_HWCAP (or AT_HWCAP2) match hwcaps_mask. +bool CpuFeatures_IsHwCapsSet(const HardwareCapabilities hwcaps_mask, + const HardwareCapabilities hwcaps); + +// Get pointer for the AT_PLATFORM type. +const char* CpuFeatures_GetPlatformPointer(void); +// Get pointer for the AT_BASE_PLATFORM type. +const char* CpuFeatures_GetBasePlatformPointer(void); + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_INTERNAL_HWCAPS_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/internal/stack_line_reader.h b/node_modules/cpu-features/deps/cpu_features/include/internal/stack_line_reader.h new file mode 100644 index 00000000..39c1b8ba --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/internal/stack_line_reader.h @@ -0,0 +1,49 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Reads a file line by line and stores the data on the stack. This allows +// parsing files in one go without allocating. +#ifndef CPU_FEATURES_INCLUDE_INTERNAL_STACK_LINE_READER_H_ +#define CPU_FEATURES_INCLUDE_INTERNAL_STACK_LINE_READER_H_ + +#include + +#include "cpu_features_macros.h" +#include "internal/string_view.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef struct { + char buffer[STACK_LINE_READER_BUFFER_SIZE]; + StringView view; + int fd; + bool skip_mode; +} StackLineReader; + +// Initializes a StackLineReader. +void StackLineReader_Initialize(StackLineReader* reader, int fd); + +typedef struct { + StringView line; // A view of the line. + bool eof; // Nothing more to read, we reached EOF. + bool full_line; // If false the line was truncated to + // STACK_LINE_READER_BUFFER_SIZE. +} LineResult; + +// Reads the file pointed to by fd and tries to read a full line. +LineResult StackLineReader_NextLine(StackLineReader* reader); + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_INTERNAL_STACK_LINE_READER_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/internal/string_view.h b/node_modules/cpu-features/deps/cpu_features/include/internal/string_view.h new file mode 100644 index 00000000..a109d455 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/internal/string_view.h @@ -0,0 +1,110 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// A view over a piece of string. The view is not 0 terminated. +#ifndef CPU_FEATURES_INCLUDE_INTERNAL_STRING_VIEW_H_ +#define CPU_FEATURES_INCLUDE_INTERNAL_STRING_VIEW_H_ + +#include +#include +#include + +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef struct { + const char* ptr; + size_t size; +} StringView; + +#ifdef __cplusplus +static const StringView kEmptyStringView = {NULL, 0}; +#else +static const StringView kEmptyStringView; +#endif + +// Returns a StringView from the provided string. +// Passing NULL is valid only if size is 0. +static inline StringView view(const char* str, const size_t size) { + StringView view; + view.ptr = str; + view.size = size; + return view; +} + +static inline StringView str(const char* str) { return view(str, strlen(str)); } + +// Returns the index of the first occurrence of c in view or -1 if not found. +int CpuFeatures_StringView_IndexOfChar(const StringView view, char c); + +// Returns the index of the first occurrence of sub_view in view or -1 if not +// found. +int CpuFeatures_StringView_IndexOf(const StringView view, + const StringView sub_view); + +// Returns whether a is equal to b (same content). +bool CpuFeatures_StringView_IsEquals(const StringView a, const StringView b); + +// Returns whether a starts with b. +bool CpuFeatures_StringView_StartsWith(const StringView a, const StringView b); + +// Removes count characters from the beginning of view or kEmptyStringView if +// count if greater than view.size. +StringView CpuFeatures_StringView_PopFront(const StringView str_view, + size_t count); + +// Removes count characters from the end of view or kEmptyStringView if count if +// greater than view.size. +StringView CpuFeatures_StringView_PopBack(const StringView str_view, + size_t count); + +// Keeps the count first characters of view or view if count if greater than +// view.size. +StringView CpuFeatures_StringView_KeepFront(const StringView str_view, + size_t count); + +// Retrieves the first character of view. If view is empty the behavior is +// undefined. +char CpuFeatures_StringView_Front(const StringView view); + +// Retrieves the last character of view. If view is empty the behavior is +// undefined. +char CpuFeatures_StringView_Back(const StringView view); + +// Removes leading and tailing space characters. +StringView CpuFeatures_StringView_TrimWhitespace(StringView view); + +// Convert StringView to positive integer. e.g. "42", "0x2a". +// Returns -1 on error. +int CpuFeatures_StringView_ParsePositiveNumber(const StringView view); + +// Copies src StringView to dst buffer. +void CpuFeatures_StringView_CopyString(const StringView src, char* dst, + size_t dst_size); + +// Checks if line contains the specified whitespace separated word. +bool CpuFeatures_StringView_HasWord(const StringView line, + const char* const word, + const char separator); + +// Get key/value from line. key and value are separated by ": ". +// key and value are cleaned up from leading and trailing whitespaces. +bool CpuFeatures_StringView_GetAttributeKeyValue(const StringView line, + StringView* key, + StringView* value); + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_INTERNAL_STRING_VIEW_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/include/internal/windows_utils.h b/node_modules/cpu-features/deps/cpu_features/include/internal/windows_utils.h new file mode 100644 index 00000000..3348c524 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/include/internal/windows_utils.h @@ -0,0 +1,70 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_INTERNAL_WINDOWS_UTILS_H_ +#define CPU_FEATURES_INCLUDE_INTERNAL_WINDOWS_UTILS_H_ + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_OS_WINDOWS + +#include // IsProcessorFeaturePresent + +// modern WinSDK winnt.h contains newer features detection definitions +#if !defined(PF_SSSE3_INSTRUCTIONS_AVAILABLE) +#define PF_SSSE3_INSTRUCTIONS_AVAILABLE 36 +#endif + +#if !defined(PF_SSE4_1_INSTRUCTIONS_AVAILABLE) +#define PF_SSE4_1_INSTRUCTIONS_AVAILABLE 37 +#endif + +#if !defined(PF_SSE4_2_INSTRUCTIONS_AVAILABLE) +#define PF_SSE4_2_INSTRUCTIONS_AVAILABLE 38 +#endif + +#if !defined(PF_ARM_VFP_32_REGISTERS_AVAILABLE) +#define PF_ARM_VFP_32_REGISTERS_AVAILABLE 18 +#endif + +#if !defined(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) +#define PF_ARM_NEON_INSTRUCTIONS_AVAILABLE 19 +#endif + +#if !defined(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) +#define PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE 30 +#endif + +#if !defined(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) +#define PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE 31 +#endif + +#if !defined(PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE) +#define PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE 34 +#endif + +#if !defined(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE) +#define PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE 43 +#endif + +#if !defined(PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE) +#define PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE 44 +#endif + +#if !defined(PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE) +#define PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE 45 +#endif + +#endif // CPU_FEATURES_OS_WINDOWS +#endif // CPU_FEATURES_INCLUDE_INTERNAL_WINDOWS_UTILS_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/ndk_compat/CMakeLists.txt b/node_modules/cpu-features/deps/cpu_features/ndk_compat/CMakeLists.txt new file mode 100644 index 00000000..37b38663 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/ndk_compat/CMakeLists.txt @@ -0,0 +1,60 @@ + +# +# library : NDK compat +# +find_package(Threads REQUIRED) +set (NDK_COMPAT_HDRS cpu-features.h) +set (NDK_COMPAT_SRCS + cpu-features.c + $ + $ +) +# Note that following `add_cpu_features_headers_and_sources` will use +# NDK_COMPAT_SRCS in lieu of NDK_COMPAT_HDRS because we don't want cpu_features +# headers to be installed alongside ndk_compat. +add_cpu_features_headers_and_sources(NDK_COMPAT_SRCS NDK_COMPAT_SRCS) +add_library(ndk_compat ${NDK_COMPAT_HDRS} ${NDK_COMPAT_SRCS}) +setup_include_and_definitions(ndk_compat) +target_include_directories(ndk_compat PUBLIC $) +target_link_libraries(ndk_compat PUBLIC ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT}) +set_target_properties(ndk_compat PROPERTIES PUBLIC_HEADER "${NDK_COMPAT_HDRS}") + +include(GNUInstallDirs) +install(TARGETS ndk_compat + EXPORT CpuFeaturesNdkCompatTargets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ndk_compat + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) +install(EXPORT CpuFeaturesNdkCompatTargets + NAMESPACE CpuFeatures:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeaturesNdkCompat + COMPONENT Devel +) +include(CMakePackageConfigHelpers) +configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/CpuFeaturesNdkCompatConfig.cmake.in + "${PROJECT_BINARY_DIR}/CpuFeaturesNdkCompatConfig.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeaturesNdkCompat" + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO +) +write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/CpuFeaturesNdkCompatConfigVersion.cmake" + COMPATIBILITY SameMajorVersion +) +install( + FILES + "${PROJECT_BINARY_DIR}/CpuFeaturesNdkCompatConfig.cmake" + "${PROJECT_BINARY_DIR}/CpuFeaturesNdkCompatConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeaturesNdkCompat" + COMPONENT Devel +) + +# +# program : NDK compat test program +# +if(BUILD_TESTING) + add_executable(ndk-compat-test ndk-compat-test.c) + target_link_libraries(ndk-compat-test PRIVATE ndk_compat) +endif() diff --git a/node_modules/cpu-features/deps/cpu_features/ndk_compat/README.md b/node_modules/cpu-features/deps/cpu_features/ndk_compat/README.md new file mode 100644 index 00000000..38c83937 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/ndk_compat/README.md @@ -0,0 +1,4 @@ +Provides a header compatible with [android's NDK cpu-features.h](https://android.googlesource.com/platform/ndk/+/master/sources/android/cpufeatures/cpu-features.h). + +It is intended to be a drop in replacement for this header and help users +transition from the NDK to [Google's cpu_features library](https://github.com/google/cpu_features). diff --git a/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.c b/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.c new file mode 100644 index 00000000..27ff7bbd --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.c @@ -0,0 +1,205 @@ +#include "cpu-features.h" + +#include + +#include "cpu_features_macros.h" +#include "internal/filesystem.h" +#include "internal/stack_line_reader.h" +#include "internal/string_view.h" + +#if defined(CPU_FEATURES_ARCH_ARM) +#include "cpuinfo_arm.h" +#elif defined(CPU_FEATURES_ARCH_X86) +#include "cpuinfo_x86.h" +#elif defined(CPU_FEATURES_ARCH_MIPS) +#include "cpuinfo_mips.h" +#elif defined(CPU_FEATURES_ARCH_AARCH64) +#include "cpuinfo_aarch64.h" +#endif + +static pthread_once_t g_once; +static int g_inited; +static uint64_t g_cpuFeatures; +static int g_cpuCount; + +#ifdef CPU_FEATURES_ARCH_ARM +static uint32_t g_cpuIdArm; +#endif + +static void set_cpu_mask_bit(uint32_t index, uint32_t* cpu_mask) { + *cpu_mask |= 1UL << index; +} + +// Examples of valid inputs: "31", "4-31" +static void parse_cpu_mask(const StringView text, uint32_t* cpu_mask) { + int separator_index = CpuFeatures_StringView_IndexOfChar(text, '-'); + if (separator_index < 0) { // A single cpu index + int cpu_index = CpuFeatures_StringView_ParsePositiveNumber(text); + if (cpu_index < 0) return; + set_cpu_mask_bit(cpu_index, cpu_mask); + } else { + int cpu_index_a = CpuFeatures_StringView_ParsePositiveNumber( + CpuFeatures_StringView_KeepFront(text, separator_index)); + int cpu_index_b = CpuFeatures_StringView_ParsePositiveNumber( + CpuFeatures_StringView_PopFront(text, separator_index + 1)); + int i; + if (cpu_index_a < 0 || cpu_index_b < 0) return; + for (i = cpu_index_a; i <= cpu_index_b; ++i) { + if (i < 32) { + set_cpu_mask_bit(i, cpu_mask); + } + } + } +} + +// Format specification from +// https://www.kernel.org/doc/Documentation/cputopology.txt +// Examples of valid inputs: "31", "2,4-31,32-63", "0-1,3" +static void parse_cpu_mask_line(const LineResult result, uint32_t* cpu_mask) { + if (!result.full_line || result.eof) return; + StringView line = result.line; + for (; line.size > 0;) { + int next_entry_index = CpuFeatures_StringView_IndexOfChar(line, ','); + if (next_entry_index < 0) { + parse_cpu_mask(line, cpu_mask); + break; + } + StringView entry = CpuFeatures_StringView_KeepFront(line, next_entry_index); + parse_cpu_mask(entry, cpu_mask); + line = CpuFeatures_StringView_PopFront(line, next_entry_index + 1); + } +} + +static void update_cpu_mask_from_file(const char* filename, + uint32_t* cpu_mask) { + const int fd = CpuFeatures_OpenFile(filename); + if (fd >= 0) { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + parse_cpu_mask_line(StackLineReader_NextLine(&reader), cpu_mask); + CpuFeatures_CloseFile(fd); + } +} + +static int get_cpu_count(void) { + uint32_t cpu_mask = 0; + update_cpu_mask_from_file("/sys/devices/system/cpu/present", &cpu_mask); + update_cpu_mask_from_file("/sys/devices/system/cpu/possible", &cpu_mask); + return __builtin_popcount(cpu_mask); +} + +static void android_cpuInit(void) { + g_cpuFeatures = 0; + g_cpuCount = 1; + g_inited = 1; + + g_cpuCount = get_cpu_count(); + if (g_cpuCount == 0) { + g_cpuCount = 1; + } +#if defined(CPU_FEATURES_ARCH_ARM) + ArmInfo info = GetArmInfo(); + if (info.architecture == 7) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_ARMv7; + if (info.features.vfpv3) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFPv3; + if (info.features.neon) { + g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_NEON; + g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFP_D32; + } + if (info.features.vfpv3d16) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFP_FP16; + if (info.features.idiva) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_IDIV_ARM; + if (info.features.idivt) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2; + if (info.features.iwmmxt) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_iWMMXt; + if (info.features.aes) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_AES; + if (info.features.pmull) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_PMULL; + if (info.features.sha1) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_SHA1; + if (info.features.sha2) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_SHA2; + if (info.features.crc32) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_CRC32; + if (info.architecture >= 6) + g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_LDREX_STREX; + if (info.features.vfp) g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFPv2; + if (info.features.vfpv4) { + g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFP_FMA; + g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_NEON_FMA; + } + g_cpuIdArm = GetArmCpuId(&info); +#elif defined(CPU_FEATURES_ARCH_X86) + X86Info info = GetX86Info(); + if (info.features.ssse3) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SSSE3; + if (info.features.popcnt) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_POPCNT; + if (info.features.movbe) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_MOVBE; + if (info.features.sse4_1) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SSE4_1; + if (info.features.sse4_2) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SSE4_2; + if (info.features.aes) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_AES_NI; + if (info.features.avx) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_AVX; + if (info.features.rdrnd) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_RDRAND; + if (info.features.avx2) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_AVX2; + if (info.features.sha) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SHA_NI; +#elif defined(CPU_FEATURES_ARCH_MIPS) + MipsInfo info = GetMipsInfo(); + if (info.features.r6) g_cpuFeatures |= ANDROID_CPU_MIPS_FEATURE_R6; + if (info.features.msa) g_cpuFeatures |= ANDROID_CPU_MIPS_FEATURE_MSA; +#elif defined(CPU_FEATURES_ARCH_AARCH64) + Aarch64Info info = GetAarch64Info(); + if (info.features.fp) g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_FP; + if (info.features.asimd) g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_ASIMD; + if (info.features.aes) g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_AES; + if (info.features.pmull) g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_PMULL; + if (info.features.sha1) g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_SHA1; + if (info.features.sha2) g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_SHA2; + if (info.features.crc32) g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_CRC32; +#endif +} + +AndroidCpuFamily android_getCpuFamily(void) { +#if defined(CPU_FEATURES_ARCH_ARM) + return ANDROID_CPU_FAMILY_ARM; +#elif defined(CPU_FEATURES_ARCH_X86_32) + return ANDROID_CPU_FAMILY_X86; +#elif defined(CPU_FEATURES_ARCH_MIPS64) + return ANDROID_CPU_FAMILY_MIPS64; +#elif defined(CPU_FEATURES_ARCH_MIPS32) + return ANDROID_CPU_FAMILY_MIPS; +#elif defined(CPU_FEATURES_ARCH_AARCH64) + return ANDROID_CPU_FAMILY_ARM64; +#elif defined(CPU_FEATURES_ARCH_X86_64) + return ANDROID_CPU_FAMILY_X86_64; +#else + return ANDROID_CPU_FAMILY_UNKNOWN; +#endif +} + +uint64_t android_getCpuFeatures(void) { + pthread_once(&g_once, android_cpuInit); + return g_cpuFeatures; +} + +int android_getCpuCount(void) { + pthread_once(&g_once, android_cpuInit); + return g_cpuCount; +} + +static void android_cpuInitDummy(void) { g_inited = 1; } + +int android_setCpu(int cpu_count, uint64_t cpu_features) { + /* Fail if the library was already initialized. */ + if (g_inited) return 0; + g_cpuCount = (cpu_count <= 0 ? 1 : cpu_count); + g_cpuFeatures = cpu_features; + pthread_once(&g_once, android_cpuInitDummy); + return 1; +} + +#ifdef CPU_FEATURES_ARCH_ARM + +uint32_t android_getCpuIdArm(void) { + pthread_once(&g_once, android_cpuInit); + return g_cpuIdArm; +} + +int android_setCpuArm(int cpu_count, uint64_t cpu_features, uint32_t cpu_id) { + if (!android_setCpu(cpu_count, cpu_features)) return 0; + g_cpuIdArm = cpu_id; + return 1; +} + +#endif // CPU_FEATURES_ARCH_ARM diff --git a/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.h b/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.h new file mode 100644 index 00000000..51bea538 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.h @@ -0,0 +1,320 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef GOOGLE_CPU_FEATURES_H +#define GOOGLE_CPU_FEATURES_H +#include +#include + +__BEGIN_DECLS + +/* A list of valid values returned by android_getCpuFamily(). + * They describe the CPU Architecture of the current process. + */ +typedef enum { + ANDROID_CPU_FAMILY_UNKNOWN = 0, + ANDROID_CPU_FAMILY_ARM, + ANDROID_CPU_FAMILY_X86, + ANDROID_CPU_FAMILY_MIPS, + ANDROID_CPU_FAMILY_ARM64, + ANDROID_CPU_FAMILY_X86_64, + ANDROID_CPU_FAMILY_MIPS64, + ANDROID_CPU_FAMILY_MAX /* do not remove */ +} AndroidCpuFamily; + +/* Return the CPU family of the current process. + * + * Note that this matches the bitness of the current process. I.e. when + * running a 32-bit binary on a 64-bit capable CPU, this will return the + * 32-bit CPU family value. + */ +extern AndroidCpuFamily android_getCpuFamily(void); + +/* Return a bitmap describing a set of optional CPU features that are + * supported by the current device's CPU. The exact bit-flags returned + * depend on the value returned by android_getCpuFamily(). See the + * documentation for the ANDROID_CPU_*_FEATURE_* flags below for details. + */ +extern uint64_t android_getCpuFeatures(void); + +/* The list of feature flags for ANDROID_CPU_FAMILY_ARM that can be + * recognized by the library (see note below for 64-bit ARM). Value details + * are: + * + * VFPv2: + * CPU supports the VFPv2 instruction set. Many, but not all, ARMv6 CPUs + * support these instructions. VFPv2 is a subset of VFPv3 so this will + * be set whenever VFPv3 is set too. + * + * ARMv7: + * CPU supports the ARMv7-A basic instruction set. + * This feature is mandated by the 'armeabi-v7a' ABI. + * + * VFPv3: + * CPU supports the VFPv3-D16 instruction set, providing hardware FPU + * support for single and double precision floating point registers. + * Note that only 16 FPU registers are available by default, unless + * the D32 bit is set too. This feature is also mandated by the + * 'armeabi-v7a' ABI. + * + * VFP_D32: + * CPU VFP optional extension that provides 32 FPU registers, + * instead of 16. Note that ARM mandates this feature is the 'NEON' + * feature is implemented by the CPU. + * + * NEON: + * CPU FPU supports "ARM Advanced SIMD" instructions, also known as + * NEON. Note that this mandates the VFP_D32 feature as well, per the + * ARM Architecture specification. + * + * VFP_FP16: + * Half-width floating precision VFP extension. If set, the CPU + * supports instructions to perform floating-point operations on + * 16-bit registers. This is part of the VFPv4 specification, but + * not mandated by any Android ABI. + * + * VFP_FMA: + * Fused multiply-accumulate VFP instructions extension. Also part of + * the VFPv4 specification, but not mandated by any Android ABI. + * + * NEON_FMA: + * Fused multiply-accumulate NEON instructions extension. Optional + * extension from the VFPv4 specification, but not mandated by any + * Android ABI. + * + * IDIV_ARM: + * Integer division available in ARM mode. Only available + * on recent CPUs (e.g. Cortex-A15). + * + * IDIV_THUMB2: + * Integer division available in Thumb-2 mode. Only available + * on recent CPUs (e.g. Cortex-A15). + * + * iWMMXt: + * Optional extension that adds MMX registers and operations to an + * ARM CPU. This is only available on a few XScale-based CPU designs + * sold by Marvell. Pretty rare in practice. + * + * AES: + * CPU supports AES instructions. These instructions are only + * available for 32-bit applications running on ARMv8 CPU. + * + * CRC32: + * CPU supports CRC32 instructions. These instructions are only + * available for 32-bit applications running on ARMv8 CPU. + * + * SHA2: + * CPU supports SHA2 instructions. These instructions are only + * available for 32-bit applications running on ARMv8 CPU. + * + * SHA1: + * CPU supports SHA1 instructions. These instructions are only + * available for 32-bit applications running on ARMv8 CPU. + * + * PMULL: + * CPU supports 64-bit PMULL and PMULL2 instructions. These + * instructions are only available for 32-bit applications + * running on ARMv8 CPU. + * + * If you want to tell the compiler to generate code that targets one of + * the feature set above, you should probably use one of the following + * flags (for more details, see technical note at the end of this file): + * + * -mfpu=vfp + * -mfpu=vfpv2 + * These are equivalent and tell GCC to use VFPv2 instructions for + * floating-point operations. Use this if you want your code to + * run on *some* ARMv6 devices, and any ARMv7-A device supported + * by Android. + * + * Generated code requires VFPv2 feature. + * + * -mfpu=vfpv3-d16 + * Tell GCC to use VFPv3 instructions (using only 16 FPU registers). + * This should be generic code that runs on any CPU that supports the + * 'armeabi-v7a' Android ABI. Note that no ARMv6 CPU supports this. + * + * Generated code requires VFPv3 feature. + * + * -mfpu=vfpv3 + * Tell GCC to use VFPv3 instructions with 32 FPU registers. + * Generated code requires VFPv3|VFP_D32 features. + * + * -mfpu=neon + * Tell GCC to use VFPv3 instructions with 32 FPU registers, and + * also support NEON intrinsics (see ). + * Generated code requires VFPv3|VFP_D32|NEON features. + * + * -mfpu=vfpv4-d16 + * Generated code requires VFPv3|VFP_FP16|VFP_FMA features. + * + * -mfpu=vfpv4 + * Generated code requires VFPv3|VFP_FP16|VFP_FMA|VFP_D32 features. + * + * -mfpu=neon-vfpv4 + * Generated code requires VFPv3|VFP_FP16|VFP_FMA|VFP_D32|NEON|NEON_FMA + * features. + * + * -mcpu=cortex-a7 + * -mcpu=cortex-a15 + * Generated code requires VFPv3|VFP_FP16|VFP_FMA|VFP_D32| + * NEON|NEON_FMA|IDIV_ARM|IDIV_THUMB2 + * This flag implies -mfpu=neon-vfpv4. + * + * -mcpu=iwmmxt + * Allows the use of iWMMXt instrinsics with GCC. + * + * IMPORTANT NOTE: These flags should only be tested when + * android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM, i.e. this is a + * 32-bit process. + * + * When running a 64-bit ARM process on an ARMv8 CPU, + * android_getCpuFeatures() will return a different set of bitflags + */ +enum { + ANDROID_CPU_ARM_FEATURE_ARMv7 = (1 << 0), + ANDROID_CPU_ARM_FEATURE_VFPv3 = (1 << 1), + ANDROID_CPU_ARM_FEATURE_NEON = (1 << 2), + ANDROID_CPU_ARM_FEATURE_LDREX_STREX = (1 << 3), + ANDROID_CPU_ARM_FEATURE_VFPv2 = (1 << 4), + ANDROID_CPU_ARM_FEATURE_VFP_D32 = (1 << 5), + ANDROID_CPU_ARM_FEATURE_VFP_FP16 = (1 << 6), + ANDROID_CPU_ARM_FEATURE_VFP_FMA = (1 << 7), + ANDROID_CPU_ARM_FEATURE_NEON_FMA = (1 << 8), + ANDROID_CPU_ARM_FEATURE_IDIV_ARM = (1 << 9), + ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2 = (1 << 10), + ANDROID_CPU_ARM_FEATURE_iWMMXt = (1 << 11), + ANDROID_CPU_ARM_FEATURE_AES = (1 << 12), + ANDROID_CPU_ARM_FEATURE_PMULL = (1 << 13), + ANDROID_CPU_ARM_FEATURE_SHA1 = (1 << 14), + ANDROID_CPU_ARM_FEATURE_SHA2 = (1 << 15), + ANDROID_CPU_ARM_FEATURE_CRC32 = (1 << 16), +}; + +/* The bit flags corresponding to the output of android_getCpuFeatures() + * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM64. Value details + * are: + * + * FP: + * CPU has Floating-point unit. + * + * ASIMD: + * CPU has Advanced SIMD unit. + * + * AES: + * CPU supports AES instructions. + * + * CRC32: + * CPU supports CRC32 instructions. + * + * SHA2: + * CPU supports SHA2 instructions. + * + * SHA1: + * CPU supports SHA1 instructions. + * + * PMULL: + * CPU supports 64-bit PMULL and PMULL2 instructions. + */ +enum { + ANDROID_CPU_ARM64_FEATURE_FP = (1 << 0), + ANDROID_CPU_ARM64_FEATURE_ASIMD = (1 << 1), + ANDROID_CPU_ARM64_FEATURE_AES = (1 << 2), + ANDROID_CPU_ARM64_FEATURE_PMULL = (1 << 3), + ANDROID_CPU_ARM64_FEATURE_SHA1 = (1 << 4), + ANDROID_CPU_ARM64_FEATURE_SHA2 = (1 << 5), + ANDROID_CPU_ARM64_FEATURE_CRC32 = (1 << 6), +}; + +/* The bit flags corresponding to the output of android_getCpuFeatures() + * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_X86 or + * ANDROID_CPU_FAMILY_X86_64. + */ +enum { + ANDROID_CPU_X86_FEATURE_SSSE3 = (1 << 0), + ANDROID_CPU_X86_FEATURE_POPCNT = (1 << 1), + ANDROID_CPU_X86_FEATURE_MOVBE = (1 << 2), + ANDROID_CPU_X86_FEATURE_SSE4_1 = (1 << 3), + ANDROID_CPU_X86_FEATURE_SSE4_2 = (1 << 4), + ANDROID_CPU_X86_FEATURE_AES_NI = (1 << 5), + ANDROID_CPU_X86_FEATURE_AVX = (1 << 6), + ANDROID_CPU_X86_FEATURE_RDRAND = (1 << 7), + ANDROID_CPU_X86_FEATURE_AVX2 = (1 << 8), + ANDROID_CPU_X86_FEATURE_SHA_NI = (1 << 9), +}; + +/* The bit flags corresponding to the output of android_getCpuFeatures() + * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_MIPS + * or ANDROID_CPU_FAMILY_MIPS64. Values are: + * + * R6: + * CPU executes MIPS Release 6 instructions natively, and + * supports obsoleted R1..R5 instructions only via kernel traps. + * + * MSA: + * CPU supports Mips SIMD Architecture instructions. + */ +enum { + ANDROID_CPU_MIPS_FEATURE_R6 = (1 << 0), + ANDROID_CPU_MIPS_FEATURE_MSA = (1 << 1), +}; + +/* Return the number of CPU cores detected on this device. + * Please note the current implementation supports up to 32 cpus. + */ +extern int android_getCpuCount(void); + +/* The following is used to force the CPU count and features + * mask in sandboxed processes. Under 4.1 and higher, these processes + * cannot access /proc, which is the only way to get information from + * the kernel about the current hardware (at least on ARM). + * + * It _must_ be called only once, and before any android_getCpuXXX + * function, any other case will fail. + * + * This function return 1 on success, and 0 on failure. + */ +extern int android_setCpu(int cpu_count, uint64_t cpu_features); + +#ifdef __arm__ + +/* Retrieve the ARM 32-bit CPUID value from the kernel. + * Note that this cannot work on sandboxed processes under 4.1 and + * higher, unless you called android_setCpuArm() before. + */ +extern uint32_t android_getCpuIdArm(void); + +/* An ARM-specific variant of android_setCpu() that also allows you + * to set the ARM CPUID field. + */ +extern int android_setCpuArm(int cpu_count, uint64_t cpu_features, + uint32_t cpu_id); + +#endif + +__END_DECLS +#endif /* GOOGLE_CPU_FEATURES_H */ diff --git a/node_modules/cpu-features/deps/cpu_features/ndk_compat/ndk-compat-test.c b/node_modules/cpu-features/deps/cpu_features/ndk_compat/ndk-compat-test.c new file mode 100644 index 00000000..e4005d43 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/ndk_compat/ndk-compat-test.c @@ -0,0 +1,12 @@ +#include + +#include "cpu-features.h" + +int main() { + printf("android_getCpuFamily()=%d\n", android_getCpuFamily()); + printf("android_getCpuFeatures()=0x%08llx\n", android_getCpuFeatures()); + printf("android_getCpuCount()=%d\n", android_getCpuCount()); +#ifdef __arm__ + printf("android_getCpuIdArm()=0x%04x\n", android_getCpuIdArm()); +#endif //__arm__ +} diff --git a/node_modules/cpu-features/deps/cpu_features/patches/0001-Add-Apple-Silicon-Support.patch b/node_modules/cpu-features/deps/cpu_features/patches/0001-Add-Apple-Silicon-Support.patch new file mode 100644 index 00000000..b11ea3e8 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/patches/0001-Add-Apple-Silicon-Support.patch @@ -0,0 +1,456 @@ +diff --git a/deps/cpu_features/CMakeLists.txt b/deps/cpu_features/CMakeLists.txt +index bcc9bb0..7a4f641 100644 +--- a/deps/cpu_features/CMakeLists.txt ++++ b/deps/cpu_features/CMakeLists.txt +@@ -1,4 +1,4 @@ +-cmake_minimum_required(VERSION 3.0) ++cmake_minimum_required(VERSION 3.19.2) + + # option() honors normal variables. + # see: https://cmake.org/cmake/help/git-stage/policy/CMP0077.html +@@ -147,7 +147,7 @@ target_link_libraries(cpu_features PUBLIC ${CMAKE_DL_LIBS}) + target_include_directories(cpu_features + PUBLIC $ + ) +-if(PROCESSOR_IS_X86) ++if(PROCESSOR_IS_X86 OR PROCESSOR_IS_AARCH64) + if(APPLE) + target_compile_definitions(cpu_features PRIVATE HAVE_SYSCTLBYNAME) + endif() +diff --git a/deps/cpu_features/include/cpu_features_macros.h b/deps/cpu_features/include/cpu_features_macros.h +index 215b567..652335d 100644 +--- a/deps/cpu_features/include/cpu_features_macros.h ++++ b/deps/cpu_features/include/cpu_features_macros.h +@@ -39,7 +39,7 @@ + #define CPU_FEATURES_ARCH_ARM + #endif + +-#if (defined(__aarch64__) || defined(_M_ARM64)) ++#if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64)) + #define CPU_FEATURES_ARCH_AARCH64 + #endif + +diff --git a/deps/cpu_features/src/impl_aarch64__base_implementation.inl b/deps/cpu_features/src/impl_aarch64__base_implementation.inl +new file mode 100644 +index 0000000..9677a6f +--- /dev/null ++++ b/deps/cpu_features/src/impl_aarch64__base_implementation.inl +@@ -0,0 +1,88 @@ ++// Copyright 2021 Google LLC ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. ++ ++#include ++ ++#include "cpuinfo_aarch64.h" ++#include "internal/bit_utils.h" ++#include "internal/filesystem.h" ++#include "internal/stack_line_reader.h" ++#include "internal/string_view.h" ++ ++#if !defined(CPU_FEATURES_ARCH_AARCH64) ++#error "Cannot compile aarch64_base on a non aarch64 platform." ++#endif ++ ++//////////////////////////////////////////////////////////////////////////////// ++// Definitions for introspection. ++//////////////////////////////////////////////////////////////////////////////// ++#define INTROSPECTION_TABLE \ ++ LINE(AARCH64_FP, fp, "fp", AARCH64_HWCAP_FP, 0) \ ++ LINE(AARCH64_ASIMD, asimd, "asimd", AARCH64_HWCAP_ASIMD, 0) \ ++ LINE(AARCH64_EVTSTRM, evtstrm, "evtstrm", AARCH64_HWCAP_EVTSTRM, 0) \ ++ LINE(AARCH64_AES, aes, "aes", AARCH64_HWCAP_AES, 0) \ ++ LINE(AARCH64_PMULL, pmull, "pmull", AARCH64_HWCAP_PMULL, 0) \ ++ LINE(AARCH64_SHA1, sha1, "sha1", AARCH64_HWCAP_SHA1, 0) \ ++ LINE(AARCH64_SHA2, sha2, "sha2", AARCH64_HWCAP_SHA2, 0) \ ++ LINE(AARCH64_CRC32, crc32, "crc32", AARCH64_HWCAP_CRC32, 0) \ ++ LINE(AARCH64_ATOMICS, atomics, "atomics", AARCH64_HWCAP_ATOMICS, 0) \ ++ LINE(AARCH64_FPHP, fphp, "fphp", AARCH64_HWCAP_FPHP, 0) \ ++ LINE(AARCH64_ASIMDHP, asimdhp, "asimdhp", AARCH64_HWCAP_ASIMDHP, 0) \ ++ LINE(AARCH64_CPUID, cpuid, "cpuid", AARCH64_HWCAP_CPUID, 0) \ ++ LINE(AARCH64_ASIMDRDM, asimdrdm, "asimdrdm", AARCH64_HWCAP_ASIMDRDM, 0) \ ++ LINE(AARCH64_JSCVT, jscvt, "jscvt", AARCH64_HWCAP_JSCVT, 0) \ ++ LINE(AARCH64_FCMA, fcma, "fcma", AARCH64_HWCAP_FCMA, 0) \ ++ LINE(AARCH64_LRCPC, lrcpc, "lrcpc", AARCH64_HWCAP_LRCPC, 0) \ ++ LINE(AARCH64_DCPOP, dcpop, "dcpop", AARCH64_HWCAP_DCPOP, 0) \ ++ LINE(AARCH64_SHA3, sha3, "sha3", AARCH64_HWCAP_SHA3, 0) \ ++ LINE(AARCH64_SM3, sm3, "sm3", AARCH64_HWCAP_SM3, 0) \ ++ LINE(AARCH64_SM4, sm4, "sm4", AARCH64_HWCAP_SM4, 0) \ ++ LINE(AARCH64_ASIMDDP, asimddp, "asimddp", AARCH64_HWCAP_ASIMDDP, 0) \ ++ LINE(AARCH64_SHA512, sha512, "sha512", AARCH64_HWCAP_SHA512, 0) \ ++ LINE(AARCH64_SVE, sve, "sve", AARCH64_HWCAP_SVE, 0) \ ++ LINE(AARCH64_ASIMDFHM, asimdfhm, "asimdfhm", AARCH64_HWCAP_ASIMDFHM, 0) \ ++ LINE(AARCH64_DIT, dit, "dit", AARCH64_HWCAP_DIT, 0) \ ++ LINE(AARCH64_USCAT, uscat, "uscat", AARCH64_HWCAP_USCAT, 0) \ ++ LINE(AARCH64_ILRCPC, ilrcpc, "ilrcpc", AARCH64_HWCAP_ILRCPC, 0) \ ++ LINE(AARCH64_FLAGM, flagm, "flagm", AARCH64_HWCAP_FLAGM, 0) \ ++ LINE(AARCH64_SSBS, ssbs, "ssbs", AARCH64_HWCAP_SSBS, 0) \ ++ LINE(AARCH64_SB, sb, "sb", AARCH64_HWCAP_SB, 0) \ ++ LINE(AARCH64_PACA, paca, "paca", AARCH64_HWCAP_PACA, 0) \ ++ LINE(AARCH64_PACG, pacg, "pacg", AARCH64_HWCAP_PACG, 0) \ ++ LINE(AARCH64_DCPODP, dcpodp, "dcpodp", 0, AARCH64_HWCAP2_DCPODP) \ ++ LINE(AARCH64_SVE2, sve2, "sve2", 0, AARCH64_HWCAP2_SVE2) \ ++ LINE(AARCH64_SVEAES, sveaes, "sveaes", 0, AARCH64_HWCAP2_SVEAES) \ ++ LINE(AARCH64_SVEPMULL, svepmull, "svepmull", 0, AARCH64_HWCAP2_SVEPMULL) \ ++ LINE(AARCH64_SVEBITPERM, svebitperm, "svebitperm", 0, \ ++ AARCH64_HWCAP2_SVEBITPERM) \ ++ LINE(AARCH64_SVESHA3, svesha3, "svesha3", 0, AARCH64_HWCAP2_SVESHA3) \ ++ LINE(AARCH64_SVESM4, svesm4, "svesm4", 0, AARCH64_HWCAP2_SVESM4) \ ++ LINE(AARCH64_FLAGM2, flagm2, "flagm2", 0, AARCH64_HWCAP2_FLAGM2) \ ++ LINE(AARCH64_FRINT, frint, "frint", 0, AARCH64_HWCAP2_FRINT) \ ++ LINE(AARCH64_SVEI8MM, svei8mm, "svei8mm", 0, AARCH64_HWCAP2_SVEI8MM) \ ++ LINE(AARCH64_SVEF32MM, svef32mm, "svef32mm", 0, AARCH64_HWCAP2_SVEF32MM) \ ++ LINE(AARCH64_SVEF64MM, svef64mm, "svef64mm", 0, AARCH64_HWCAP2_SVEF64MM) \ ++ LINE(AARCH64_SVEBF16, svebf16, "svebf16", 0, AARCH64_HWCAP2_SVEBF16) \ ++ LINE(AARCH64_I8MM, i8mm, "i8mm", 0, AARCH64_HWCAP2_I8MM) \ ++ LINE(AARCH64_BF16, bf16, "bf16", 0, AARCH64_HWCAP2_BF16) \ ++ LINE(AARCH64_DGH, dgh, "dgh", 0, AARCH64_HWCAP2_DGH) \ ++ LINE(AARCH64_RNG, rng, "rng", 0, AARCH64_HWCAP2_RNG) \ ++ LINE(AARCH64_BTI, bti, "bti", 0, AARCH64_HWCAP2_BTI) \ ++ LINE(AARCH64_MTE, mte, "mte", 0, AARCH64_HWCAP2_MTE) \ ++ LINE(AARCH64_ECV, ecv, "ecv", 0, AARCH64_HWCAP2_ECV) \ ++ LINE(AARCH64_AFP, afp, "afp", 0, AARCH64_HWCAP2_AFP) \ ++ LINE(AARCH64_RPRES, rpres, "rpres", 0, AARCH64_HWCAP2_RPRES) ++#define INTROSPECTION_PREFIX Aarch64 ++#define INTROSPECTION_ENUM_PREFIX AARCH64 ++#include "define_introspection_and_hwcaps.inl" +diff --git a/deps/cpu_features/src/impl_aarch64_linux_or_android.c b/deps/cpu_features/src/impl_aarch64_linux_or_android.c +index ef923d9..c0a764c 100644 +--- a/deps/cpu_features/src/impl_aarch64_linux_or_android.c ++++ b/deps/cpu_features/src/impl_aarch64_linux_or_android.c +@@ -17,81 +17,7 @@ + #ifdef CPU_FEATURES_ARCH_AARCH64 + #if defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) + +-#include "cpuinfo_aarch64.h" +- +-//////////////////////////////////////////////////////////////////////////////// +-// Definitions for introspection. +-//////////////////////////////////////////////////////////////////////////////// +-#define INTROSPECTION_TABLE \ +- LINE(AARCH64_FP, fp, "fp", AARCH64_HWCAP_FP, 0) \ +- LINE(AARCH64_ASIMD, asimd, "asimd", AARCH64_HWCAP_ASIMD, 0) \ +- LINE(AARCH64_EVTSTRM, evtstrm, "evtstrm", AARCH64_HWCAP_EVTSTRM, 0) \ +- LINE(AARCH64_AES, aes, "aes", AARCH64_HWCAP_AES, 0) \ +- LINE(AARCH64_PMULL, pmull, "pmull", AARCH64_HWCAP_PMULL, 0) \ +- LINE(AARCH64_SHA1, sha1, "sha1", AARCH64_HWCAP_SHA1, 0) \ +- LINE(AARCH64_SHA2, sha2, "sha2", AARCH64_HWCAP_SHA2, 0) \ +- LINE(AARCH64_CRC32, crc32, "crc32", AARCH64_HWCAP_CRC32, 0) \ +- LINE(AARCH64_ATOMICS, atomics, "atomics", AARCH64_HWCAP_ATOMICS, 0) \ +- LINE(AARCH64_FPHP, fphp, "fphp", AARCH64_HWCAP_FPHP, 0) \ +- LINE(AARCH64_ASIMDHP, asimdhp, "asimdhp", AARCH64_HWCAP_ASIMDHP, 0) \ +- LINE(AARCH64_CPUID, cpuid, "cpuid", AARCH64_HWCAP_CPUID, 0) \ +- LINE(AARCH64_ASIMDRDM, asimdrdm, "asimdrdm", AARCH64_HWCAP_ASIMDRDM, 0) \ +- LINE(AARCH64_JSCVT, jscvt, "jscvt", AARCH64_HWCAP_JSCVT, 0) \ +- LINE(AARCH64_FCMA, fcma, "fcma", AARCH64_HWCAP_FCMA, 0) \ +- LINE(AARCH64_LRCPC, lrcpc, "lrcpc", AARCH64_HWCAP_LRCPC, 0) \ +- LINE(AARCH64_DCPOP, dcpop, "dcpop", AARCH64_HWCAP_DCPOP, 0) \ +- LINE(AARCH64_SHA3, sha3, "sha3", AARCH64_HWCAP_SHA3, 0) \ +- LINE(AARCH64_SM3, sm3, "sm3", AARCH64_HWCAP_SM3, 0) \ +- LINE(AARCH64_SM4, sm4, "sm4", AARCH64_HWCAP_SM4, 0) \ +- LINE(AARCH64_ASIMDDP, asimddp, "asimddp", AARCH64_HWCAP_ASIMDDP, 0) \ +- LINE(AARCH64_SHA512, sha512, "sha512", AARCH64_HWCAP_SHA512, 0) \ +- LINE(AARCH64_SVE, sve, "sve", AARCH64_HWCAP_SVE, 0) \ +- LINE(AARCH64_ASIMDFHM, asimdfhm, "asimdfhm", AARCH64_HWCAP_ASIMDFHM, 0) \ +- LINE(AARCH64_DIT, dit, "dit", AARCH64_HWCAP_DIT, 0) \ +- LINE(AARCH64_USCAT, uscat, "uscat", AARCH64_HWCAP_USCAT, 0) \ +- LINE(AARCH64_ILRCPC, ilrcpc, "ilrcpc", AARCH64_HWCAP_ILRCPC, 0) \ +- LINE(AARCH64_FLAGM, flagm, "flagm", AARCH64_HWCAP_FLAGM, 0) \ +- LINE(AARCH64_SSBS, ssbs, "ssbs", AARCH64_HWCAP_SSBS, 0) \ +- LINE(AARCH64_SB, sb, "sb", AARCH64_HWCAP_SB, 0) \ +- LINE(AARCH64_PACA, paca, "paca", AARCH64_HWCAP_PACA, 0) \ +- LINE(AARCH64_PACG, pacg, "pacg", AARCH64_HWCAP_PACG, 0) \ +- LINE(AARCH64_DCPODP, dcpodp, "dcpodp", 0, AARCH64_HWCAP2_DCPODP) \ +- LINE(AARCH64_SVE2, sve2, "sve2", 0, AARCH64_HWCAP2_SVE2) \ +- LINE(AARCH64_SVEAES, sveaes, "sveaes", 0, AARCH64_HWCAP2_SVEAES) \ +- LINE(AARCH64_SVEPMULL, svepmull, "svepmull", 0, AARCH64_HWCAP2_SVEPMULL) \ +- LINE(AARCH64_SVEBITPERM, svebitperm, "svebitperm", 0, \ +- AARCH64_HWCAP2_SVEBITPERM) \ +- LINE(AARCH64_SVESHA3, svesha3, "svesha3", 0, AARCH64_HWCAP2_SVESHA3) \ +- LINE(AARCH64_SVESM4, svesm4, "svesm4", 0, AARCH64_HWCAP2_SVESM4) \ +- LINE(AARCH64_FLAGM2, flagm2, "flagm2", 0, AARCH64_HWCAP2_FLAGM2) \ +- LINE(AARCH64_FRINT, frint, "frint", 0, AARCH64_HWCAP2_FRINT) \ +- LINE(AARCH64_SVEI8MM, svei8mm, "svei8mm", 0, AARCH64_HWCAP2_SVEI8MM) \ +- LINE(AARCH64_SVEF32MM, svef32mm, "svef32mm", 0, AARCH64_HWCAP2_SVEF32MM) \ +- LINE(AARCH64_SVEF64MM, svef64mm, "svef64mm", 0, AARCH64_HWCAP2_SVEF64MM) \ +- LINE(AARCH64_SVEBF16, svebf16, "svebf16", 0, AARCH64_HWCAP2_SVEBF16) \ +- LINE(AARCH64_I8MM, i8mm, "i8mm", 0, AARCH64_HWCAP2_I8MM) \ +- LINE(AARCH64_BF16, bf16, "bf16", 0, AARCH64_HWCAP2_BF16) \ +- LINE(AARCH64_DGH, dgh, "dgh", 0, AARCH64_HWCAP2_DGH) \ +- LINE(AARCH64_RNG, rng, "rng", 0, AARCH64_HWCAP2_RNG) \ +- LINE(AARCH64_BTI, bti, "bti", 0, AARCH64_HWCAP2_BTI) \ +- LINE(AARCH64_MTE, mte, "mte", 0, AARCH64_HWCAP2_MTE) \ +- LINE(AARCH64_ECV, ecv, "ecv", 0, AARCH64_HWCAP2_ECV) \ +- LINE(AARCH64_AFP, afp, "afp", 0, AARCH64_HWCAP2_AFP) \ +- LINE(AARCH64_RPRES, rpres, "rpres", 0, AARCH64_HWCAP2_RPRES) +-#define INTROSPECTION_PREFIX Aarch64 +-#define INTROSPECTION_ENUM_PREFIX AARCH64 +-#include "define_introspection_and_hwcaps.inl" +- +-//////////////////////////////////////////////////////////////////////////////// +-// Implementation. +-//////////////////////////////////////////////////////////////////////////////// +- +-#include +- +-#include "internal/bit_utils.h" +-#include "internal/filesystem.h" +-#include "internal/stack_line_reader.h" +-#include "internal/string_view.h" ++#include "impl_aarch64__base_implementation.inl" + + static bool HandleAarch64Line(const LineResult result, + Aarch64Info* const info) { +diff --git a/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c b/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c +new file mode 100644 +index 0000000..0f95058 +--- /dev/null ++++ b/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c +@@ -0,0 +1,82 @@ ++// Copyright 2021 Google LLC ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. ++ ++#include "cpu_features_macros.h" ++ ++#ifdef CPU_FEATURES_ARCH_AARCH64 ++#if defined(CPU_FEATURES_OS_MACOS) || defined(CPU_FEATURES_OS_IPHONE) ++ ++#include "impl_aarch64__base_implementation.inl" ++ ++#if !defined(HAVE_SYSCTLBYNAME) ++#error "Darwin needs support for sysctlbyname" ++#endif ++#include ++ ++#if defined(CPU_FEATURES_MOCK_SYSCTL_AARCH64) ++extern bool GetDarwinSysCtlByName(const char*); ++extern int GetDarwinSysCtlByNameValue(const char* name); ++#else ++static int GetDarwinSysCtlByNameValue(const char* name) { ++ int enabled; ++ size_t enabled_len = sizeof(enabled); ++ const int failure = sysctlbyname(name, &enabled, &enabled_len, NULL, 0); ++ return failure ? 0 : enabled; ++} ++ ++static bool GetDarwinSysCtlByName(const char* name) { ++ return GetDarwinSysCtlByNameValue(name) != 0; ++} ++#endif ++ ++static const Aarch64Info kEmptyAarch64Info; ++ ++Aarch64Info GetAarch64Info(void) { ++ Aarch64Info info = kEmptyAarch64Info; ++ ++ // Handling Darwin platform through sysctlbyname. ++ info.implementer = GetDarwinSysCtlByNameValue("hw.cputype"); ++ info.variant = GetDarwinSysCtlByNameValue("hw.cpusubtype"); ++ info.part = GetDarwinSysCtlByNameValue("hw.cpufamily"); ++ info.revision = GetDarwinSysCtlByNameValue("hw.cpusubfamily"); ++ ++ info.features.fp = GetDarwinSysCtlByName("hw.optional.floatingpoint"); ++ info.features.asimd = GetDarwinSysCtlByName("hw.optional.AdvSIMD"); ++ info.features.aes = GetDarwinSysCtlByName("hw.optional.arm.FEAT_AES"); ++ info.features.pmull = GetDarwinSysCtlByName("hw.optional.arm.FEAT_PMULL"); ++ info.features.sha1 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA1"); ++ info.features.sha2 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA2"); ++ info.features.crc32 = GetDarwinSysCtlByName("hw.optional.armv8_crc32"); ++ info.features.atomics = GetDarwinSysCtlByName("hw.optional.armv8_1_atomics"); ++ info.features.fphp = GetDarwinSysCtlByName("hw.optional.neon_hpfp"); ++ info.features.jscvt = GetDarwinSysCtlByName("hw.optional.arm.FEAT_JSCVT"); ++ info.features.fcma = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FCMA"); ++ info.features.lrcpc = GetDarwinSysCtlByName("hw.optional.arm.FEAT_LRCPC"); ++ info.features.sha3 = GetDarwinSysCtlByName("hw.optional.armv8_2_sha3"); ++ info.features.sha512 = GetDarwinSysCtlByName("hw.optional.armv8_2_sha512"); ++ info.features.asimdfhm = GetDarwinSysCtlByName("hw.optional.armv8_2_fhm"); ++ info.features.flagm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FLAGM"); ++ info.features.flagm2 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FLAGM2"); ++ info.features.ssbs = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SSBS"); ++ info.features.sb = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SB"); ++ info.features.i8mm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_I8MM"); ++ info.features.bf16 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_BF16"); ++ info.features.bti = GetDarwinSysCtlByName("hw.optional.arm.FEAT_BTI"); ++ info.features.ecv = GetDarwinSysCtlByName("hw.optional.arm.FEAT_ECV"); ++ ++ return info; ++} ++ ++#endif // defined(CPU_FEATURES_OS_MACOS) || defined(CPU_FEATURES_OS_IPHONE) ++#endif // CPU_FEATURES_ARCH_AARCH64 +diff --git a/deps/cpu_features/test/CMakeLists.txt b/deps/cpu_features/test/CMakeLists.txt +index f627d74..80a0466 100644 +--- a/deps/cpu_features/test/CMakeLists.txt ++++ b/deps/cpu_features/test/CMakeLists.txt +@@ -74,7 +74,12 @@ if(PROCESSOR_IS_AARCH64) + add_executable(cpuinfo_aarch64_test + cpuinfo_aarch64_test.cc + ../src/impl_aarch64_linux_or_android.c ++ ../src/impl_aarch64_macos_or_iphone.c + ../src/impl_aarch64_windows.c) ++ if(APPLE) ++ target_compile_definitions(cpuinfo_aarch64_test PUBLIC CPU_FEATURES_MOCK_SYSCTL_AARCH64) ++ target_compile_definitions(cpuinfo_aarch64_test PRIVATE HAVE_SYSCTLBYNAME) ++ endif() + target_compile_definitions(cpuinfo_aarch64_test PUBLIC CPU_FEATURES_MOCK_CPUID_AARCH64) + target_link_libraries(cpuinfo_aarch64_test all_libraries) + add_test(NAME cpuinfo_aarch64_test COMMAND cpuinfo_aarch64_test) +diff --git a/deps/cpu_features/test/cpuinfo_aarch64_test.cc b/deps/cpu_features/test/cpuinfo_aarch64_test.cc +index ef9abae..b43d1aa 100644 +--- a/deps/cpu_features/test/cpuinfo_aarch64_test.cc ++++ b/deps/cpu_features/test/cpuinfo_aarch64_test.cc +@@ -96,6 +96,125 @@ TEST(CpuinfoAarch64Test, Aarch64FeaturesEnum) { + #if defined(CPU_FEATURES_OS_LINUX) + void DisableHardwareCapabilities() { SetHardwareCapabilities(0, 0); } + ++#if defined(CPU_FEATURES_OS_MACOS) ++ ++class FakeCpu { ++ public: ++ bool GetDarwinSysCtlByName(std::string name) const { ++ return darwin_sysctlbyname_.count(name); ++ } ++ ++ int GetDarwinSysCtlByNameValue(std::string name) const { ++ std::map::const_iterator iter = darwin_sysctlbynamevalue_.find(name); ++ if (iter != std::end(darwin_sysctlbynamevalue_)) { ++ return iter->second; ++ } ++ ++ return 0; ++ } ++ ++ void SetDarwinSysCtlByName(std::string name) { ++ darwin_sysctlbyname_.insert(name); ++ } ++ ++ void SetDarwinSysCtlByNameValue(std::string name, int value) { ++ darwin_sysctlbynamevalue_[name] = value; ++ } ++ private: ++ std::set darwin_sysctlbyname_; ++ std::map darwin_sysctlbynamevalue_; ++}; ++ ++static FakeCpu* g_fake_cpu_instance = nullptr; ++ ++static FakeCpu& cpu() { ++ assert(g_fake_cpu_instance != nullptr); ++ return *g_fake_cpu_instance; ++} ++ ++extern "C" bool GetDarwinSysCtlByName(const char* name) { ++ return cpu().GetDarwinSysCtlByName(name); ++} ++ ++extern "C" int GetDarwinSysCtlByNameValue(const char *name) { ++ return cpu().GetDarwinSysCtlByNameValue(name); ++} ++ ++class CpuinfoAarch64Test : public ::testing::Test { ++ protected: ++ void SetUp() override { ++ assert(g_fake_cpu_instance == nullptr); ++ g_fake_cpu_instance = new FakeCpu(); ++ } ++ void TearDown() override { ++ delete g_fake_cpu_instance; ++ g_fake_cpu_instance = nullptr; ++ } ++}; ++ ++TEST_F(CpuinfoAarch64Test, FromDarwinSysctlFromName) { ++ cpu().SetDarwinSysCtlByName("hw.optional.floatingpoint"); ++ cpu().SetDarwinSysCtlByName("hw.optional.neon"); ++ cpu().SetDarwinSysCtlByName("hw.optional.neon_hpfp"); ++ cpu().SetDarwinSysCtlByName("hw.optional.neon_fp16"); ++ cpu().SetDarwinSysCtlByName("hw.optional.armv8_1_atomics"); ++ cpu().SetDarwinSysCtlByName("hw.optional.armv8_crc32"); ++ cpu().SetDarwinSysCtlByName("hw.optional.armv8_2_fhm"); ++ cpu().SetDarwinSysCtlByName("hw.optional.armv8_2_sha512"); ++ cpu().SetDarwinSysCtlByName("hw.optional.armv8_2_sha3"); ++ cpu().SetDarwinSysCtlByName("hw.optional.amx_version"); ++ cpu().SetDarwinSysCtlByName("hw.optional.ucnormal_mem"); ++ cpu().SetDarwinSysCtlByName("hw.optional.arm64"); ++ ++ cpu().SetDarwinSysCtlByNameValue("hw.cputype", 16777228); ++ cpu().SetDarwinSysCtlByNameValue("hw.cpusubtype", 2); ++ cpu().SetDarwinSysCtlByNameValue("hw.cpu64bit", 1); ++ cpu().SetDarwinSysCtlByNameValue("hw.cpufamily", 458787763); ++ cpu().SetDarwinSysCtlByNameValue("hw.cpusubfamily", 2); ++ ++ const auto info = GetAarch64Info(); ++ ++ EXPECT_EQ(info.implementer, 0x100000C); ++ EXPECT_EQ(info.variant, 2); ++ EXPECT_EQ(info.part, 0x1B588BB3); ++ EXPECT_EQ(info.revision, 2); ++ ++ EXPECT_TRUE(info.features.fp); ++ EXPECT_FALSE(info.features.asimd); ++ EXPECT_FALSE(info.features.evtstrm); ++ EXPECT_FALSE(info.features.aes); ++ EXPECT_FALSE(info.features.pmull); ++ EXPECT_FALSE(info.features.sha1); ++ EXPECT_FALSE(info.features.sha2); ++ EXPECT_TRUE(info.features.crc32); ++ EXPECT_TRUE(info.features.atomics); ++ EXPECT_TRUE(info.features.fphp); ++ EXPECT_FALSE(info.features.asimdhp); ++ EXPECT_FALSE(info.features.cpuid); ++ EXPECT_FALSE(info.features.asimdrdm); ++ EXPECT_FALSE(info.features.jscvt); ++ EXPECT_FALSE(info.features.fcma); ++ EXPECT_FALSE(info.features.lrcpc); ++ EXPECT_FALSE(info.features.dcpop); ++ EXPECT_TRUE(info.features.sha3); ++ EXPECT_FALSE(info.features.sm3); ++ EXPECT_FALSE(info.features.sm4); ++ EXPECT_FALSE(info.features.asimddp); ++ EXPECT_TRUE(info.features.sha512); ++ EXPECT_FALSE(info.features.sve); ++ EXPECT_TRUE(info.features.asimdfhm); ++ EXPECT_FALSE(info.features.dit); ++ EXPECT_FALSE(info.features.uscat); ++ EXPECT_FALSE(info.features.ilrcpc); ++ EXPECT_FALSE(info.features.flagm); ++ EXPECT_FALSE(info.features.ssbs); ++ EXPECT_FALSE(info.features.sb); ++ EXPECT_FALSE(info.features.paca); ++ EXPECT_FALSE(info.features.pacg); ++} ++ ++#else ++ + TEST(CpuinfoAarch64Test, FromHardwareCap) { + ResetHwcaps(); + SetHardwareCapabilities(AARCH64_HWCAP_FP | AARCH64_HWCAP_AES, 0); +@@ -163,6 +282,7 @@ TEST(CpuinfoAarch64Test, FromHardwareCap2) { + EXPECT_FALSE(info.features.dgh); + EXPECT_FALSE(info.features.rng); + } ++#endif // CPU_FEATURES_OS_MACOS + + TEST(CpuinfoAarch64Test, ARMCortexA53) { + ResetHwcaps(); diff --git a/node_modules/cpu-features/deps/cpu_features/scripts/generate_badges.d b/node_modules/cpu-features/deps/cpu_features/scripts/generate_badges.d new file mode 100644 index 00000000..bf5aa542 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/scripts/generate_badges.d @@ -0,0 +1,165 @@ +import std.algorithm : each, map, cartesianProduct, filter, joiner, sort, uniq; +import std.array : array; +import std.conv : to; +import std.format; +import std.range : chain, only; +import std.stdio; +import std.traits : EnumMembers; + +enum BuildSystem +{ + CMake, + Bazel +} + +enum Cpu +{ + amd64, + AArch64, + ARM, + MIPS, + POWER, + RISCV, + s390x, +} + +enum Os +{ + Linux, + FreeBSD, + MacOS, + Windows, +} + +struct Badge +{ +const: + + Cpu cpu; + Os os; + BuildSystem build_system; + + string id() + { + return format("%d%c%d", cast(uint)(os) + 1, cast(char)('a' + cpu), cast(uint)(build_system)); + } + + string disabled_image_ref() + { + return format("[d%d]", cast(uint)(build_system)); + } + + string link_ref() + { + return format("[l%s]", id()); + } + + string image_ref() + { + return format("[i%s]", id()); + } + + bool enabled() + { + final switch (build_system) + { + case BuildSystem.CMake: + return os == Os.Linux || cpu == Cpu.amd64; + case BuildSystem.Bazel: + return os == Os.Linux && cpu == Cpu.amd64; + } + } + + string text() + { + if (enabled()) + return format("[![]%s]%s", image_ref, link_ref); + return format("![]%s", disabled_image_ref); + } + + string disabled_image_link() + { + return format("%s: https://img.shields.io/badge/%s-N%%2FA-lightgrey", disabled_image_ref, build_system); + } + + string filename() + { + import std.uni : toLower; + + return toLower(format("%s_%s_%s.yml", cpu, os, build_system)); + } + + string link_decl() + { + return format("%s: https://github.com/google/cpu_features/actions/workflows/%s", link_ref, filename()); + } + + string image_decl() + { + return format( + "%s: https://img.shields.io/github/actions/workflow/status/google/cpu_features/%s?branch=main&label=%s", image_ref, filename(), build_system); + } +} + +auto tableHeader(in Cpu[] cpus) +{ + return chain(only("Os"), cpus.map!(to!string)).array; +} + +auto tableAlignment(in Cpu[] cpus) +{ + return chain(only(":--"), cpus.map!(v => "--:")).array; +} + +auto tableCell(Range)(in Os os, in Cpu cpu, Range badges) +{ + return badges + .filter!(b => b.cpu == cpu && b.os == os) + .map!(b => b.text()) + .joiner("
") + .to!string; +} + +auto tableRow(Range)(in Os os, in Cpu[] cpus, Range badges) +{ + return chain(only(os.to!string), cpus.map!(cpu => tableCell(os, cpu, badges))).array; +} + +auto tableRows(Range)(in Os[] oses, in Cpu[] cpus, Range badges) +{ + return oses.map!(os => tableRow(os, cpus, badges)).array; +} + +auto table(Range)(in Os[] oses, in Cpu[] cpus, Range badges) +{ + return chain(only(tableHeader(cpus)), only(tableAlignment(cpus)), tableRows(oses, cpus, badges)); +} + +void main() +{ + immutable allCpus = [EnumMembers!Cpu]; + immutable allOses = [EnumMembers!Os]; + immutable allBuildSystems = [EnumMembers!BuildSystem]; + + auto badges = cartesianProduct(allCpus, allOses, allBuildSystems).map!( + t => Badge(t[0], t[1], t[2])); + + writefln("%(|%-( %s |%) |\n%) |", table(allOses, allCpus, badges)); + writeln(); + badges + .filter!(b => !b.enabled) + .map!(b => b.disabled_image_link()) + .array + .sort + .uniq + .each!writeln; + + badges + .filter!(b => b.enabled) + .map!(b => [b.link_decl(), b.image_decl()]) + .joiner() + .array + .sort + .uniq + .each!writeln; +} diff --git a/node_modules/cpu-features/deps/cpu_features/scripts/make_release.sh b/node_modules/cpu-features/deps/cpu_features/scripts/make_release.sh new file mode 100755 index 00000000..25b59f9c --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/scripts/make_release.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +set -e # Fail on error +set -u # Treat unset variables as an error and exit immediately + +ACTION='\033[1;90m' +FINISHED='\033[1;96m' +NOCOLOR='\033[0m' +ERROR='\033[0;31m' + +echo -e "${ACTION}Checking environnement${NOCOLOR}" +if [[ ! $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] +then + echo -e "${ERROR}Invalid version number. Aborting. ${NOCOLOR}" + exit 1 +fi + +declare -r VERSION=$1 +declare -r GIT_TAG="v$1" + +BRANCH=$(git rev-parse --abbrev-ref HEAD) +if [[ "${BRANCH}" != "main" ]] +then + echo -e "${ERROR}Not on main. Aborting. ${NOCOLOR}" + echo + exit 1 +fi + +git fetch +HEADHASH=$(git rev-parse HEAD) +UPSTREAMHASH=$(git rev-parse main@{upstream}) + +if [[ "${HEADHASH}" != "${UPSTREAMHASH}" ]] +then + echo -e "${ERROR}Not up to date with origin. Aborting.${NOCOLOR}" + echo + exit 1 +fi + +git update-index -q --refresh +if ! git diff-index --quiet HEAD -- +then + echo -e "${ERROR}Branch has uncommited changes. Aborting.${NOCOLOR}" + exit 1 +fi + +if [ ! -z "$(git ls-files --exclude-standard --others)" ] +then + echo -e "${ERROR}Branch has untracked files. Aborting.${NOCOLOR}" + exit 1 +fi + +declare -r LATEST_GIT_TAG=$(git describe --tags --abbrev=0) +declare -r LATEST_VERSION=${LATEST_GIT_TAG#"v"} + +if ! dpkg --compare-versions "${VERSION}" "gt" "${LATEST_VERSION}" +then + echo -e "${ERROR}Invalid version ${VERSION} <= ${LATEST_VERSION} (latest). Aborting.${NOCOLOR}" + exit 1 +fi + +echo -e "${ACTION}Modifying CMakeLists.txt${NOCOLOR}" +sed -i "s/CpuFeatures VERSION ${LATEST_VERSION}/CpuFeatures VERSION ${VERSION}/g" CMakeLists.txt + +echo -e "${ACTION}Commit new revision${NOCOLOR}" +git add CMakeLists.txt +git commit -m"Release ${GIT_TAG}" + +echo -e "${ACTION}Create new tag${NOCOLOR}" +git tag ${GIT_TAG} + +echo -e "${FINISHED}Manual steps:${NOCOLOR}" +echo -e "${FINISHED} - Push the tag upstream 'git push origin ${GIT_TAG}'${NOCOLOR}" +echo -e "${FINISHED} - Create a new release https://github.com/google/cpu_features/releases/new${NOCOLOR}" +echo -e "${FINISHED} - Update the Release Notes 'gren release --override'${NOCOLOR}" diff --git a/node_modules/cpu-features/deps/cpu_features/scripts/run_integration.sh b/node_modules/cpu-features/deps/cpu_features/scripts/run_integration.sh new file mode 100755 index 00000000..053ffa96 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/scripts/run_integration.sh @@ -0,0 +1,490 @@ +#!/usr/bin/env bash +set -eo pipefail + +function extract() { + echo "Extracting ${1}..." + case $1 in + *.tar.bz2) tar xjf "$1" ;; + *.tar.xz) tar xJf "$1" ;; + *.tar.gz) tar xzf "$1" ;; + *) + >&2 echo "don't know how to extract '$1'..." + exit 1 + esac +} + +function unpack() { + mkdir -p "${ARCHIVE_DIR}" + cd "${ARCHIVE_DIR}" || exit 2 + local -r URL=$1 + local -r RELATIVE_DIR=$2 + local -r DESTINATION="${ARCHIVE_DIR}/${RELATIVE_DIR}" + if [[ ! -d "${DESTINATION}" ]] ; then + echo "Downloading ${URL}..." + local -r ARCHIVE_NAME=$(basename "${URL}") + [[ -f "${ARCHIVE_NAME}" ]] || wget --no-verbose "${URL}" + extract "${ARCHIVE_NAME}" + rm -f "${ARCHIVE_NAME}" + fi +} + +function install_qemu() { + if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then + >&2 echo 'QEMU is disabled !' + return 0 + fi + local -r QEMU_VERSION=${QEMU_VERSION:=7.1.0} + local -r QEMU_TARGET=${QEMU_ARCH}-linux-user + + if echo "${QEMU_VERSION} ${QEMU_TARGET}" | cmp --silent "${QEMU_INSTALL}/.build" -; then + echo "qemu ${QEMU_VERSION} up to date!" + return 0 + fi + + echo "QEMU_VERSION: ${QEMU_VERSION}" + echo "QEMU_TARGET: ${QEMU_TARGET}" + + rm -rf "${QEMU_INSTALL}" + + # Checking for a tarball before downloading makes testing easier :-) + local -r QEMU_URL="http://wiki.qemu-project.org/download/qemu-${QEMU_VERSION}.tar.xz" + local -r QEMU_DIR="qemu-${QEMU_VERSION}" + unpack ${QEMU_URL} ${QEMU_DIR} + cd ${QEMU_DIR} || exit 2 + + # Qemu (meson based build) depends on: pkgconf, libglib2.0, python3, ninja + ./configure \ + --prefix="${QEMU_INSTALL}" \ + --target-list="${QEMU_TARGET}" \ + --audio-drv-list= \ + --disable-brlapi \ + --disable-curl \ + --disable-curses \ + --disable-docs \ + --disable-gcrypt \ + --disable-gnutls \ + --disable-gtk \ + --disable-libnfs \ + --disable-libssh \ + --disable-nettle \ + --disable-opengl \ + --disable-sdl \ + --disable-virglrenderer \ + --disable-vte + + # wrapper on ninja + make -j8 + make install + + echo "$QEMU_VERSION $QEMU_TARGET" > "${QEMU_INSTALL}/.build" +} + +function assert_defined(){ + if [[ -z "${!1}" ]]; then + >&2 echo "Variable '${1}' must be defined" + exit 1 + fi +} + +function clean_build() { + # Cleanup previous build + rm -rf "${BUILD_DIR}" + mkdir -p "${BUILD_DIR}" +} + +function expand_linaro_config() { + #ref: https://releases.linaro.org/components/toolchain/binaries/ + local -r LINARO_VERSION=7.5-2019.12 + local -r LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/${LINARO_VERSION} + + local -r GCC_VERSION=7.5.0-2019.12 + local -r GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-${GCC_VERSION}-x86_64_${TARGET}.tar.xz + local -r GCC_RELATIVE_DIR="gcc-linaro-${GCC_VERSION}-x86_64_${TARGET}" + unpack "${GCC_URL}" "${GCC_RELATIVE_DIR}" + + local -r SYSROOT_VERSION=2.25-2019.12 + local -r SYSROOT_URL=${LINARO_ROOT_URL}/${TARGET}/sysroot-glibc-linaro-${SYSROOT_VERSION}-${TARGET}.tar.xz + local -r SYSROOT_RELATIVE_DIR=sysroot-glibc-linaro-${SYSROOT_VERSION}-${TARGET} + unpack "${SYSROOT_URL}" "${SYSROOT_RELATIVE_DIR}" + + local -r SYSROOT_DIR=${ARCHIVE_DIR}/${SYSROOT_RELATIVE_DIR} + local -r STAGING_DIR=${ARCHIVE_DIR}/${SYSROOT_RELATIVE_DIR}-stage + local -r GCC_DIR=${ARCHIVE_DIR}/${GCC_RELATIVE_DIR} + + # Write a Toolchain file + # note: This is manadatory to use a file in order to have the CMake variable + # 'CMAKE_CROSSCOMPILING' set to TRUE. + # ref: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux + cat >"$TOOLCHAIN_FILE" <&2 echo 'unknown power platform' + exit 1 ;; + esac + + local -r TOOLCHAIN_RELATIVE_DIR="${TARGET}" + unpack "${TOOLCHAIN_URL}" "${TOOLCHAIN_RELATIVE_DIR}" + local -r EXTRACT_DIR="${ARCHIVE_DIR}/$(basename ${TOOLCHAIN_URL%.tar.bz2})" + + local -r TOOLCHAIN_DIR=${ARCHIVE_DIR}/${TOOLCHAIN_RELATIVE_DIR} + if [[ -d "${EXTRACT_DIR}" ]]; then + mv "${EXTRACT_DIR}" "${TOOLCHAIN_DIR}" + fi + + local -r SYSROOT_DIR="${TOOLCHAIN_DIR}/${GCC_PREFIX}-buildroot-linux-gnu/sysroot" + #local -r STAGING_DIR=${SYSROOT_DIR}-stage + + # Write a Toolchain file + # note: This is manadatory to use a file in order to have the CMake variable + # 'CMAKE_CROSSCOMPILING' set to TRUE. + # ref: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux + cat >"${TOOLCHAIN_FILE}" <&2 echo 'unknown mips platform' + exit 1 ;; + esac + local -r SYSROOT_DIR=${GCC_DIR}/sysroot + local -r STAGING_DIR=${SYSROOT_DIR}-stage + + # Write a Toolchain file + # note: This is manadatory to use a file in order to have the CMake variable + # 'CMAKE_CROSSCOMPILING' set to TRUE. + # ref: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux + cat >"${TOOLCHAIN_FILE}" <&2 echo "QEMU is disabled for ${TARGET}" + return + fi + install_qemu + RUN_CMD="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} ${QEMU_ARGS[*]}" + + cd "${BUILD_DIR}" || exit 2 + declare -a TEST_BINARIES=() + TEST_BINARIES+=($(find "${BUILD_DIR}"/test -executable -type f)) + TEST_BINARIES+=($(find "${BUILD_DIR}" -maxdepth 1 -executable -type f)) + set -x + set -e + for test_binary in ${TEST_BINARIES[*]} ; do + ${RUN_CMD} "${test_binary}" + done + set +e + set +x +} + +function usage() { + local -r NAME=$(basename "$0") + echo -e "$NAME - Build using a cross toolchain. + +SYNOPSIS +\t$NAME [-h|--help] [toolchain|build|qemu|test|all] + +DESCRIPTION +\tCross compile using a cross toolchain. + +\tYou MUST define the following variables before running this script: +\t* TARGET: +\t\tx86_64 +\t\taarch64 aarch64be (bootlin) +\t\taarch64-linux-gnu aarch64_be-linux-gnu (linaro) +\t\tarm-linux-gnueabihf armv8l-linux-gnueabihf arm-linux-gnueabi (linaro) +\t\tarmeb-linux-gnueabihf armeb-linux-gnueabi (linaro) +\t\tmips32 mips32el (codespace) +\t\tmips64 mips64el (codespace) +\t\tppc (bootlin) +\t\tppc64 ppc64le (bootlin) +\t\triscv32 riscv64 (bootlin) +\t\ts390x (bootlin) + +OPTIONS +\t-h --help: show this help text +\ttoolchain: download, unpack toolchain and generate CMake toolchain file +\tbuild: toolchain + build the project using the toolchain file (note: remove previous build dir) +\tqemu: download, unpack and build qemu +\ttest: qemu + run all executable using qemu (note: don't build !) +\tall: build + test (default) + +EXAMPLES +* Using export: +export TARGET=aarch64-linux-gnu +$0 + +* One-liner: +TARGET=aarch64-linux-gnu $0" +} + +# Main +function main() { + case ${1} in + -h | --help) + usage; exit ;; + esac + + assert_defined TARGET + + declare -r PROJECT_DIR="$(cd -P -- "$(dirname -- "$0")/.." && pwd -P)" + declare -r ARCHIVE_DIR="${PROJECT_DIR}/build_cross/archives" + declare -r BUILD_DIR="${PROJECT_DIR}/build_cross/${TARGET}" + declare -r TOOLCHAIN_FILE=${ARCHIVE_DIR}/toolchain_${TARGET}.cmake + + echo "Target: '${TARGET}'" + + echo "Project dir: '${PROJECT_DIR}'" + echo "Archive dir: '${ARCHIVE_DIR}'" + echo "Build dir: '${BUILD_DIR}'" + echo "toolchain file: '${TOOLCHAIN_FILE}'" + + declare -a CMAKE_DEFAULT_ARGS=( -G ${CMAKE_GENERATOR:-"Ninja"} ) + declare -a CMAKE_ADDITIONAL_ARGS=() + + declare -a QEMU_ARGS=() + case ${TARGET} in + x86_64) + declare -r QEMU_ARCH=x86_64 ;; + arm-linux-gnueabihf | armv8l-linux-gnueabihf | arm-linux-gnueabi) + expand_linaro_config + declare -r QEMU_ARCH=arm ;; + armeb-linux-gnueabihf | armeb-linux-gnueabi) + expand_linaro_config + declare -r QEMU_ARCH=DISABLED ;; + aarch64-linux-gnu) + expand_linaro_config + declare -r QEMU_ARCH=aarch64 ;; + aarch64_be-linux-gnu) + expand_linaro_config + declare -r QEMU_ARCH=aarch64_be ;; + aarch64) + expand_bootlin_config + declare -r QEMU_ARCH=aarch64 ;; + aarch64be) + expand_bootlin_config + declare -r QEMU_ARCH=aarch64_be ;; + mips32) + expand_codescape_config + declare -r QEMU_ARCH=mips ;; + mips32el) + expand_codescape_config + declare -r QEMU_ARCH=mipsel ;; + mips64) + expand_codescape_config + declare -r QEMU_ARCH=mips64 ;; + mips64el) + expand_codescape_config + declare -r QEMU_ARCH=mips64el ;; + ppc64le) + expand_bootlin_config + declare -r QEMU_ARCH=ppc64le ;; + ppc64) + expand_bootlin_config + declare -r QEMU_ARCH=ppc64 ;; + ppc) + expand_bootlin_config + declare -r QEMU_ARCH=ppc ;; + riscv32) + expand_bootlin_config + declare -r QEMU_ARCH=riscv32 ;; + riscv64) + expand_bootlin_config + declare -r QEMU_ARCH=riscv64 ;; + s390x) + expand_bootlin_config + declare -r QEMU_ARCH=s390x ;; + *) + >&2 echo "Unknown TARGET '${TARGET}'..." + exit 1 ;; + esac + declare -r QEMU_INSTALL=${ARCHIVE_DIR}/qemu-${QEMU_ARCH} + + case ${1} in + toolchain) + exit ;; + build) + build ;; + qemu) + install_qemu ;; + test) + run_test ;; + *) + build + run_test ;; + esac +} + +main "${1:-all}" diff --git a/node_modules/cpu-features/deps/cpu_features/scripts/test_integration.sh b/node_modules/cpu-features/deps/cpu_features/scripts/test_integration.sh new file mode 100755 index 00000000..0947e36c --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/scripts/test_integration.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash + +# Toolchains for little-endian, 64-bit ARMv8 for GNU/Linux systems +function set_aarch64-linux-gnu() { + export TARGET=aarch64-linux-gnu +} + +# Toolchains for little-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems +function set_arm-linux-gnueabihf() { + export TARGET=arm-linux-gnueabihf +} + +# Toolchains for little-endian, 32-bit ARMv8 for GNU/Linux systems +function set_armv8l-linux-gnueabihf() { + export TARGET=armv8l-linux-gnueabihf +} + +# Toolchains for little-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems +function set_arm-linux-gnueabi() { + export TARGET=arm-linux-gnueabi +} + +# Toolchains for big-endian, 64-bit ARMv8 for GNU/Linux systems +function set_aarch64_be-linux-gnu() { + export TARGET=aarch64_be-linux-gnu +} + +# Toolchains for big-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems +function set_armeb-linux-gnueabihf() { + export TARGET=armeb-linux-gnueabihf +} + +# Toolchains for big-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems +function set_armeb-linux-gnueabi() { + export TARGET=armeb-linux-gnueabi +} + +function set_mips32() { + export TARGET=mips32 +} + +function set_mips32el() { + export TARGET=mips32el +} + +function set_mips64() { + export TARGET=mips64 +} + +function set_mips64el() { + export TARGET=mips64el +} + +function set_x86_64() { + export TARGET=x86_64 +} + +ENVIRONMENTS=" + set_aarch64-linux-gnu + set_arm-linux-gnueabihf + set_armv8l-linux-gnueabihf + set_arm-linux-gnueabi + set_aarch64_be-linux-gnu + set_armeb-linux-gnueabihf + set_armeb-linux-gnueabi + set_mips32 + set_mips32el + set_mips64 + set_mips64el + set_x86_64 +" + +set -e + +for SET_ENVIRONMENT in ${ENVIRONMENTS}; do + echo "testing ${SET_ENVIRONMENT}" + ${SET_ENVIRONMENT} + ./"$(dirname -- "$0")"/run_integration.sh +done diff --git a/node_modules/cpu-features/deps/cpu_features/src/copy.inl b/node_modules/cpu-features/deps/cpu_features/src/copy.inl new file mode 100644 index 00000000..47771d42 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/copy.inl @@ -0,0 +1,19 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +static void copy(char *__restrict dst, const char *src, size_t count) { + for (size_t i = 0; i < count; ++i) dst[i] = src[i]; +} diff --git a/node_modules/cpu-features/deps/cpu_features/src/define_introspection.inl b/node_modules/cpu-features/deps/cpu_features/src/define_introspection.inl new file mode 100644 index 00000000..c0eb916d --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/define_introspection.inl @@ -0,0 +1,86 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INTROSPECTION_PREFIX +#error "missing INTROSPECTION_PREFIX" +#endif +#ifndef INTROSPECTION_ENUM_PREFIX +#error "missing INTROSPECTION_ENUM_PREFIX" +#endif +#ifndef INTROSPECTION_TABLE +#error "missing INTROSPECTION_TABLE" +#endif + +#include + +#define STRINGIZE_(s) #s +#define STRINGIZE(s) STRINGIZE_(s) + +#define FEAT_TYPE_NAME__(X) X##Features +#define FEAT_TYPE_NAME_(X) FEAT_TYPE_NAME__(X) +#define FEAT_TYPE_NAME FEAT_TYPE_NAME_(INTROSPECTION_PREFIX) + +#define FEAT_ENUM_NAME__(X) X##FeaturesEnum +#define FEAT_ENUM_NAME_(X) FEAT_ENUM_NAME__(X) +#define FEAT_ENUM_NAME FEAT_ENUM_NAME_(INTROSPECTION_PREFIX) + +#define GET_FEAT_ENUM_VALUE__(X) Get##X##FeaturesEnumValue +#define GET_FEAT_ENUM_VALUE_(X) GET_FEAT_ENUM_VALUE__(X) +#define GET_FEAT_ENUM_VALUE GET_FEAT_ENUM_VALUE_(INTROSPECTION_PREFIX) + +#define GET_FEAT_ENUM_NAME__(X) Get##X##FeaturesEnumName +#define GET_FEAT_ENUM_NAME_(X) GET_FEAT_ENUM_NAME__(X) +#define GET_FEAT_ENUM_NAME GET_FEAT_ENUM_NAME_(INTROSPECTION_PREFIX) + +#define FEAT_ENUM_LAST__(X) X##_LAST_ +#define FEAT_ENUM_LAST_(X) FEAT_ENUM_LAST__(X) +#define FEAT_ENUM_LAST FEAT_ENUM_LAST_(INTROSPECTION_ENUM_PREFIX) + +// Generate individual getters and setters. +#define LINE(ENUM, NAME, A, B, C) \ + static void set_##ENUM(FEAT_TYPE_NAME* features, bool value) { \ + features->NAME = value; \ + } \ + static int get_##ENUM(const FEAT_TYPE_NAME* features) { \ + return features->NAME; \ + } +INTROSPECTION_TABLE +#undef LINE + +// Generate getters table +#define LINE(ENUM, NAME, A, B, C) [ENUM] = get_##ENUM, +static int (*const kGetters[])(const FEAT_TYPE_NAME*) = {INTROSPECTION_TABLE}; +#undef LINE + +// Generate setters table +#define LINE(ENUM, NAME, A, B, C) [ENUM] = set_##ENUM, +static void (*const kSetters[])(FEAT_TYPE_NAME*, bool) = {INTROSPECTION_TABLE}; +#undef LINE + +// Implements the `GetXXXFeaturesEnumValue` API. +int GET_FEAT_ENUM_VALUE(const FEAT_TYPE_NAME* features, FEAT_ENUM_NAME value) { + if (value >= FEAT_ENUM_LAST) return false; + return kGetters[value](features); +} + +// Generate feature name table. +#define LINE(ENUM, NAME, A, B, C) [ENUM] = STRINGIZE(NAME), +static const char* kFeatureNames[] = {INTROSPECTION_TABLE}; +#undef LINE + +// Implements the `GetXXXFeaturesEnumName` API. +const char* GET_FEAT_ENUM_NAME(FEAT_ENUM_NAME value) { + if (value >= FEAT_ENUM_LAST) return "unknown_feature"; + return kFeatureNames[value]; +} diff --git a/node_modules/cpu-features/deps/cpu_features/src/define_introspection_and_hwcaps.inl b/node_modules/cpu-features/deps/cpu_features/src/define_introspection_and_hwcaps.inl new file mode 100644 index 00000000..c31b60d9 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/define_introspection_and_hwcaps.inl @@ -0,0 +1,26 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "define_introspection.inl" +#include "internal/hwcaps.h" + +#define LINE(ENUM, NAME, CPUINFO_FLAG, HWCAP, HWCAP2) \ + [ENUM] = (HardwareCapabilities){HWCAP, HWCAP2}, +static const HardwareCapabilities kHardwareCapabilities[] = { + INTROSPECTION_TABLE}; +#undef LINE + +#define LINE(ENUM, NAME, CPUINFO_FLAG, HWCAP, HWCAP2) [ENUM] = CPUINFO_FLAG, +static const char* kCpuInfoFlags[] = {INTROSPECTION_TABLE}; +#undef LINE diff --git a/node_modules/cpu-features/deps/cpu_features/src/equals.inl b/node_modules/cpu-features/deps/cpu_features/src/equals.inl new file mode 100644 index 00000000..67a115ff --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/equals.inl @@ -0,0 +1,22 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +static bool equals(const char *lhs, const char *rhs, size_t count) { + for (size_t i = 0; i < count; ++i) + if (lhs[i] != rhs[i]) return false; + return true; +} diff --git a/node_modules/cpu-features/deps/cpu_features/src/filesystem.c b/node_modules/cpu-features/deps/cpu_features/src/filesystem.c new file mode 100644 index 00000000..46c99066 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/filesystem.c @@ -0,0 +1,62 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/filesystem.h" + +#include +#include +#include +#include +#include + +#if defined(CPU_FEATURES_MOCK_FILESYSTEM) +// Implementation will be provided by test/filesystem_for_testing.cc. +#elif defined(_MSC_VER) +#include +int CpuFeatures_OpenFile(const char* filename) { + int fd = -1; + _sopen_s(&fd, filename, _O_RDONLY, _SH_DENYWR, _S_IREAD); + return fd; +} + +void CpuFeatures_CloseFile(int file_descriptor) { _close(file_descriptor); } + +int CpuFeatures_ReadFile(int file_descriptor, void* buffer, + size_t buffer_size) { + return _read(file_descriptor, buffer, (unsigned int)buffer_size); +} + +#else +#include + +int CpuFeatures_OpenFile(const char* filename) { + int result; + do { + result = open(filename, O_RDONLY); + } while (result == -1L && errno == EINTR); + return result; +} + +void CpuFeatures_CloseFile(int file_descriptor) { close(file_descriptor); } + +int CpuFeatures_ReadFile(int file_descriptor, void* buffer, + size_t buffer_size) { + int result; + do { + result = read(file_descriptor, buffer, buffer_size); + } while (result == -1L && errno == EINTR); + return result; +} + +#endif diff --git a/node_modules/cpu-features/deps/cpu_features/src/hwcaps.c b/node_modules/cpu-features/deps/cpu_features/src/hwcaps.c new file mode 100644 index 00000000..f44f6c39 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/hwcaps.c @@ -0,0 +1,169 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/hwcaps.h" + +#include +#include + +#include "cpu_features_macros.h" +#include "internal/filesystem.h" +#include "internal/string_view.h" + +static bool IsSet(const uint32_t mask, const uint32_t value) { + if (mask == 0) return false; + return (value & mask) == mask; +} + +bool CpuFeatures_IsHwCapsSet(const HardwareCapabilities hwcaps_mask, + const HardwareCapabilities hwcaps) { + return IsSet(hwcaps_mask.hwcaps, hwcaps.hwcaps) || + IsSet(hwcaps_mask.hwcaps2, hwcaps.hwcaps2); +} + +#ifdef CPU_FEATURES_TEST +// In test mode, hwcaps_for_testing will define the following functions. +HardwareCapabilities CpuFeatures_GetHardwareCapabilities(void); +const char* CpuFeatures_GetPlatformPointer(void); +const char* CpuFeatures_GetBasePlatformPointer(void); +#else + +// Debug facilities +#if defined(NDEBUG) +#define D(...) +#else +#include +#define D(...) \ + do { \ + printf(__VA_ARGS__); \ + fflush(stdout); \ + } while (0) +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Implementation of GetElfHwcapFromGetauxval +//////////////////////////////////////////////////////////////////////////////// + +#define AT_HWCAP 16 +#define AT_HWCAP2 26 +#define AT_PLATFORM 15 +#define AT_BASE_PLATFORM 24 + +#if defined(HAVE_STRONG_GETAUXVAL) +#include +static unsigned long GetElfHwcapFromGetauxval(uint32_t hwcap_type) { + return getauxval(hwcap_type); +} +#elif defined(HAVE_DLFCN_H) +// On Android we probe the system's C library for a 'getauxval' function and +// call it if it exits, or return 0 for failure. This function is available +// since API level 18. +// +// Note that getauxval() can't really be re-implemented here, because its +// implementation does not parse /proc/self/auxv. Instead it depends on values +// that are passed by the kernel at process-init time to the C runtime +// initialization layer. + +#include + +typedef unsigned long getauxval_func_t(unsigned long); + +static uint32_t GetElfHwcapFromGetauxval(uint32_t hwcap_type) { + uint32_t ret = 0; + void *libc_handle = NULL; + getauxval_func_t *func = NULL; + + dlerror(); // Cleaning error state before calling dlopen. + libc_handle = dlopen("libc.so", RTLD_NOW); + if (!libc_handle) { + D("Could not dlopen() C library: %s\n", dlerror()); + return 0; + } + func = (getauxval_func_t *)dlsym(libc_handle, "getauxval"); + if (!func) { + D("Could not find getauxval() in C library\n"); + } else { + // Note: getauxval() returns 0 on failure. Doesn't touch errno. + ret = (uint32_t)(*func)(hwcap_type); + } + dlclose(libc_handle); + return ret; +} +#else +#error "This platform does not provide hardware capabilities." +#endif + +// Implementation of GetHardwareCapabilities for OS that provide +// GetElfHwcapFromGetauxval(). + +// Fallback when getauxval is not available, retrieves hwcaps from +// "/proc/self/auxv". +static uint32_t GetElfHwcapFromProcSelfAuxv(uint32_t hwcap_type) { + struct { + uint32_t tag; + uint32_t value; + } entry; + uint32_t result = 0; + const char filepath[] = "/proc/self/auxv"; + const int fd = CpuFeatures_OpenFile(filepath); + if (fd < 0) { + D("Could not open %s\n", filepath); + return 0; + } + for (;;) { + const int ret = CpuFeatures_ReadFile(fd, (char *)&entry, sizeof entry); + if (ret < 0) { + D("Error while reading %s\n", filepath); + break; + } + // Detect end of list. + if (ret == 0 || (entry.tag == 0 && entry.value == 0)) { + break; + } + if (entry.tag == hwcap_type) { + result = entry.value; + break; + } + } + CpuFeatures_CloseFile(fd); + return result; +} + +// Retrieves hardware capabilities by first trying to call getauxval, if not +// available falls back to reading "/proc/self/auxv". +static unsigned long GetHardwareCapabilitiesFor(uint32_t type) { + unsigned long hwcaps = GetElfHwcapFromGetauxval(type); + if (!hwcaps) { + D("Parsing /proc/self/auxv to extract ELF hwcaps!\n"); + hwcaps = GetElfHwcapFromProcSelfAuxv(type); + } + return hwcaps; +} + +HardwareCapabilities CpuFeatures_GetHardwareCapabilities(void) { + HardwareCapabilities capabilities; + capabilities.hwcaps = GetHardwareCapabilitiesFor(AT_HWCAP); + capabilities.hwcaps2 = GetHardwareCapabilitiesFor(AT_HWCAP2); + return capabilities; +} + +const char *CpuFeatures_GetPlatformPointer(void) { + return (const char *)GetHardwareCapabilitiesFor(AT_PLATFORM); +} + +const char *CpuFeatures_GetBasePlatformPointer(void) { + return (const char *)GetHardwareCapabilitiesFor(AT_BASE_PLATFORM); +} + +#endif // CPU_FEATURES_TEST diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64__base_implementation.inl b/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64__base_implementation.inl new file mode 100644 index 00000000..9677a6f4 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64__base_implementation.inl @@ -0,0 +1,88 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "cpuinfo_aarch64.h" +#include "internal/bit_utils.h" +#include "internal/filesystem.h" +#include "internal/stack_line_reader.h" +#include "internal/string_view.h" + +#if !defined(CPU_FEATURES_ARCH_AARCH64) +#error "Cannot compile aarch64_base on a non aarch64 platform." +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for introspection. +//////////////////////////////////////////////////////////////////////////////// +#define INTROSPECTION_TABLE \ + LINE(AARCH64_FP, fp, "fp", AARCH64_HWCAP_FP, 0) \ + LINE(AARCH64_ASIMD, asimd, "asimd", AARCH64_HWCAP_ASIMD, 0) \ + LINE(AARCH64_EVTSTRM, evtstrm, "evtstrm", AARCH64_HWCAP_EVTSTRM, 0) \ + LINE(AARCH64_AES, aes, "aes", AARCH64_HWCAP_AES, 0) \ + LINE(AARCH64_PMULL, pmull, "pmull", AARCH64_HWCAP_PMULL, 0) \ + LINE(AARCH64_SHA1, sha1, "sha1", AARCH64_HWCAP_SHA1, 0) \ + LINE(AARCH64_SHA2, sha2, "sha2", AARCH64_HWCAP_SHA2, 0) \ + LINE(AARCH64_CRC32, crc32, "crc32", AARCH64_HWCAP_CRC32, 0) \ + LINE(AARCH64_ATOMICS, atomics, "atomics", AARCH64_HWCAP_ATOMICS, 0) \ + LINE(AARCH64_FPHP, fphp, "fphp", AARCH64_HWCAP_FPHP, 0) \ + LINE(AARCH64_ASIMDHP, asimdhp, "asimdhp", AARCH64_HWCAP_ASIMDHP, 0) \ + LINE(AARCH64_CPUID, cpuid, "cpuid", AARCH64_HWCAP_CPUID, 0) \ + LINE(AARCH64_ASIMDRDM, asimdrdm, "asimdrdm", AARCH64_HWCAP_ASIMDRDM, 0) \ + LINE(AARCH64_JSCVT, jscvt, "jscvt", AARCH64_HWCAP_JSCVT, 0) \ + LINE(AARCH64_FCMA, fcma, "fcma", AARCH64_HWCAP_FCMA, 0) \ + LINE(AARCH64_LRCPC, lrcpc, "lrcpc", AARCH64_HWCAP_LRCPC, 0) \ + LINE(AARCH64_DCPOP, dcpop, "dcpop", AARCH64_HWCAP_DCPOP, 0) \ + LINE(AARCH64_SHA3, sha3, "sha3", AARCH64_HWCAP_SHA3, 0) \ + LINE(AARCH64_SM3, sm3, "sm3", AARCH64_HWCAP_SM3, 0) \ + LINE(AARCH64_SM4, sm4, "sm4", AARCH64_HWCAP_SM4, 0) \ + LINE(AARCH64_ASIMDDP, asimddp, "asimddp", AARCH64_HWCAP_ASIMDDP, 0) \ + LINE(AARCH64_SHA512, sha512, "sha512", AARCH64_HWCAP_SHA512, 0) \ + LINE(AARCH64_SVE, sve, "sve", AARCH64_HWCAP_SVE, 0) \ + LINE(AARCH64_ASIMDFHM, asimdfhm, "asimdfhm", AARCH64_HWCAP_ASIMDFHM, 0) \ + LINE(AARCH64_DIT, dit, "dit", AARCH64_HWCAP_DIT, 0) \ + LINE(AARCH64_USCAT, uscat, "uscat", AARCH64_HWCAP_USCAT, 0) \ + LINE(AARCH64_ILRCPC, ilrcpc, "ilrcpc", AARCH64_HWCAP_ILRCPC, 0) \ + LINE(AARCH64_FLAGM, flagm, "flagm", AARCH64_HWCAP_FLAGM, 0) \ + LINE(AARCH64_SSBS, ssbs, "ssbs", AARCH64_HWCAP_SSBS, 0) \ + LINE(AARCH64_SB, sb, "sb", AARCH64_HWCAP_SB, 0) \ + LINE(AARCH64_PACA, paca, "paca", AARCH64_HWCAP_PACA, 0) \ + LINE(AARCH64_PACG, pacg, "pacg", AARCH64_HWCAP_PACG, 0) \ + LINE(AARCH64_DCPODP, dcpodp, "dcpodp", 0, AARCH64_HWCAP2_DCPODP) \ + LINE(AARCH64_SVE2, sve2, "sve2", 0, AARCH64_HWCAP2_SVE2) \ + LINE(AARCH64_SVEAES, sveaes, "sveaes", 0, AARCH64_HWCAP2_SVEAES) \ + LINE(AARCH64_SVEPMULL, svepmull, "svepmull", 0, AARCH64_HWCAP2_SVEPMULL) \ + LINE(AARCH64_SVEBITPERM, svebitperm, "svebitperm", 0, \ + AARCH64_HWCAP2_SVEBITPERM) \ + LINE(AARCH64_SVESHA3, svesha3, "svesha3", 0, AARCH64_HWCAP2_SVESHA3) \ + LINE(AARCH64_SVESM4, svesm4, "svesm4", 0, AARCH64_HWCAP2_SVESM4) \ + LINE(AARCH64_FLAGM2, flagm2, "flagm2", 0, AARCH64_HWCAP2_FLAGM2) \ + LINE(AARCH64_FRINT, frint, "frint", 0, AARCH64_HWCAP2_FRINT) \ + LINE(AARCH64_SVEI8MM, svei8mm, "svei8mm", 0, AARCH64_HWCAP2_SVEI8MM) \ + LINE(AARCH64_SVEF32MM, svef32mm, "svef32mm", 0, AARCH64_HWCAP2_SVEF32MM) \ + LINE(AARCH64_SVEF64MM, svef64mm, "svef64mm", 0, AARCH64_HWCAP2_SVEF64MM) \ + LINE(AARCH64_SVEBF16, svebf16, "svebf16", 0, AARCH64_HWCAP2_SVEBF16) \ + LINE(AARCH64_I8MM, i8mm, "i8mm", 0, AARCH64_HWCAP2_I8MM) \ + LINE(AARCH64_BF16, bf16, "bf16", 0, AARCH64_HWCAP2_BF16) \ + LINE(AARCH64_DGH, dgh, "dgh", 0, AARCH64_HWCAP2_DGH) \ + LINE(AARCH64_RNG, rng, "rng", 0, AARCH64_HWCAP2_RNG) \ + LINE(AARCH64_BTI, bti, "bti", 0, AARCH64_HWCAP2_BTI) \ + LINE(AARCH64_MTE, mte, "mte", 0, AARCH64_HWCAP2_MTE) \ + LINE(AARCH64_ECV, ecv, "ecv", 0, AARCH64_HWCAP2_ECV) \ + LINE(AARCH64_AFP, afp, "afp", 0, AARCH64_HWCAP2_AFP) \ + LINE(AARCH64_RPRES, rpres, "rpres", 0, AARCH64_HWCAP2_RPRES) +#define INTROSPECTION_PREFIX Aarch64 +#define INTROSPECTION_ENUM_PREFIX AARCH64 +#include "define_introspection_and_hwcaps.inl" diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_linux_or_android.c b/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_linux_or_android.c new file mode 100644 index 00000000..c0a764cc --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_linux_or_android.c @@ -0,0 +1,79 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_AARCH64 +#if defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) + +#include "impl_aarch64__base_implementation.inl" + +static bool HandleAarch64Line(const LineResult result, + Aarch64Info* const info) { + StringView line = result.line; + StringView key, value; + if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) { + if (CpuFeatures_StringView_IsEquals(key, str("Features"))) { + for (size_t i = 0; i < AARCH64_LAST_; ++i) { + kSetters[i](&info->features, CpuFeatures_StringView_HasWord( + value, kCpuInfoFlags[i], ' ')); + } + } else if (CpuFeatures_StringView_IsEquals(key, str("CPU implementer"))) { + info->implementer = CpuFeatures_StringView_ParsePositiveNumber(value); + } else if (CpuFeatures_StringView_IsEquals(key, str("CPU variant"))) { + info->variant = CpuFeatures_StringView_ParsePositiveNumber(value); + } else if (CpuFeatures_StringView_IsEquals(key, str("CPU part"))) { + info->part = CpuFeatures_StringView_ParsePositiveNumber(value); + } else if (CpuFeatures_StringView_IsEquals(key, str("CPU revision"))) { + info->revision = CpuFeatures_StringView_ParsePositiveNumber(value); + } + } + return !result.eof; +} + +static void FillProcCpuInfoData(Aarch64Info* const info) { + const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); + if (fd >= 0) { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + for (;;) { + if (!HandleAarch64Line(StackLineReader_NextLine(&reader), info)) { + break; + } + } + CpuFeatures_CloseFile(fd); + } +} + +static const Aarch64Info kEmptyAarch64Info; + +Aarch64Info GetAarch64Info(void) { + // capabilities are fetched from both getauxval and /proc/cpuinfo so we can + // have some information if the executable is sandboxed (aka no access to + // /proc/cpuinfo). + Aarch64Info info = kEmptyAarch64Info; + + FillProcCpuInfoData(&info); + const HardwareCapabilities hwcaps = CpuFeatures_GetHardwareCapabilities(); + for (size_t i = 0; i < AARCH64_LAST_; ++i) { + if (CpuFeatures_IsHwCapsSet(kHardwareCapabilities[i], hwcaps)) { + kSetters[i](&info.features, true); + } + } + + return info; +} + +#endif // defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) +#endif // CPU_FEATURES_ARCH_AARCH64 diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c b/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c new file mode 100644 index 00000000..0f95058e --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c @@ -0,0 +1,82 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_AARCH64 +#if defined(CPU_FEATURES_OS_MACOS) || defined(CPU_FEATURES_OS_IPHONE) + +#include "impl_aarch64__base_implementation.inl" + +#if !defined(HAVE_SYSCTLBYNAME) +#error "Darwin needs support for sysctlbyname" +#endif +#include + +#if defined(CPU_FEATURES_MOCK_SYSCTL_AARCH64) +extern bool GetDarwinSysCtlByName(const char*); +extern int GetDarwinSysCtlByNameValue(const char* name); +#else +static int GetDarwinSysCtlByNameValue(const char* name) { + int enabled; + size_t enabled_len = sizeof(enabled); + const int failure = sysctlbyname(name, &enabled, &enabled_len, NULL, 0); + return failure ? 0 : enabled; +} + +static bool GetDarwinSysCtlByName(const char* name) { + return GetDarwinSysCtlByNameValue(name) != 0; +} +#endif + +static const Aarch64Info kEmptyAarch64Info; + +Aarch64Info GetAarch64Info(void) { + Aarch64Info info = kEmptyAarch64Info; + + // Handling Darwin platform through sysctlbyname. + info.implementer = GetDarwinSysCtlByNameValue("hw.cputype"); + info.variant = GetDarwinSysCtlByNameValue("hw.cpusubtype"); + info.part = GetDarwinSysCtlByNameValue("hw.cpufamily"); + info.revision = GetDarwinSysCtlByNameValue("hw.cpusubfamily"); + + info.features.fp = GetDarwinSysCtlByName("hw.optional.floatingpoint"); + info.features.asimd = GetDarwinSysCtlByName("hw.optional.AdvSIMD"); + info.features.aes = GetDarwinSysCtlByName("hw.optional.arm.FEAT_AES"); + info.features.pmull = GetDarwinSysCtlByName("hw.optional.arm.FEAT_PMULL"); + info.features.sha1 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA1"); + info.features.sha2 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA2"); + info.features.crc32 = GetDarwinSysCtlByName("hw.optional.armv8_crc32"); + info.features.atomics = GetDarwinSysCtlByName("hw.optional.armv8_1_atomics"); + info.features.fphp = GetDarwinSysCtlByName("hw.optional.neon_hpfp"); + info.features.jscvt = GetDarwinSysCtlByName("hw.optional.arm.FEAT_JSCVT"); + info.features.fcma = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FCMA"); + info.features.lrcpc = GetDarwinSysCtlByName("hw.optional.arm.FEAT_LRCPC"); + info.features.sha3 = GetDarwinSysCtlByName("hw.optional.armv8_2_sha3"); + info.features.sha512 = GetDarwinSysCtlByName("hw.optional.armv8_2_sha512"); + info.features.asimdfhm = GetDarwinSysCtlByName("hw.optional.armv8_2_fhm"); + info.features.flagm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FLAGM"); + info.features.flagm2 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FLAGM2"); + info.features.ssbs = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SSBS"); + info.features.sb = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SB"); + info.features.i8mm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_I8MM"); + info.features.bf16 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_BF16"); + info.features.bti = GetDarwinSysCtlByName("hw.optional.arm.FEAT_BTI"); + info.features.ecv = GetDarwinSysCtlByName("hw.optional.arm.FEAT_ECV"); + + return info; +} + +#endif // defined(CPU_FEATURES_OS_MACOS) || defined(CPU_FEATURES_OS_IPHONE) +#endif // CPU_FEATURES_ARCH_AARCH64 diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_windows.c b/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_windows.c new file mode 100644 index 00000000..f1039091 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_windows.c @@ -0,0 +1,138 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_AARCH64 +#ifdef CPU_FEATURES_OS_WINDOWS + +#include "cpuinfo_aarch64.h" + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for introspection. +//////////////////////////////////////////////////////////////////////////////// +#define INTROSPECTION_TABLE \ + LINE(AARCH64_FP, fp, , , ) \ + LINE(AARCH64_ASIMD, asimd, , , ) \ + LINE(AARCH64_EVTSTRM, evtstrm, , , ) \ + LINE(AARCH64_AES, aes, , , ) \ + LINE(AARCH64_PMULL, pmull, , , ) \ + LINE(AARCH64_SHA1, sha1, , , ) \ + LINE(AARCH64_SHA2, sha2, , , ) \ + LINE(AARCH64_CRC32, crc32, , , ) \ + LINE(AARCH64_ATOMICS, atomics, , , ) \ + LINE(AARCH64_FPHP, fphp, , , ) \ + LINE(AARCH64_ASIMDHP, asimdhp, , , ) \ + LINE(AARCH64_CPUID, cpuid, , , ) \ + LINE(AARCH64_ASIMDRDM, asimdrdm, , , ) \ + LINE(AARCH64_JSCVT, jscvt, , , ) \ + LINE(AARCH64_FCMA, fcma, , , ) \ + LINE(AARCH64_LRCPC, lrcpc, , , ) \ + LINE(AARCH64_DCPOP, dcpop, , , ) \ + LINE(AARCH64_SHA3, sha3, , , ) \ + LINE(AARCH64_SM3, sm3, , , ) \ + LINE(AARCH64_SM4, sm4, , , ) \ + LINE(AARCH64_ASIMDDP, asimddp, , , ) \ + LINE(AARCH64_SHA512, sha512, , , ) \ + LINE(AARCH64_SVE, sve, , , ) \ + LINE(AARCH64_ASIMDFHM, asimdfhm, , , ) \ + LINE(AARCH64_DIT, dit, , , ) \ + LINE(AARCH64_USCAT, uscat, , , ) \ + LINE(AARCH64_ILRCPC, ilrcpc, , , ) \ + LINE(AARCH64_FLAGM, flagm, , , ) \ + LINE(AARCH64_SSBS, ssbs, , , ) \ + LINE(AARCH64_SB, sb, , , ) \ + LINE(AARCH64_PACA, paca, , , ) \ + LINE(AARCH64_PACG, pacg, , , ) \ + LINE(AARCH64_DCPODP, dcpodp, , , ) \ + LINE(AARCH64_SVE2, sve2, , , ) \ + LINE(AARCH64_SVEAES, sveaes, , , ) \ + LINE(AARCH64_SVEPMULL, svepmull, , , ) \ + LINE(AARCH64_SVEBITPERM, svebitperm, , , ) \ + LINE(AARCH64_SVESHA3, svesha3, , , ) \ + LINE(AARCH64_SVESM4, svesm4, , , ) \ + LINE(AARCH64_FLAGM2, flagm2, , , ) \ + LINE(AARCH64_FRINT, frint, , , ) \ + LINE(AARCH64_SVEI8MM, svei8mm, , , ) \ + LINE(AARCH64_SVEF32MM, svef32mm, , , ) \ + LINE(AARCH64_SVEF64MM, svef64mm, , , ) \ + LINE(AARCH64_SVEBF16, svebf16, , , ) \ + LINE(AARCH64_I8MM, i8mm, , , ) \ + LINE(AARCH64_BF16, bf16, , , ) \ + LINE(AARCH64_DGH, dgh, , , ) \ + LINE(AARCH64_RNG, rng, , , ) \ + LINE(AARCH64_BTI, bti, , , ) \ + LINE(AARCH64_MTE, mte, , , ) \ + LINE(AARCH64_ECV, ecv, , , ) \ + LINE(AARCH64_AFP, afp, , , ) \ + LINE(AARCH64_RPRES, rpres, , , ) +#define INTROSPECTION_PREFIX Aarch64 +#define INTROSPECTION_ENUM_PREFIX AARCH64 +#include "define_introspection.inl" + +//////////////////////////////////////////////////////////////////////////////// +// Implementation. +//////////////////////////////////////////////////////////////////////////////// + +#include + +#include "internal/windows_utils.h" + +#ifdef CPU_FEATURES_MOCK_CPUID_AARCH64 +extern bool GetWindowsIsProcessorFeaturePresent(DWORD); +extern WORD GetWindowsNativeSystemInfoProcessorRevision(); +#else // CPU_FEATURES_MOCK_CPUID_AARCH64 +static bool GetWindowsIsProcessorFeaturePresent(DWORD dwProcessorFeature) { + return IsProcessorFeaturePresent(dwProcessorFeature); +} + +static WORD GetWindowsNativeSystemInfoProcessorRevision() { + SYSTEM_INFO system_info; + GetNativeSystemInfo(&system_info); + return system_info.wProcessorRevision; +} +#endif + +static const Aarch64Info kEmptyAarch64Info; + +Aarch64Info GetAarch64Info(void) { + Aarch64Info info = kEmptyAarch64Info; + info.revision = GetWindowsNativeSystemInfoProcessorRevision(); + info.features.fp = + GetWindowsIsProcessorFeaturePresent(PF_ARM_VFP_32_REGISTERS_AVAILABLE); + info.features.asimd = + GetWindowsIsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE); + info.features.crc32 = GetWindowsIsProcessorFeaturePresent( + PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE); + info.features.asimddp = + GetWindowsIsProcessorFeaturePresent(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE); + info.features.jscvt = GetWindowsIsProcessorFeaturePresent( + PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE); + info.features.lrcpc = GetWindowsIsProcessorFeaturePresent( + PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE); + info.features.atomics = GetWindowsIsProcessorFeaturePresent( + PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE); + + + bool is_crypto_available = GetWindowsIsProcessorFeaturePresent( + PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE); + info.features.aes = is_crypto_available; + info.features.sha1 = is_crypto_available; + info.features.sha2 = is_crypto_available; + info.features.pmull = is_crypto_available; + return info; +} + +#endif // CPU_FEATURES_OS_WINDOWS +#endif // CPU_FEATURES_ARCH_AARCH64 diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_arm_linux_or_android.c b/node_modules/cpu-features/deps/cpu_features/src/impl_arm_linux_or_android.c new file mode 100644 index 00000000..997ef936 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_arm_linux_or_android.c @@ -0,0 +1,212 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_ARM +#if defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) + +#include "cpuinfo_arm.h" + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for introspection. +//////////////////////////////////////////////////////////////////////////////// +#define INTROSPECTION_TABLE \ + LINE(ARM_SWP, swp, "swp", ARM_HWCAP_SWP, 0) \ + LINE(ARM_HALF, half, "half", ARM_HWCAP_HALF, 0) \ + LINE(ARM_THUMB, thumb, "thumb", ARM_HWCAP_THUMB, 0) \ + LINE(ARM_26BIT, _26bit, "26bit", ARM_HWCAP_26BIT, 0) \ + LINE(ARM_FASTMULT, fastmult, "fastmult", ARM_HWCAP_FAST_MULT, 0) \ + LINE(ARM_FPA, fpa, "fpa", ARM_HWCAP_FPA, 0) \ + LINE(ARM_VFP, vfp, "vfp", ARM_HWCAP_VFP, 0) \ + LINE(ARM_EDSP, edsp, "edsp", ARM_HWCAP_EDSP, 0) \ + LINE(ARM_JAVA, java, "java", ARM_HWCAP_JAVA, 0) \ + LINE(ARM_IWMMXT, iwmmxt, "iwmmxt", ARM_HWCAP_IWMMXT, 0) \ + LINE(ARM_CRUNCH, crunch, "crunch", ARM_HWCAP_CRUNCH, 0) \ + LINE(ARM_THUMBEE, thumbee, "thumbee", ARM_HWCAP_THUMBEE, 0) \ + LINE(ARM_NEON, neon, "neon", ARM_HWCAP_NEON, 0) \ + LINE(ARM_VFPV3, vfpv3, "vfpv3", ARM_HWCAP_VFPV3, 0) \ + LINE(ARM_VFPV3D16, vfpv3d16, "vfpv3d16", ARM_HWCAP_VFPV3D16, 0) \ + LINE(ARM_TLS, tls, "tls", ARM_HWCAP_TLS, 0) \ + LINE(ARM_VFPV4, vfpv4, "vfpv4", ARM_HWCAP_VFPV4, 0) \ + LINE(ARM_IDIVA, idiva, "idiva", ARM_HWCAP_IDIVA, 0) \ + LINE(ARM_IDIVT, idivt, "idivt", ARM_HWCAP_IDIVT, 0) \ + LINE(ARM_VFPD32, vfpd32, "vfpd32", ARM_HWCAP_VFPD32, 0) \ + LINE(ARM_LPAE, lpae, "lpae", ARM_HWCAP_LPAE, 0) \ + LINE(ARM_EVTSTRM, evtstrm, "evtstrm", ARM_HWCAP_EVTSTRM, 0) \ + LINE(ARM_AES, aes, "aes", 0, ARM_HWCAP2_AES) \ + LINE(ARM_PMULL, pmull, "pmull", 0, ARM_HWCAP2_PMULL) \ + LINE(ARM_SHA1, sha1, "sha1", 0, ARM_HWCAP2_SHA1) \ + LINE(ARM_SHA2, sha2, "sha2", 0, ARM_HWCAP2_SHA2) \ + LINE(ARM_CRC32, crc32, "crc32", 0, ARM_HWCAP2_CRC32) +#define INTROSPECTION_PREFIX Arm +#define INTROSPECTION_ENUM_PREFIX ARM +#include "define_introspection_and_hwcaps.inl" + +//////////////////////////////////////////////////////////////////////////////// +// Implementation. +//////////////////////////////////////////////////////////////////////////////// + +#include +#include + +#include "internal/bit_utils.h" +#include "internal/filesystem.h" +#include "internal/stack_line_reader.h" +#include "internal/string_view.h" + +typedef struct { + bool processor_reports_armv6; + bool hardware_reports_goldfish; +} ProcCpuInfoData; + +static int IndexOfNonDigit(StringView str) { + size_t index = 0; + while (str.size && isdigit(CpuFeatures_StringView_Front(str))) { + str = CpuFeatures_StringView_PopFront(str, 1); + ++index; + } + return index; +} + +static bool HandleArmLine(const LineResult result, ArmInfo* const info, + ProcCpuInfoData* const proc_info) { + StringView line = result.line; + StringView key, value; + if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) { + if (CpuFeatures_StringView_IsEquals(key, str("Features"))) { + for (size_t i = 0; i < ARM_LAST_; ++i) { + kSetters[i](&info->features, CpuFeatures_StringView_HasWord( + value, kCpuInfoFlags[i], ' ')); + } + } else if (CpuFeatures_StringView_IsEquals(key, str("CPU implementer"))) { + info->implementer = CpuFeatures_StringView_ParsePositiveNumber(value); + } else if (CpuFeatures_StringView_IsEquals(key, str("CPU variant"))) { + info->variant = CpuFeatures_StringView_ParsePositiveNumber(value); + } else if (CpuFeatures_StringView_IsEquals(key, str("CPU part"))) { + info->part = CpuFeatures_StringView_ParsePositiveNumber(value); + } else if (CpuFeatures_StringView_IsEquals(key, str("CPU revision"))) { + info->revision = CpuFeatures_StringView_ParsePositiveNumber(value); + } else if (CpuFeatures_StringView_IsEquals(key, str("CPU architecture"))) { + // CPU architecture is a number that may be followed by letters. e.g. + // "6TEJ", "7". + const StringView digits = + CpuFeatures_StringView_KeepFront(value, IndexOfNonDigit(value)); + info->architecture = CpuFeatures_StringView_ParsePositiveNumber(digits); + } else if (CpuFeatures_StringView_IsEquals(key, str("Processor")) || + CpuFeatures_StringView_IsEquals(key, str("model name"))) { + // Android reports this in a non-Linux standard "Processor" but sometimes + // also in "model name", Linux reports it only in "model name" + // see RaspberryPiZero (Linux) vs InvalidArmv7 (Android) test-cases + proc_info->processor_reports_armv6 = + CpuFeatures_StringView_IndexOf(value, str("(v6l)")) >= 0; + } else if (CpuFeatures_StringView_IsEquals(key, str("Hardware"))) { + proc_info->hardware_reports_goldfish = + CpuFeatures_StringView_IsEquals(value, str("Goldfish")); + } + } + return !result.eof; +} + +uint32_t GetArmCpuId(const ArmInfo* const info) { + return (ExtractBitRange(info->implementer, 7, 0) << 24) | + (ExtractBitRange(info->variant, 3, 0) << 20) | + (ExtractBitRange(info->part, 11, 0) << 4) | + (ExtractBitRange(info->revision, 3, 0) << 0); +} + +static void FixErrors(ArmInfo* const info, + ProcCpuInfoData* const proc_cpu_info_data) { + // Fixing Samsung kernel reporting invalid cpu architecture. + // http://code.google.com/p/android/issues/detail?id=10812 + if (proc_cpu_info_data->processor_reports_armv6 && info->architecture >= 7) { + info->architecture = 6; + } + + // Handle kernel configuration bugs that prevent the correct reporting of CPU + // features. + switch (GetArmCpuId(info)) { + case 0x4100C080: + // Special case: The emulator-specific Android 4.2 kernel fails to report + // support for the 32-bit ARM IDIV instruction. Technically, this is a + // feature of the virtual CPU implemented by the emulator. Note that it + // could also support Thumb IDIV in the future, and this will have to be + // slightly updated. + if (info->architecture >= 7 && + proc_cpu_info_data->hardware_reports_goldfish) { + info->features.idiva = true; + } + break; + case 0x511004D0: + // https://crbug.com/341598. + info->features.neon = false; + break; + } + + // Some Qualcomm Krait kernels forget to report IDIV support. + // https://github.com/torvalds/linux/commit/120ecfafabec382c4feb79ff159ef42a39b6d33b + if (info->implementer == 0x51 && info->architecture == 7 && + (info->part == 0x4d || info->part == 0x6f)) { + info->features.idiva = true; + info->features.idivt = true; + } + + // Propagate cpu features. + if (info->features.vfpv4) info->features.vfpv3 = true; + if (info->features.neon) info->features.vfpv3 = true; + if (info->features.vfpv3) info->features.vfp = true; +} + +static void FillProcCpuInfoData(ArmInfo* const info, + ProcCpuInfoData* proc_cpu_info_data) { + const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); + if (fd >= 0) { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + for (;;) { + if (!HandleArmLine(StackLineReader_NextLine(&reader), info, + proc_cpu_info_data)) { + break; + } + } + CpuFeatures_CloseFile(fd); + } +} + +static const ArmInfo kEmptyArmInfo; + +static const ProcCpuInfoData kEmptyProcCpuInfoData; + +ArmInfo GetArmInfo(void) { + // capabilities are fetched from both getauxval and /proc/cpuinfo so we can + // have some information if the executable is sandboxed (aka no access to + // /proc/cpuinfo). + ArmInfo info = kEmptyArmInfo; + ProcCpuInfoData proc_cpu_info_data = kEmptyProcCpuInfoData; + + FillProcCpuInfoData(&info, &proc_cpu_info_data); + const HardwareCapabilities hwcaps = CpuFeatures_GetHardwareCapabilities(); + for (size_t i = 0; i < ARM_LAST_; ++i) { + if (CpuFeatures_IsHwCapsSet(kHardwareCapabilities[i], hwcaps)) { + kSetters[i](&info.features, true); + } + } + + FixErrors(&info, &proc_cpu_info_data); + + return info; +} + +#endif // defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) +#endif // CPU_FEATURES_ARCH_ARM diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_mips_linux_or_android.c b/node_modules/cpu-features/deps/cpu_features/src/impl_mips_linux_or_android.c new file mode 100644 index 00000000..2322ecf4 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_mips_linux_or_android.c @@ -0,0 +1,93 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_MIPS +#if defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) + +#include "cpuinfo_mips.h" + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for introspection. +//////////////////////////////////////////////////////////////////////////////// +#define INTROSPECTION_TABLE \ + LINE(MIPS_MSA, msa, "msa", MIPS_HWCAP_MSA, 0) \ + LINE(MIPS_EVA, eva, "eva", 0, 0) \ + LINE(MIPS_R6, r6, "r6", MIPS_HWCAP_R6, 0) \ + LINE(MIPS_MIPS16, mips16, "mips16", MIPS_HWCAP_MIPS16, 0) \ + LINE(MIPS_MDMX, mdmx, "mdmx", MIPS_HWCAP_MDMX, 0) \ + LINE(MIPS_MIPS3D, mips3d, "mips3d", MIPS_HWCAP_MIPS3D, 0) \ + LINE(MIPS_SMART, smart, "smartmips", MIPS_HWCAP_SMARTMIPS, 0) \ + LINE(MIPS_DSP, dsp, "dsp", MIPS_HWCAP_DSP, 0) +#define INTROSPECTION_PREFIX Mips +#define INTROSPECTION_ENUM_PREFIX MIPS +#include "define_introspection_and_hwcaps.inl" + +//////////////////////////////////////////////////////////////////////////////// +// Implementation. +//////////////////////////////////////////////////////////////////////////////// + +#include "internal/filesystem.h" +#include "internal/hwcaps.h" +#include "internal/stack_line_reader.h" +#include "internal/string_view.h" + +static bool HandleMipsLine(const LineResult result, + MipsFeatures* const features) { + StringView key, value; + // See tests for an example. + if (CpuFeatures_StringView_GetAttributeKeyValue(result.line, &key, &value)) { + if (CpuFeatures_StringView_IsEquals(key, str("ASEs implemented"))) { + for (size_t i = 0; i < MIPS_LAST_; ++i) { + kSetters[i](features, CpuFeatures_StringView_HasWord( + value, kCpuInfoFlags[i], ' ')); + } + } + } + return !result.eof; +} + +static void FillProcCpuInfoData(MipsFeatures* const features) { + const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); + if (fd >= 0) { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + for (;;) { + if (!HandleMipsLine(StackLineReader_NextLine(&reader), features)) { + break; + } + } + CpuFeatures_CloseFile(fd); + } +} + +static const MipsInfo kEmptyMipsInfo; + +MipsInfo GetMipsInfo(void) { + // capabilities are fetched from both getauxval and /proc/cpuinfo so we can + // have some information if the executable is sandboxed (aka no access to + // /proc/cpuinfo). + MipsInfo info = kEmptyMipsInfo; + + FillProcCpuInfoData(&info.features); + const HardwareCapabilities hwcaps = CpuFeatures_GetHardwareCapabilities(); + for (size_t i = 0; i < MIPS_LAST_; ++i) { + if (CpuFeatures_IsHwCapsSet(kHardwareCapabilities[i], hwcaps)) { + kSetters[i](&info.features, true); + } + } + return info; +} + +#endif // defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) +#endif // CPU_FEATURES_ARCH_MIPS diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_ppc_linux.c b/node_modules/cpu-features/deps/cpu_features/src/impl_ppc_linux.c new file mode 100644 index 00000000..46a72d77 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_ppc_linux.c @@ -0,0 +1,163 @@ +// Copyright 2018 IBM. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_PPC +#ifdef CPU_FEATURES_OS_LINUX + +#include "cpuinfo_ppc.h" + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for introspection. +//////////////////////////////////////////////////////////////////////////////// +#define INTROSPECTION_TABLE \ + LINE(PPC_32, ppc32, "ppc32", PPC_FEATURE_32, 0) \ + LINE(PPC_64, ppc64, "ppc64", PPC_FEATURE_64, 0) \ + LINE(PPC_601_INSTR, ppc601, "ppc601", PPC_FEATURE_601_INSTR, 0) \ + LINE(PPC_HAS_ALTIVEC, altivec, "altivec", PPC_FEATURE_HAS_ALTIVEC, 0) \ + LINE(PPC_HAS_FPU, fpu, "fpu", PPC_FEATURE_HAS_FPU, 0) \ + LINE(PPC_HAS_MMU, mmu, "mmu", PPC_FEATURE_HAS_MMU, 0) \ + LINE(PPC_HAS_4xxMAC, mac_4xx, "4xxmac", PPC_FEATURE_HAS_4xxMAC, 0) \ + LINE(PPC_UNIFIED_CACHE, unifiedcache, "ucache", PPC_FEATURE_UNIFIED_CACHE, \ + 0) \ + LINE(PPC_HAS_SPE, spe, "spe", PPC_FEATURE_HAS_SPE, 0) \ + LINE(PPC_HAS_EFP_SINGLE, efpsingle, "efpsingle", PPC_FEATURE_HAS_EFP_SINGLE, \ + 0) \ + LINE(PPC_HAS_EFP_DOUBLE, efpdouble, "efpdouble", PPC_FEATURE_HAS_EFP_DOUBLE, \ + 0) \ + LINE(PPC_NO_TB, no_tb, "notb", PPC_FEATURE_NO_TB, 0) \ + LINE(PPC_POWER4, power4, "power4", PPC_FEATURE_POWER4, 0) \ + LINE(PPC_POWER5, power5, "power5", PPC_FEATURE_POWER5, 0) \ + LINE(PPC_POWER5_PLUS, power5plus, "power5+", PPC_FEATURE_POWER5_PLUS, 0) \ + LINE(PPC_CELL, cell, "cellbe", PPC_FEATURE_CELL, 0) \ + LINE(PPC_BOOKE, booke, "booke", PPC_FEATURE_BOOKE, 0) \ + LINE(PPC_SMT, smt, "smt", PPC_FEATURE_SMT, 0) \ + LINE(PPC_ICACHE_SNOOP, icachesnoop, "ic_snoop", PPC_FEATURE_ICACHE_SNOOP, 0) \ + LINE(PPC_ARCH_2_05, arch205, "arch_2_05", PPC_FEATURE_ARCH_2_05, 0) \ + LINE(PPC_PA6T, pa6t, "pa6t", PPC_FEATURE_PA6T, 0) \ + LINE(PPC_HAS_DFP, dfp, "dfp", PPC_FEATURE_HAS_DFP, 0) \ + LINE(PPC_POWER6_EXT, power6ext, "power6x", PPC_FEATURE_POWER6_EXT, 0) \ + LINE(PPC_ARCH_2_06, arch206, "arch_2_06", PPC_FEATURE_ARCH_2_06, 0) \ + LINE(PPC_HAS_VSX, vsx, "vsx", PPC_FEATURE_HAS_VSX, 0) \ + LINE(PPC_PSERIES_PERFMON_COMPAT, pseries_perfmon_compat, "archpmu", \ + PPC_FEATURE_PSERIES_PERFMON_COMPAT, 0) \ + LINE(PPC_TRUE_LE, truele, "true_le", PPC_FEATURE_TRUE_LE, 0) \ + LINE(PPC_PPC_LE, ppcle, "ppcle", PPC_FEATURE_PPC_LE, 0) \ + LINE(PPC_ARCH_2_07, arch207, "arch_2_07", 0, PPC_FEATURE2_ARCH_2_07) \ + LINE(PPC_HTM, htm, "htm", 0, PPC_FEATURE2_HTM) \ + LINE(PPC_DSCR, dscr, "dscr", 0, PPC_FEATURE2_DSCR) \ + LINE(PPC_EBB, ebb, "ebb", 0, PPC_FEATURE2_EBB) \ + LINE(PPC_ISEL, isel, "isel", 0, PPC_FEATURE2_ISEL) \ + LINE(PPC_TAR, tar, "tar", 0, PPC_FEATURE2_TAR) \ + LINE(PPC_VEC_CRYPTO, vcrypto, "vcrypto", 0, PPC_FEATURE2_VEC_CRYPTO) \ + LINE(PPC_HTM_NOSC, htm_nosc, "htm-nosc", 0, PPC_FEATURE2_HTM_NOSC) \ + LINE(PPC_ARCH_3_00, arch300, "arch_3_00", 0, PPC_FEATURE2_ARCH_3_00) \ + LINE(PPC_HAS_IEEE128, ieee128, "ieee128", 0, PPC_FEATURE2_HAS_IEEE128) \ + LINE(PPC_DARN, darn, "darn", 0, PPC_FEATURE2_DARN) \ + LINE(PPC_SCV, scv, "scv", 0, PPC_FEATURE2_SCV) \ + LINE(PPC_HTM_NO_SUSPEND, htm_no_suspend, "htm-no-suspend", 0, \ + PPC_FEATURE2_HTM_NO_SUSPEND) +#undef PPC // Remove conflict with compiler generated preprocessor +#define INTROSPECTION_PREFIX PPC +#define INTROSPECTION_ENUM_PREFIX PPC +#include "define_introspection_and_hwcaps.inl" + +//////////////////////////////////////////////////////////////////////////////// +// Implementation. +//////////////////////////////////////////////////////////////////////////////// + +#include + +#include "internal/bit_utils.h" +#include "internal/filesystem.h" +#include "internal/hwcaps.h" +#include "internal/stack_line_reader.h" +#include "internal/string_view.h" + +static bool HandlePPCLine(const LineResult result, + PPCPlatformStrings* const strings) { + StringView line = result.line; + StringView key, value; + if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) { + if (CpuFeatures_StringView_HasWord(key, "platform", ' ')) { + CpuFeatures_StringView_CopyString(value, strings->platform, + sizeof(strings->platform)); + } else if (CpuFeatures_StringView_IsEquals(key, str("model"))) { + CpuFeatures_StringView_CopyString(value, strings->model, + sizeof(strings->platform)); + } else if (CpuFeatures_StringView_IsEquals(key, str("machine"))) { + CpuFeatures_StringView_CopyString(value, strings->machine, + sizeof(strings->platform)); + } else if (CpuFeatures_StringView_IsEquals(key, str("cpu"))) { + CpuFeatures_StringView_CopyString(value, strings->cpu, + sizeof(strings->platform)); + } + } + return !result.eof; +} + +static void FillProcCpuInfoData(PPCPlatformStrings* const strings) { + const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); + if (fd >= 0) { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + for (;;) { + if (!HandlePPCLine(StackLineReader_NextLine(&reader), strings)) { + break; + } + } + CpuFeatures_CloseFile(fd); + } +} + +static const PPCInfo kEmptyPPCInfo; + +PPCInfo GetPPCInfo(void) { + /* + * On Power feature flags aren't currently in cpuinfo so we only look at + * the auxilary vector. + */ + PPCInfo info = kEmptyPPCInfo; + const HardwareCapabilities hwcaps = CpuFeatures_GetHardwareCapabilities(); + for (size_t i = 0; i < PPC_LAST_; ++i) { + if (CpuFeatures_IsHwCapsSet(kHardwareCapabilities[i], hwcaps)) { + kSetters[i](&info.features, true); + } + } + return info; +} + +static const PPCPlatformStrings kEmptyPPCPlatformStrings; + +PPCPlatformStrings GetPPCPlatformStrings(void) { + PPCPlatformStrings strings = kEmptyPPCPlatformStrings; + const char* platform = CpuFeatures_GetPlatformPointer(); + const char* base_platform = CpuFeatures_GetBasePlatformPointer(); + + FillProcCpuInfoData(&strings); + + if (platform != NULL) + CpuFeatures_StringView_CopyString(str(platform), strings.type.platform, + sizeof(strings.type.platform)); + if (base_platform != NULL) + CpuFeatures_StringView_CopyString(str(base_platform), + strings.type.base_platform, + sizeof(strings.type.base_platform)); + + return strings; +} + +#endif // CPU_FEATURES_OS_LINUX +#endif // CPU_FEATURES_ARCH_PPC diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_riscv_linux.c b/node_modules/cpu-features/deps/cpu_features/src/impl_riscv_linux.c new file mode 100644 index 00000000..8abec6eb --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_riscv_linux.c @@ -0,0 +1,111 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_RISCV +#if defined(CPU_FEATURES_OS_LINUX) + +#include "cpuinfo_riscv.h" + +// According to +// https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/riscv/cpus.yaml +// isa string should match the following regex +// ^rv(?:64|32)imaf?d?q?c?b?v?k?h?(?:_[hsxz](?:[a-z])+)*$ +// +// This means we can test for features in this exact order except for Z +// extensions. + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for introspection. +//////////////////////////////////////////////////////////////////////////////// +#define INTROSPECTION_TABLE \ + LINE(RISCV_RV32I, RV32I, "rv32i", RISCV_HWCAP_32, 0) \ + LINE(RISCV_RV64I, RV64I, "rv64i", RISCV_HWCAP_64, 0) \ + LINE(RISCV_M, M, "m", RISCV_HWCAP_M, 0) \ + LINE(RISCV_A, A, "a", RISCV_HWCAP_A, 0) \ + LINE(RISCV_F, F, "f", RISCV_HWCAP_F, 0) \ + LINE(RISCV_D, D, "d", RISCV_HWCAP_D, 0) \ + LINE(RISCV_Q, Q, "q", RISCV_HWCAP_Q, 0) \ + LINE(RISCV_C, C, "c", RISCV_HWCAP_C, 0) \ + LINE(RISCV_V, V, "v", RISCV_HWCAP_V, 0) \ + LINE(RISCV_Zicsr, Zicsr, "_zicsr", 0, 0) \ + LINE(RISCV_Zifencei, Zifencei, "_zifencei", 0, 0) +#define INTROSPECTION_PREFIX Riscv +#define INTROSPECTION_ENUM_PREFIX RISCV +#include "define_introspection_and_hwcaps.inl" + +//////////////////////////////////////////////////////////////////////////////// +// Implementation. +//////////////////////////////////////////////////////////////////////////////// + +#include +#include + +#include "internal/filesystem.h" +#include "internal/stack_line_reader.h" + +static const RiscvInfo kEmptyRiscvInfo; + +static void HandleRiscVIsaLine(StringView line, RiscvFeatures* const features) { + for (size_t i = 0; i < RISCV_LAST_; ++i) { + StringView flag = str(kCpuInfoFlags[i]); + int index_of_flag = CpuFeatures_StringView_IndexOf(line, flag); + bool is_set = index_of_flag != -1; + kSetters[i](features, is_set); + if (is_set) + line = CpuFeatures_StringView_PopFront(line, index_of_flag + flag.size); + } +} + +static bool HandleRiscVLine(const LineResult result, RiscvInfo* const info) { + StringView line = result.line; + StringView key, value; + if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) { + if (CpuFeatures_StringView_IsEquals(key, str("isa"))) { + HandleRiscVIsaLine(value, &info->features); + } else if (CpuFeatures_StringView_IsEquals(key, str("uarch"))) { + int index = CpuFeatures_StringView_IndexOfChar(value, ','); + if (index == -1) return true; + StringView vendor = CpuFeatures_StringView_KeepFront(value, index); + StringView uarch = CpuFeatures_StringView_PopFront(value, index + 1); + CpuFeatures_StringView_CopyString(vendor, info->vendor, + sizeof(info->vendor)); + CpuFeatures_StringView_CopyString(uarch, info->uarch, + sizeof(info->uarch)); + } + } + return !result.eof; +} + +static void FillProcCpuInfoData(RiscvInfo* const info) { + const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); + if (fd >= 0) { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + for (;;) { + if (!HandleRiscVLine(StackLineReader_NextLine(&reader), info)) break; + } + CpuFeatures_CloseFile(fd); + } +} + +RiscvInfo GetRiscvInfo(void) { + RiscvInfo info = kEmptyRiscvInfo; + FillProcCpuInfoData(&info); + return info; +} + +#endif // defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) +#endif // CPU_FEATURES_ARCH_RISCV diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_s390x_linux.c b/node_modules/cpu-features/deps/cpu_features/src/impl_s390x_linux.c new file mode 100644 index 00000000..2b8b865d --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_s390x_linux.c @@ -0,0 +1,120 @@ +// Copyright 2022 IBM. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_S390X +#ifdef CPU_FEATURES_OS_LINUX + +#include "cpuinfo_s390x.h" + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for introspection. +//////////////////////////////////////////////////////////////////////////////// +#define INTROSPECTION_TABLE \ + LINE(S390_ESAN3, esan3, "esan3", HWCAP_S390_ESAN3, 0) \ + LINE(S390_ZARCH, zarch, "zarch", HWCAP_S390_ZARCH, 0) \ + LINE(S390_STFLE, stfle, "stfle", HWCAP_S390_STFLE, 0) \ + LINE(S390_MSA, msa, "msa", HWCAP_S390_MSA, 0) \ + LINE(S390_LDISP, ldisp, "ldisp", HWCAP_S390_LDISP, 0) \ + LINE(S390_EIMM, eimm, "eimm", HWCAP_S390_EIMM, 0) \ + LINE(S390_DFP, dfp, "dfp", HWCAP_S390_DFP, 0) \ + LINE(S390_EDAT, edat, "edat", HWCAP_S390_HPAGE, 0) \ + LINE(S390_ETF3EH, etf3eh, "etf3eh", HWCAP_S390_ETF3EH, 0) \ + LINE(S390_HIGHGPRS, highgprs, "highgprs", HWCAP_S390_HIGH_GPRS, 0) \ + LINE(S390_TE, te, "te", HWCAP_S390_TE, 0) \ + LINE(S390_VX, vx, "vx", HWCAP_S390_VXRS, 0) \ + LINE(S390_VXD, vxd, "vxd", HWCAP_S390_VXRS_BCD, 0) \ + LINE(S390_VXE, vxe, "vxe", HWCAP_S390_VXRS_EXT, 0) \ + LINE(S390_GS, gs, "gs", HWCAP_S390_GS, 0) \ + LINE(S390_VXE2, vxe2, "vxe2", HWCAP_S390_VXRS_EXT2, 0) \ + LINE(S390_VXP, vxp, "vxp", HWCAP_S390_VXRS_PDE, 0) \ + LINE(S390_SORT, sort, "sort", HWCAP_S390_SORT, 0) \ + LINE(S390_DFLT, dflt, "dflt", HWCAP_S390_DFLT, 0) \ + LINE(S390_VXP2, vxp2, "vxp2", HWCAP_S390_VXRS_PDE2, 0) \ + LINE(S390_NNPA, nnpa, "nnpa", HWCAP_S390_NNPA, 0) \ + LINE(S390_PCIMIO, pcimio, "pcimio", HWCAP_S390_PCI_MIO, 0) \ + LINE(S390_SIE, sie, "sie", HWCAP_S390_SIE, 0) +#define INTROSPECTION_PREFIX S390X +#define INTROSPECTION_ENUM_PREFIX S390X +#include "define_introspection_and_hwcaps.inl" + +//////////////////////////////////////////////////////////////////////////////// +// Implementation. +//////////////////////////////////////////////////////////////////////////////// + +#include + +#include "internal/bit_utils.h" +#include "internal/filesystem.h" +#include "internal/hwcaps.h" +#include "internal/stack_line_reader.h" +#include "internal/string_view.h" + +static bool HandleS390XLine(const LineResult result, + S390XPlatformStrings* const strings) { + StringView line = result.line; + StringView key, value; + if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) { + if (CpuFeatures_StringView_IsEquals(key, str("# processors"))) { + strings->num_processors = CpuFeatures_StringView_ParsePositiveNumber(value); + } + } + return !result.eof; +} + +static void FillProcCpuInfoData(S390XPlatformStrings* const strings) { + const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); + if (fd >= 0) { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + for (;;) { + if (!HandleS390XLine(StackLineReader_NextLine(&reader), strings)) { + break; + } + } + CpuFeatures_CloseFile(fd); + } +} + +static const S390XInfo kEmptyS390XInfo; + +S390XInfo GetS390XInfo(void) { + S390XInfo info = kEmptyS390XInfo; + const HardwareCapabilities hwcaps = CpuFeatures_GetHardwareCapabilities(); + for (size_t i = 0; i < S390X_LAST_; ++i) { + if (CpuFeatures_IsHwCapsSet(kHardwareCapabilities[i], hwcaps)) { + kSetters[i](&info.features, true); + } + } + return info; +} + +static const S390XPlatformStrings kEmptyS390XPlatformStrings; + +S390XPlatformStrings GetS390XPlatformStrings(void) { + S390XPlatformStrings strings = kEmptyS390XPlatformStrings; + const char* platform = CpuFeatures_GetPlatformPointer(); + + FillProcCpuInfoData(&strings); + + if (platform != NULL) + CpuFeatures_StringView_CopyString(str(platform), strings.type.platform, + sizeof(strings.type.platform)); + + return strings; +} + +#endif // CPU_FEATURES_OS_LINUX +#endif // CPU_FEATURES_ARCH_S390X diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_x86__base_implementation.inl b/node_modules/cpu-features/deps/cpu_features/src/impl_x86__base_implementation.inl new file mode 100644 index 00000000..6a34bff1 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_x86__base_implementation.inl @@ -0,0 +1,2055 @@ +// Copyright 2017 Google LLC +// Copyright 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// A note on x86 SIMD instructions availability +// ----------------------------------------------------------------------------- +// A number of conditions need to be met for an application to use SIMD +// instructions: +// 1. The CPU itself must support the instruction. +// - we use `CPUID` to check whether the feature is supported. +// 2. The OS must save and restore the associated SIMD register across context +// switches, we check that: +// - the CPU reports supporting hardware context switching instructions via +// CPUID.1:ECX.XSAVE[bit 26] +// - the OS reports supporting hardware context switching instructions via +// CPUID.1:ECX.OSXSAVE[bit 27] +// - the CPU extended control register 0 (XCR0) is set to save and restore the +// needed SIMD registers +// +// Note that if `XSAVE`/`OSXSAVE` are missing, we delegate the detection to the +// OS via the `DetectFeaturesFromOs` function or via microarchitecture +// heuristics. +// +// Encoding +// ----------------------------------------------------------------------------- +// X86Info contains fields such as vendor and brand_string that are ASCII +// encoded strings. `vendor` length of characters is 13 and `brand_string` is 49 +// (with null terminated string). We use CPUID.1:E[D,C,B]X to get `vendor` and +// CPUID.8000_000[4:2]:E[D,C,B,A]X to get `brand_string` +// +// Microarchitecture +// ----------------------------------------------------------------------------- +// `GetX86Microarchitecture` function consists of check on vendor via +// `IsVendorByX86Info`. We use `CPUID(family, model)` to define the vendor's +// microarchitecture. In cases where the `family` and `model` is the same for +// several microarchitectures we do a stepping check or in the worst case we +// rely on parsing brand_string (see HasSecondFMA for an example). Details of +// identification by `brand_string` can be found by reference: +// https://en.wikichip.org/wiki/intel/microarchitectures/cascade_lake +// https://www.intel.com/content/www/us/en/processors/processor-numbers.html + +// CacheInfo X86 +// ----------------------------------------------------------------------------- +// We use the CacheInfo struct to store information about cache levels. The +// maximum number of levels is hardcoded but can be increased if needed. We have +// full support of cache identification for the following processors: +// • Intel: +// ◦ modern processors: +// we use `ParseCacheInfo` function with `leaf_id` 0x00000004. +// ◦ old processors: +// we parse descriptors via `GetCacheLevelInfo`, see Application Note +// 485: Intel Processor Identification and CPUID Instruction. +// • AMD: +// ◦ modern processors: +// we use `ParseCacheInfo` function with `leaf_id` 0x8000001D. +// ◦ old processors: +// we parse cache info using Fn8000_0005_E[A,B,C,D]X and +// Fn8000_0006_E[A,B,C,D]X. See AMD CPUID Specification: +// https://www.amd.com/system/files/TechDocs/25481.pdf. +// • Hygon: +// we reuse AMD cache detection implementation. +// • Zhaoxin: +// we reuse Intel cache detection implementation. +// +// Internal structures +// ----------------------------------------------------------------------------- +// We use internal structures such as `Leaves` and `OsPreserves` to cache the +// result of cpuid info and support of registers, since latency of CPUID +// instruction is around ~100 cycles, see +// https://www.agner.org/optimize/instruction_tables.pdf. Hence, we use +// `ReadLeaves` function for `GetX86Info`, `GetCacheInfo` and +// `FillX86BrandString` to read leaves and hold these values to avoid redundant +// call on the same leaf. + +#include +#include + +#include "copy.inl" +#include "cpuinfo_x86.h" +#include "equals.inl" +#include "internal/bit_utils.h" +#include "internal/cpuid_x86.h" + +#if !defined(CPU_FEATURES_ARCH_X86) +#error "Cannot compile cpuinfo_x86 on a non x86 platform." +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for CpuId and GetXCR0Eax. +//////////////////////////////////////////////////////////////////////////////// + +#if defined(CPU_FEATURES_MOCK_CPUID_X86) +// Implementation will be provided by test/cpuinfo_x86_test.cc. +#elif defined(CPU_FEATURES_COMPILER_CLANG) || defined(CPU_FEATURES_COMPILER_GCC) + +#include + +Leaf GetCpuidLeaf(uint32_t leaf_id, int ecx) { + Leaf leaf; + __cpuid_count(leaf_id, ecx, leaf.eax, leaf.ebx, leaf.ecx, leaf.edx); + return leaf; +} + +uint32_t GetXCR0Eax(void) { + uint32_t eax, edx; + /* named form of xgetbv not supported on OSX, so must use byte form, see: + https://github.com/asmjit/asmjit/issues/78 + */ + __asm(".byte 0x0F, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c"(0)); + return eax; +} + +#elif defined(CPU_FEATURES_COMPILER_MSC) + +#include +#include // For __cpuidex() + +Leaf GetCpuidLeaf(uint32_t leaf_id, int ecx) { + Leaf leaf; + int data[4]; + __cpuidex(data, leaf_id, ecx); + leaf.eax = data[0]; + leaf.ebx = data[1]; + leaf.ecx = data[2]; + leaf.edx = data[3]; + return leaf; +} + +uint32_t GetXCR0Eax(void) { return (uint32_t)_xgetbv(0); } + +#else +#error "Unsupported compiler, x86 cpuid requires either GCC, Clang or MSVC." +#endif + +static const Leaf kEmptyLeaf; + +static Leaf SafeCpuIdEx(uint32_t max_cpuid_leaf, uint32_t leaf_id, int ecx) { + if (leaf_id <= max_cpuid_leaf) { + return GetCpuidLeaf(leaf_id, ecx); + } else { + return kEmptyLeaf; + } +} + +typedef struct { + uint32_t max_cpuid_leaf; + Leaf leaf_0; // Root + Leaf leaf_1; // Family, Model, Stepping + Leaf leaf_2; // Intel cache info + features + Leaf leaf_7; // Features + Leaf leaf_7_1; // Features + uint32_t max_cpuid_leaf_ext; + Leaf leaf_80000000; // Root for extended leaves + Leaf leaf_80000001; // AMD features features and cache + Leaf leaf_80000002; // brand string + Leaf leaf_80000003; // brand string + Leaf leaf_80000004; // brand string +} Leaves; + +static Leaves ReadLeaves(void) { + const Leaf leaf_0 = GetCpuidLeaf(0, 0); + const uint32_t max_cpuid_leaf = leaf_0.eax; + const Leaf leaf_80000000 = GetCpuidLeaf(0x80000000, 0); + const uint32_t max_cpuid_leaf_ext = leaf_80000000.eax; + return (Leaves){ + .max_cpuid_leaf = max_cpuid_leaf, + .leaf_0 = leaf_0, + .leaf_1 = SafeCpuIdEx(max_cpuid_leaf, 0x00000001, 0), + .leaf_2 = SafeCpuIdEx(max_cpuid_leaf, 0x00000002, 0), + .leaf_7 = SafeCpuIdEx(max_cpuid_leaf, 0x00000007, 0), + .leaf_7_1 = SafeCpuIdEx(max_cpuid_leaf, 0x00000007, 1), + .max_cpuid_leaf_ext = max_cpuid_leaf_ext, + .leaf_80000000 = leaf_80000000, + .leaf_80000001 = SafeCpuIdEx(max_cpuid_leaf_ext, 0x80000001, 0), + .leaf_80000002 = SafeCpuIdEx(max_cpuid_leaf_ext, 0x80000002, 0), + .leaf_80000003 = SafeCpuIdEx(max_cpuid_leaf_ext, 0x80000003, 0), + .leaf_80000004 = SafeCpuIdEx(max_cpuid_leaf_ext, 0x80000004, 0), + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// OS support +//////////////////////////////////////////////////////////////////////////////// + +#define MASK_XMM 0x2 +#define MASK_YMM 0x4 +#define MASK_MASKREG 0x20 +#define MASK_ZMM0_15 0x40 +#define MASK_ZMM16_31 0x80 +#define MASK_XTILECFG 0x20000 +#define MASK_XTILEDATA 0x40000 + +static bool HasMask(uint32_t value, uint32_t mask) { + return (value & mask) == mask; +} + +// Checks that operating system saves and restores xmm registers during context +// switches. +static bool HasXmmOsXSave(uint32_t xcr0_eax) { + return HasMask(xcr0_eax, MASK_XMM); +} + +// Checks that operating system saves and restores ymm registers during context +// switches. +static bool HasYmmOsXSave(uint32_t xcr0_eax) { + return HasMask(xcr0_eax, MASK_XMM | MASK_YMM); +} + +// Checks that operating system saves and restores zmm registers during context +// switches. +static bool HasZmmOsXSave(uint32_t xcr0_eax) { + return HasMask(xcr0_eax, MASK_XMM | MASK_YMM | MASK_MASKREG | MASK_ZMM0_15 | + MASK_ZMM16_31); +} + +// Checks that operating system saves and restores AMX/TMUL state during context +// switches. +static bool HasTmmOsXSave(uint32_t xcr0_eax) { + return HasMask(xcr0_eax, MASK_XMM | MASK_YMM | MASK_MASKREG | MASK_ZMM0_15 | + MASK_ZMM16_31 | MASK_XTILECFG | MASK_XTILEDATA); +} + +//////////////////////////////////////////////////////////////////////////////// +// Vendor +//////////////////////////////////////////////////////////////////////////////// + +static void SetVendor(const Leaf leaf, char* const vendor) { + *(uint32_t*)(vendor) = leaf.ebx; + *(uint32_t*)(vendor + 4) = leaf.edx; + *(uint32_t*)(vendor + 8) = leaf.ecx; + vendor[12] = '\0'; +} + +static int IsVendor(const Leaf leaf, const char* const name) { + const uint32_t ebx = *(const uint32_t*)(name); + const uint32_t edx = *(const uint32_t*)(name + 4); + const uint32_t ecx = *(const uint32_t*)(name + 8); + return leaf.ebx == ebx && leaf.ecx == ecx && leaf.edx == edx; +} + +static int IsVendorByX86Info(const X86Info* info, const char* const name) { + return equals(info->vendor, name, sizeof(info->vendor)); +} + +// TODO: Remove when deprecation period is over, +void FillX86BrandString(char brand_string[49]) { + const Leaves leaves = ReadLeaves(); + const Leaf packed[3] = { + leaves.leaf_80000002, + leaves.leaf_80000003, + leaves.leaf_80000004, + }; +#if __STDC_VERSION__ >= 201112L + _Static_assert(sizeof(packed) == 48, "Leaves must be packed"); +#endif + copy(brand_string, (const char*)(packed), 48); + brand_string[48] = '\0'; +} + +//////////////////////////////////////////////////////////////////////////////// +// CpuId +//////////////////////////////////////////////////////////////////////////////// + +static bool HasSecondFMA(const X86Info* info) { + // Skylake server + if (info->model == 0x55) { + // detect Xeon + if (info->brand_string[9] == 'X') { + // detect Silver or Bronze + if (info->brand_string[17] == 'S' || info->brand_string[17] == 'B') + return false; + // detect Gold 5_20 and below, except for Gold 53__ + if (info->brand_string[17] == 'G' && info->brand_string[22] == '5') + return ( + (info->brand_string[23] == '3') || + (info->brand_string[24] == '2' && info->brand_string[25] == '2')); + // detect Xeon W 210x + if (info->brand_string[17] == 'W' && info->brand_string[21] == '0') + return false; + // detect Xeon D 2xxx + if (info->brand_string[17] == 'D' && info->brand_string[19] == '2' && + info->brand_string[20] == '1') + return false; + } + return true; + } + // Cannon Lake client + if (info->model == 0x66) return false; + // Ice Lake client + if (info->model == 0x7d || info->model == 0x7e) return false; + // This is the right default... + return true; +} + +// Internal structure to hold the OS support for vector operations. +// Avoid to recompute them since each call to cpuid is ~100 cycles. +typedef struct { + bool sse_registers; + bool avx_registers; + bool avx512_registers; + bool amx_registers; +} OsPreserves; + +// These two functions have to be implemented by the OS, that is the file +// including this file. +static void OverrideOsPreserves(OsPreserves* os_preserves); +static void DetectFeaturesFromOs(X86Info* info, X86Features* features); + +// Reference https://en.wikipedia.org/wiki/CPUID. +static void ParseCpuId(const Leaves* leaves, X86Info* info, + OsPreserves* os_preserves) { + const Leaf leaf_1 = leaves->leaf_1; + const Leaf leaf_7 = leaves->leaf_7; + const Leaf leaf_7_1 = leaves->leaf_7_1; + const Leaf leaf_80000001 = leaves->leaf_80000001; + + const bool have_xsave = IsBitSet(leaf_1.ecx, 26); + const bool have_osxsave = IsBitSet(leaf_1.ecx, 27); + const bool have_xcr0 = have_xsave && have_osxsave; + + const uint32_t family = ExtractBitRange(leaf_1.eax, 11, 8); + const uint32_t extended_family = ExtractBitRange(leaf_1.eax, 27, 20); + const uint32_t model = ExtractBitRange(leaf_1.eax, 7, 4); + const uint32_t extended_model = ExtractBitRange(leaf_1.eax, 19, 16); + + X86Features* const features = &info->features; + + // Fill Family, Model and Stepping. + info->family = extended_family + family; + info->model = (extended_model << 4) + model; + info->stepping = ExtractBitRange(leaf_1.eax, 3, 0); + + // Fill Brand String. + const Leaf packed[3] = { + leaves->leaf_80000002, + leaves->leaf_80000003, + leaves->leaf_80000004, + }; +#if __STDC_VERSION__ >= 201112L + _Static_assert(sizeof(packed) == 48, "Leaves must be packed"); +#endif + copy(info->brand_string, (const char*)(packed), 48); + info->brand_string[48] = '\0'; + + // Fill cpu features. + features->fpu = IsBitSet(leaf_1.edx, 0); + features->tsc = IsBitSet(leaf_1.edx, 4); + features->cx8 = IsBitSet(leaf_1.edx, 8); + features->clfsh = IsBitSet(leaf_1.edx, 19); + features->mmx = IsBitSet(leaf_1.edx, 23); + features->ss = IsBitSet(leaf_1.edx, 27); + features->pclmulqdq = IsBitSet(leaf_1.ecx, 1); + features->smx = IsBitSet(leaf_1.ecx, 6); + features->cx16 = IsBitSet(leaf_1.ecx, 13); + features->dca = IsBitSet(leaf_1.ecx, 18); + features->movbe = IsBitSet(leaf_1.ecx, 22); + features->popcnt = IsBitSet(leaf_1.ecx, 23); + features->aes = IsBitSet(leaf_1.ecx, 25); + features->f16c = IsBitSet(leaf_1.ecx, 29); + features->rdrnd = IsBitSet(leaf_1.ecx, 30); + features->sgx = IsBitSet(leaf_7.ebx, 2); + features->bmi1 = IsBitSet(leaf_7.ebx, 3); + features->hle = IsBitSet(leaf_7.ebx, 4); + features->bmi2 = IsBitSet(leaf_7.ebx, 8); + features->erms = IsBitSet(leaf_7.ebx, 9); + features->rtm = IsBitSet(leaf_7.ebx, 11); + features->rdseed = IsBitSet(leaf_7.ebx, 18); + features->clflushopt = IsBitSet(leaf_7.ebx, 23); + features->clwb = IsBitSet(leaf_7.ebx, 24); + features->sha = IsBitSet(leaf_7.ebx, 29); + features->gfni = IsBitSet(leaf_7.ecx, 8); + features->vaes = IsBitSet(leaf_7.ecx, 9); + features->vpclmulqdq = IsBitSet(leaf_7.ecx, 10); + features->movdiri = IsBitSet(leaf_7.ecx, 27); + features->movdir64b = IsBitSet(leaf_7.ecx, 28); + features->fs_rep_mov = IsBitSet(leaf_7.edx, 4); + features->fz_rep_movsb = IsBitSet(leaf_7_1.eax, 10); + features->fs_rep_stosb = IsBitSet(leaf_7_1.eax, 11); + features->fs_rep_cmpsb_scasb = IsBitSet(leaf_7_1.eax, 12); + features->adx = IsBitSet(leaf_7.ebx, 19); + features->lzcnt = IsBitSet(leaf_80000001.ecx, 5); + + ///////////////////////////////////////////////////////////////////////////// + // The following section is devoted to Vector Extensions. + ///////////////////////////////////////////////////////////////////////////// + + // CPU with AVX expose XCR0 which enables checking vector extensions OS + // support through cpuid. + if (have_xcr0) { + // Here we rely exclusively on cpuid for both CPU and OS support of vector + // extensions. + const uint32_t xcr0_eax = GetXCR0Eax(); + os_preserves->sse_registers = HasXmmOsXSave(xcr0_eax); + os_preserves->avx_registers = HasYmmOsXSave(xcr0_eax); + os_preserves->avx512_registers = HasZmmOsXSave(xcr0_eax); + os_preserves->amx_registers = HasTmmOsXSave(xcr0_eax); + OverrideOsPreserves(os_preserves); + + if (os_preserves->sse_registers) { + features->sse = IsBitSet(leaf_1.edx, 25); + features->sse2 = IsBitSet(leaf_1.edx, 26); + features->sse3 = IsBitSet(leaf_1.ecx, 0); + features->ssse3 = IsBitSet(leaf_1.ecx, 9); + features->sse4_1 = IsBitSet(leaf_1.ecx, 19); + features->sse4_2 = IsBitSet(leaf_1.ecx, 20); + } + if (os_preserves->avx_registers) { + features->fma3 = IsBitSet(leaf_1.ecx, 12); + features->avx = IsBitSet(leaf_1.ecx, 28); + features->avx_vnni = IsBitSet(leaf_7_1.eax, 4); + features->avx2 = IsBitSet(leaf_7.ebx, 5); + } + if (os_preserves->avx512_registers) { + features->avx512f = IsBitSet(leaf_7.ebx, 16); + features->avx512cd = IsBitSet(leaf_7.ebx, 28); + features->avx512er = IsBitSet(leaf_7.ebx, 27); + features->avx512pf = IsBitSet(leaf_7.ebx, 26); + features->avx512bw = IsBitSet(leaf_7.ebx, 30); + features->avx512dq = IsBitSet(leaf_7.ebx, 17); + features->avx512vl = IsBitSet(leaf_7.ebx, 31); + features->avx512ifma = IsBitSet(leaf_7.ebx, 21); + features->avx512vbmi = IsBitSet(leaf_7.ecx, 1); + features->avx512vbmi2 = IsBitSet(leaf_7.ecx, 6); + features->avx512vnni = IsBitSet(leaf_7.ecx, 11); + features->avx512bitalg = IsBitSet(leaf_7.ecx, 12); + features->avx512vpopcntdq = IsBitSet(leaf_7.ecx, 14); + features->avx512_4vnniw = IsBitSet(leaf_7.edx, 2); + features->avx512_4vbmi2 = IsBitSet(leaf_7.edx, 3); + features->avx512_second_fma = HasSecondFMA(info); + features->avx512_4fmaps = IsBitSet(leaf_7.edx, 3); + features->avx512_bf16 = IsBitSet(leaf_7_1.eax, 5); + features->avx512_vp2intersect = IsBitSet(leaf_7.edx, 8); + features->avx512_fp16 = IsBitSet(leaf_7.edx, 23); + } + if (os_preserves->amx_registers) { + features->amx_bf16 = IsBitSet(leaf_7.edx, 22); + features->amx_tile = IsBitSet(leaf_7.edx, 24); + features->amx_int8 = IsBitSet(leaf_7.edx, 25); + } + } else { + // When XCR0 is not available (Atom based or older cpus) we need to defer to + // the OS via custom code. + DetectFeaturesFromOs(info, features); + // Now that we have queried the OS for SSE support, we report this back to + // os_preserves. This is needed in case of AMD CPU's to enable testing of + // sse4a (See ParseExtraAMDCpuId below). + if (features->sse) os_preserves->sse_registers = true; + } +} + +static void ParseExtraAMDCpuId(const Leaves* leaves, X86Info* info, + OsPreserves os_preserves) { + const Leaf leaf_80000001 = leaves->leaf_80000001; + + X86Features* const features = &info->features; + + if (os_preserves.sse_registers) { + features->sse4a = IsBitSet(leaf_80000001.ecx, 6); + } + + if (os_preserves.avx_registers) { + features->fma4 = IsBitSet(leaf_80000001.ecx, 16); + } +} + +static const X86Info kEmptyX86Info; +static const OsPreserves kEmptyOsPreserves; + +X86Info GetX86Info(void) { + X86Info info = kEmptyX86Info; + const Leaves leaves = ReadLeaves(); + const bool is_intel = + IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_GENUINE_INTEL); + const bool is_amd = + IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + const bool is_hygon = + IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_HYGON_GENUINE); + const bool is_zhaoxin = + (IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_CENTAUR_HAULS) || + IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_SHANGHAI)); + SetVendor(leaves.leaf_0, info.vendor); + if (is_intel || is_amd || is_hygon || is_zhaoxin) { + OsPreserves os_preserves = kEmptyOsPreserves; + ParseCpuId(&leaves, &info, &os_preserves); + if (is_amd || is_hygon) { + ParseExtraAMDCpuId(&leaves, &info, os_preserves); + } + } + return info; +} + +//////////////////////////////////////////////////////////////////////////////// +// Microarchitecture +//////////////////////////////////////////////////////////////////////////////// + +#define CPUID(FAMILY, MODEL) ((((FAMILY)&0xFF) << 8) | ((MODEL)&0xFF)) + +X86Microarchitecture GetX86Microarchitecture(const X86Info* info) { + if (IsVendorByX86Info(info, CPU_FEATURES_VENDOR_GENUINE_INTEL)) { + switch (CPUID(info->family, info->model)) { + case CPUID(0x04, 0x01): + case CPUID(0x04, 0x02): + case CPUID(0x04, 0x03): + case CPUID(0x04, 0x04): + case CPUID(0x04, 0x05): + case CPUID(0x04, 0x07): + case CPUID(0x04, 0x08): + case CPUID(0x04, 0x09): + // https://en.wikichip.org/wiki/intel/microarchitectures/80486 + return INTEL_80486; + case CPUID(0x05, 0x01): + case CPUID(0x05, 0x02): + case CPUID(0x05, 0x04): + case CPUID(0x05, 0x07): + case CPUID(0x05, 0x08): + // https://en.wikichip.org/wiki/intel/microarchitectures/p5 + return INTEL_P5; + case CPUID(0x05, 0x09): + case CPUID(0x05, 0x0A): + // https://en.wikichip.org/wiki/intel/quark + return INTEL_LAKEMONT; + case CPUID(0x06, 0x1C): // Intel(R) Atom(TM) CPU 230 @ 1.60GHz + case CPUID(0x06, 0x35): + case CPUID(0x06, 0x36): + case CPUID(0x06, 0x70): // https://en.wikichip.org/wiki/intel/atom/230 + // https://en.wikipedia.org/wiki/Bonnell_(microarchitecture) + return INTEL_ATOM_BNL; + case CPUID(0x06, 0x37): + case CPUID(0x06, 0x4C): + // https://en.wikipedia.org/wiki/Silvermont + return INTEL_ATOM_SMT; + case CPUID(0x06, 0x5C): + // https://en.wikipedia.org/wiki/Goldmont + return INTEL_ATOM_GMT; + case CPUID(0x06, 0x7A): + // https://en.wikichip.org/wiki/intel/microarchitectures/goldmont_plus + return INTEL_ATOM_GMT_PLUS; + case CPUID(0x06, 0x8A): + case CPUID(0x06, 0x96): + case CPUID(0x06, 0x9C): + // https://en.wikichip.org/wiki/intel/microarchitectures/tremont + return INTEL_ATOM_TMT; + case CPUID(0x06, 0x0E): + case CPUID(0x06, 0x0F): + case CPUID(0x06, 0x16): + // https://en.wikipedia.org/wiki/Intel_Core_(microarchitecture) + return INTEL_CORE; + case CPUID(0x06, 0x17): + case CPUID(0x06, 0x1D): + // https://en.wikipedia.org/wiki/Penryn_(microarchitecture) + return INTEL_PNR; + case CPUID(0x06, 0x1A): + case CPUID(0x06, 0x1E): + case CPUID(0x06, 0x1F): + case CPUID(0x06, 0x2E): + // https://en.wikipedia.org/wiki/Nehalem_(microarchitecture) + return INTEL_NHM; + case CPUID(0x06, 0x25): + case CPUID(0x06, 0x2C): + case CPUID(0x06, 0x2F): + // https://en.wikipedia.org/wiki/Westmere_(microarchitecture) + return INTEL_WSM; + case CPUID(0x06, 0x2A): + case CPUID(0x06, 0x2D): + // https://en.wikipedia.org/wiki/Sandy_Bridge#Models_and_steppings + return INTEL_SNB; + case CPUID(0x06, 0x3A): + case CPUID(0x06, 0x3E): + // https://en.wikipedia.org/wiki/Ivy_Bridge_(microarchitecture)#Models_and_steppings + return INTEL_IVB; + case CPUID(0x06, 0x3C): + case CPUID(0x06, 0x3F): + case CPUID(0x06, 0x45): + case CPUID(0x06, 0x46): + // https://en.wikipedia.org/wiki/Haswell_(microarchitecture) + return INTEL_HSW; + case CPUID(0x06, 0x3D): + case CPUID(0x06, 0x47): + case CPUID(0x06, 0x4F): + case CPUID(0x06, 0x56): + // https://en.wikipedia.org/wiki/Broadwell_(microarchitecture) + return INTEL_BDW; + case CPUID(0x06, 0x4E): + case CPUID(0x06, 0x5E): + // https://en.wikipedia.org/wiki/Skylake_(microarchitecture) + return INTEL_SKL; + case CPUID(0x06, 0x55): + if (info->stepping >= 6 && info->stepping <= 7) { + // https://en.wikipedia.org/wiki/Cascade_Lake_(microprocessor) + return INTEL_CCL; + } + return INTEL_SKL; + case CPUID(0x06, 0x66): + // https://en.wikipedia.org/wiki/Cannon_Lake_(microarchitecture) + return INTEL_CNL; + case CPUID(0x06, 0x7D): // client + case CPUID(0x06, 0x7E): // client + case CPUID(0x06, 0x9D): // NNP-I + case CPUID(0x06, 0x6A): // server + case CPUID(0x06, 0x6C): // server + // https://en.wikipedia.org/wiki/Ice_Lake_(microprocessor) + return INTEL_ICL; + case CPUID(0x06, 0x8C): + case CPUID(0x06, 0x8D): + // https://en.wikipedia.org/wiki/Tiger_Lake_(microarchitecture) + return INTEL_TGL; + case CPUID(0x06, 0x8F): + // https://en.wikipedia.org/wiki/Sapphire_Rapids + return INTEL_SPR; + case CPUID(0x06, 0x8E): + switch (info->stepping) { + case 9: + return INTEL_KBL; // https://en.wikipedia.org/wiki/Kaby_Lake + case 10: + return INTEL_CFL; // https://en.wikipedia.org/wiki/Coffee_Lake + case 11: + return INTEL_WHL; // https://en.wikipedia.org/wiki/Whiskey_Lake_(microarchitecture) + case 12: + return INTEL_CML; // https://en.wikichip.org/wiki/intel/microarchitectures/comet_lake + default: + return X86_UNKNOWN; + } + case CPUID(0x06, 0x9E): + if (info->stepping > 9) { + // https://en.wikipedia.org/wiki/Coffee_Lake + return INTEL_CFL; + } else { + // https://en.wikipedia.org/wiki/Kaby_Lake + return INTEL_KBL; + } + case CPUID(0x06, 0x97): + case CPUID(0x06, 0x9A): + // https://en.wikichip.org/wiki/intel/microarchitectures/alder_lake + return INTEL_ADL; + case CPUID(0x06, 0xA5): + case CPUID(0x06, 0xA6): + // https://en.wikichip.org/wiki/intel/microarchitectures/comet_lake + return INTEL_CML; + case CPUID(0x06, 0xA7): + // https://en.wikichip.org/wiki/intel/microarchitectures/rocket_lake + return INTEL_RCL; + case CPUID(0x06, 0xB7): + case CPUID(0x06, 0xBA): + case CPUID(0x06, 0xBF): + // https://en.wikichip.org/wiki/intel/microarchitectures/raptor_lake + return INTEL_RPL; + case CPUID(0x06, 0x85): + // https://en.wikichip.org/wiki/intel/microarchitectures/knights_mill + return INTEL_KNIGHTS_M; + case CPUID(0x06, 0x57): + // https://en.wikichip.org/wiki/intel/microarchitectures/knights_landing + return INTEL_KNIGHTS_L; + case CPUID(0x0B, 0x00): + // https://en.wikichip.org/wiki/intel/microarchitectures/knights_ferry + return INTEL_KNIGHTS_F; + case CPUID(0x0B, 0x01): + // https://en.wikichip.org/wiki/intel/microarchitectures/knights_corner + return INTEL_KNIGHTS_C; + case CPUID(0x0F, 0x01): + case CPUID(0x0F, 0x02): + case CPUID(0x0F, 0x03): + case CPUID(0x0F, 0x04): + case CPUID(0x0F, 0x06): + // https://en.wikichip.org/wiki/intel/microarchitectures/netburst + return INTEL_NETBURST; + default: + return X86_UNKNOWN; + } + } + if (IsVendorByX86Info(info, CPU_FEATURES_VENDOR_CENTAUR_HAULS)) { + switch (CPUID(info->family, info->model)) { + case CPUID(0x06, 0x0F): + case CPUID(0x06, 0x19): + // https://en.wikichip.org/wiki/zhaoxin/microarchitectures/zhangjiang + return ZHAOXIN_ZHANGJIANG; + case CPUID(0x07, 0x1B): + // https://en.wikichip.org/wiki/zhaoxin/microarchitectures/wudaokou + return ZHAOXIN_WUDAOKOU; + case CPUID(0x07, 0x3B): + // https://en.wikichip.org/wiki/zhaoxin/microarchitectures/lujiazui + return ZHAOXIN_LUJIAZUI; + case CPUID(0x07, 0x5B): + return ZHAOXIN_YONGFENG; + default: + return X86_UNKNOWN; + } + } + if (IsVendorByX86Info(info, CPU_FEATURES_VENDOR_SHANGHAI)) { + switch (CPUID(info->family, info->model)) { + case CPUID(0x06, 0x0F): + case CPUID(0x06, 0x19): + // https://en.wikichip.org/wiki/zhaoxin/microarchitectures/zhangjiang + return ZHAOXIN_ZHANGJIANG; + case CPUID(0x07, 0x1B): + // https://en.wikichip.org/wiki/zhaoxin/microarchitectures/wudaokou + return ZHAOXIN_WUDAOKOU; + case CPUID(0x07, 0x3B): + // https://en.wikichip.org/wiki/zhaoxin/microarchitectures/lujiazui + return ZHAOXIN_LUJIAZUI; + case CPUID(0x07, 0x5B): + return ZHAOXIN_YONGFENG; + default: + return X86_UNKNOWN; + } + } + if (IsVendorByX86Info(info, CPU_FEATURES_VENDOR_AUTHENTIC_AMD)) { + switch (CPUID(info->family, info->model)) { + // https://en.wikichip.org/wiki/amd/cpuid + case CPUID(0xF, 0x04): + case CPUID(0xF, 0x05): + case CPUID(0xF, 0x07): + case CPUID(0xF, 0x08): + case CPUID(0xF, 0x0C): + case CPUID(0xF, 0x0E): + case CPUID(0xF, 0x0F): + case CPUID(0xF, 0x14): + case CPUID(0xF, 0x15): + case CPUID(0xF, 0x17): + case CPUID(0xF, 0x18): + case CPUID(0xF, 0x1B): + case CPUID(0xF, 0x1C): + case CPUID(0xF, 0x1F): + case CPUID(0xF, 0x21): + case CPUID(0xF, 0x23): + case CPUID(0xF, 0x24): + case CPUID(0xF, 0x25): + case CPUID(0xF, 0x27): + case CPUID(0xF, 0x2B): + case CPUID(0xF, 0x2C): + case CPUID(0xF, 0x2F): + case CPUID(0xF, 0x41): + case CPUID(0xF, 0x43): + case CPUID(0xF, 0x48): + case CPUID(0xF, 0x4B): + case CPUID(0xF, 0x4C): + case CPUID(0xF, 0x4F): + case CPUID(0xF, 0x5D): + case CPUID(0xF, 0x5F): + case CPUID(0xF, 0x68): + case CPUID(0xF, 0x6B): + case CPUID(0xF, 0x6F): + case CPUID(0xF, 0x7F): + case CPUID(0xF, 0xC1): + return AMD_HAMMER; + case CPUID(0x10, 0x02): + case CPUID(0x10, 0x04): + case CPUID(0x10, 0x05): + case CPUID(0x10, 0x06): + case CPUID(0x10, 0x08): + case CPUID(0x10, 0x09): + case CPUID(0x10, 0x0A): + return AMD_K10; + case CPUID(0x11, 0x03): + // http://developer.amd.com/wordpress/media/2012/10/41788.pdf + return AMD_K11; + case CPUID(0x12, 0x00): + case CPUID(0x12, 0x01): + // https://www.amd.com/system/files/TechDocs/44739_12h_Rev_Gd.pdf + return AMD_K12; + case CPUID(0x14, 0x00): + case CPUID(0x14, 0x01): + case CPUID(0x14, 0x02): + // https://www.amd.com/system/files/TechDocs/47534_14h_Mod_00h-0Fh_Rev_Guide.pdf + return AMD_BOBCAT; + case CPUID(0x15, 0x01): + // https://en.wikichip.org/wiki/amd/microarchitectures/bulldozer + return AMD_BULLDOZER; + case CPUID(0x15, 0x02): + case CPUID(0x15, 0x10): + case CPUID(0x15, 0x11): + case CPUID(0x15, 0x13): + // https://en.wikichip.org/wiki/amd/microarchitectures/piledriver + // https://www.amd.com/system/files/TechDocs/48931_15h_Mod_10h-1Fh_Rev_Guide.pdf + return AMD_PILEDRIVER; + case CPUID(0x15, 0x30): + case CPUID(0x15, 0x38): + // https://en.wikichip.org/wiki/amd/microarchitectures/steamroller + return AMD_STREAMROLLER; + case CPUID(0x15, 0x60): + case CPUID(0x15, 0x65): + case CPUID(0x15, 0x70): + // https://en.wikichip.org/wiki/amd/microarchitectures/excavator + return AMD_EXCAVATOR; + case CPUID(0x16, 0x00): + case CPUID(0x16, 0x26): + return AMD_JAGUAR; + case CPUID(0x16, 0x30): + return AMD_PUMA; + case CPUID(0x17, 0x01): + case CPUID(0x17, 0x11): + case CPUID(0x17, 0x18): + case CPUID(0x17, 0x20): + // https://en.wikichip.org/wiki/amd/microarchitectures/zen + return AMD_ZEN; + case CPUID(0x17, 0x08): + // https://en.wikichip.org/wiki/amd/microarchitectures/zen%2B + return AMD_ZEN_PLUS; + case CPUID(0x17, 0x31): + case CPUID(0x17, 0x47): + case CPUID(0x17, 0x60): + case CPUID(0x17, 0x68): + case CPUID(0x17, 0x71): + case CPUID(0x17, 0x90): + case CPUID(0x17, 0x98): + case CPUID(0x17, 0xA0): + // https://en.wikichip.org/wiki/amd/microarchitectures/zen_2 + return AMD_ZEN2; + case CPUID(0x19, 0x00): + case CPUID(0x19, 0x01): + case CPUID(0x19, 0x08): + case CPUID(0x19, 0x21): + case CPUID(0x19, 0x30): + case CPUID(0x19, 0x40): + case CPUID(0x19, 0x44): + case CPUID(0x19, 0x50): + // https://en.wikichip.org/wiki/amd/microarchitectures/zen_3 + return AMD_ZEN3; + case CPUID(0x19, 0x10): + case CPUID(0x19, 0x61): + // https://en.wikichip.org/wiki/amd/microarchitectures/zen_4 + return AMD_ZEN4; + default: + return X86_UNKNOWN; + } + } + if (IsVendorByX86Info(info, CPU_FEATURES_VENDOR_HYGON_GENUINE)) { + switch (CPUID(info->family, info->model)) { + case CPUID(0x18, 0x00): + case CPUID(0x18, 0x01): + return AMD_ZEN; + } + } + return X86_UNKNOWN; +} + +//////////////////////////////////////////////////////////////////////////////// +// CacheInfo +//////////////////////////////////////////////////////////////////////////////// + +static const CacheLevelInfo kEmptyCacheLevelInfo; + +static CacheLevelInfo GetCacheLevelInfo(const uint32_t reg) { + const int UNDEF = -1; + const int KiB = 1024; + const int MiB = 1024 * KiB; + switch (reg) { + case 0x01: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 32, + .partitioning = 0}; + case 0x02: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * MiB, + .ways = 0xFF, + .line_size = UNDEF, + .tlb_entries = 2, + .partitioning = 0}; + case 0x03: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 64, + .partitioning = 0}; + case 0x04: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * MiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 8, + .partitioning = 0}; + case 0x05: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * MiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 32, + .partitioning = 0}; + case 0x06: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_INSTRUCTION, + .cache_size = 8 * KiB, + .ways = 4, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x08: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_INSTRUCTION, + .cache_size = 16 * KiB, + .ways = 4, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x09: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_INSTRUCTION, + .cache_size = 32 * KiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x0A: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 8 * KiB, + .ways = 2, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x0B: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * MiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 4, + .partitioning = 0}; + case 0x0C: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 16 * KiB, + .ways = 4, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x0D: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 16 * KiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x0E: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 24 * KiB, + .ways = 6, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x1D: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 128 * KiB, + .ways = 2, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x21: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 256 * KiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x22: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 512 * KiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 2}; + case 0x23: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 2}; + case 0x24: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * MiB, + .ways = 16, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x25: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 2 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 2}; + case 0x29: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 4 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 2}; + case 0x2C: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 32 * KiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x30: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_INSTRUCTION, + .cache_size = 32 * KiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x40: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = UNDEF, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x41: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 128 * KiB, + .ways = 4, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x42: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 256 * KiB, + .ways = 4, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x43: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 512 * KiB, + .ways = 4, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x44: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * MiB, + .ways = 4, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x45: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 2 * MiB, + .ways = 4, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x46: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 4 * MiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x47: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 8 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x48: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 3 * MiB, + .ways = 12, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x49: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 4 * MiB, + .ways = 16, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case (0x49 | (1 << 8)): + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 4 * MiB, + .ways = 16, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x4A: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 6 * MiB, + .ways = 12, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x4B: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 8 * MiB, + .ways = 16, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x4C: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 12 * MiB, + .ways = 12, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x4D: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 16 * MiB, + .ways = 16, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x4E: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 6 * MiB, + .ways = 24, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x4F: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = 32, + .partitioning = 0}; + case 0x50: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = 64, + .partitioning = 0}; + case 0x51: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = 128, + .partitioning = 0}; + case 0x52: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = 256, + .partitioning = 0}; + case 0x55: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 2 * MiB, + .ways = 0xFF, + .line_size = UNDEF, + .tlb_entries = 7, + .partitioning = 0}; + case 0x56: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * MiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 16, + .partitioning = 0}; + case 0x57: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 16, + .partitioning = 0}; + case 0x59: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 0xFF, + .line_size = UNDEF, + .tlb_entries = 16, + .partitioning = 0}; + case 0x5A: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 2 * MiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 32, + .partitioning = 0}; + case 0x5B: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = 64, + .partitioning = 0}; + case 0x5C: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = 128, + .partitioning = 0}; + case 0x5D: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = 256, + .partitioning = 0}; + case 0x60: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 16 * KiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x61: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 0xFF, + .line_size = UNDEF, + .tlb_entries = 48, + .partitioning = 0}; + case 0x63: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 2 * MiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 4, + .partitioning = 0}; + case 0x66: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 8 * KiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x67: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 16 * KiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x68: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 32 * KiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x70: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_INSTRUCTION, + .cache_size = 12 * KiB, + .ways = 8, + .line_size = UNDEF, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x71: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_INSTRUCTION, + .cache_size = 16 * KiB, + .ways = 8, + .line_size = UNDEF, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x72: + return (CacheLevelInfo){.level = 1, + .cache_type = CPU_FEATURE_CACHE_INSTRUCTION, + .cache_size = 32 * KiB, + .ways = 8, + .line_size = UNDEF, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x76: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 2 * MiB, + .ways = 0xFF, + .line_size = UNDEF, + .tlb_entries = 8, + .partitioning = 0}; + case 0x78: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * MiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x79: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 128 * KiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 2}; + case 0x7A: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 256 * KiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 2}; + case 0x7B: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 512 * KiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 2}; + case 0x7C: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 2}; + case 0x7D: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 2 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x7F: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 512 * KiB, + .ways = 2, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x80: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 512 * KiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x82: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 256 * KiB, + .ways = 8, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x83: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 512 * KiB, + .ways = 8, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x84: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * MiB, + .ways = 8, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x85: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 2 * MiB, + .ways = 8, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x86: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 512 * KiB, + .ways = 4, + .line_size = 32, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0x87: + return (CacheLevelInfo){.level = 2, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xA0: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_DTLB, + .cache_size = 4 * KiB, + .ways = 0xFF, + .line_size = UNDEF, + .tlb_entries = 32, + .partitioning = 0}; + case 0xB0: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 128, + .partitioning = 0}; + case 0xB1: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 2 * MiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 8, + .partitioning = 0}; + case 0xB2: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 64, + .partitioning = 0}; + case 0xB3: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 128, + .partitioning = 0}; + case 0xB4: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 256, + .partitioning = 0}; + case 0xB5: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 8, + .line_size = UNDEF, + .tlb_entries = 64, + .partitioning = 0}; + case 0xB6: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 8, + .line_size = UNDEF, + .tlb_entries = 128, + .partitioning = 0}; + case 0xBA: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 64, + .partitioning = 0}; + case 0xC0: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_TLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 8, + .partitioning = 0}; + case 0xC1: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_STLB, + .cache_size = 4 * KiB, + .ways = 8, + .line_size = UNDEF, + .tlb_entries = 1024, + .partitioning = 0}; + case 0xC2: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_DTLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 16, + .partitioning = 0}; + case 0xC3: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_STLB, + .cache_size = 4 * KiB, + .ways = 6, + .line_size = UNDEF, + .tlb_entries = 1536, + .partitioning = 0}; + case 0xCA: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_STLB, + .cache_size = 4 * KiB, + .ways = 4, + .line_size = UNDEF, + .tlb_entries = 512, + .partitioning = 0}; + case 0xD0: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 512 * KiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xD1: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * MiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xD2: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 2 * MiB, + .ways = 4, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xD6: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xD7: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 2 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xD8: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 4 * MiB, + .ways = 8, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xDC: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 1 * 1536 * KiB, + .ways = 12, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xDD: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 3 * MiB, + .ways = 12, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xDE: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 6 * MiB, + .ways = 12, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xE2: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 2 * MiB, + .ways = 16, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xE3: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 4 * MiB, + .ways = 16, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xE4: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 8 * MiB, + .ways = 16, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xEA: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 12 * MiB, + .ways = 24, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xEB: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 18 * MiB, + .ways = 24, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xEC: + return (CacheLevelInfo){.level = 3, + .cache_type = CPU_FEATURE_CACHE_DATA, + .cache_size = 24 * MiB, + .ways = 24, + .line_size = 64, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xF0: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_PREFETCH, + .cache_size = 64 * KiB, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xF1: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_PREFETCH, + .cache_size = 128 * KiB, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = UNDEF, + .partitioning = 0}; + case 0xFF: + return (CacheLevelInfo){.level = UNDEF, + .cache_type = CPU_FEATURE_CACHE_NULL, + .cache_size = UNDEF, + .ways = UNDEF, + .line_size = UNDEF, + .tlb_entries = UNDEF, + .partitioning = 0}; + default: + return kEmptyCacheLevelInfo; + } +} + +// From https://www.felixcloutier.com/x86/cpuid#tbl-3-12 +static void ParseLeaf2(const Leaves* leaves, CacheInfo* info) { + Leaf leaf = leaves->leaf_2; + // The least-significant byte in register EAX (register AL) will always return + // 01H. Software should ignore this value and not interpret it as an + // informational descriptor. + leaf.eax &= 0xFFFFFF00; // Zeroing out AL. 0 is the empty descriptor. + // The most significant bit (bit 31) of each register indicates whether the + // register contains valid information (set to 0) or is reserved (set to 1). + if (IsBitSet(leaf.eax, 31)) leaf.eax = 0; + if (IsBitSet(leaf.ebx, 31)) leaf.ebx = 0; + if (IsBitSet(leaf.ecx, 31)) leaf.ecx = 0; + if (IsBitSet(leaf.edx, 31)) leaf.edx = 0; + + uint8_t data[16]; +#if __STDC_VERSION__ >= 201112L + _Static_assert(sizeof(Leaf) == sizeof(data), "Leaf must be 16 bytes"); +#endif + copy((char*)(data), (const char*)(&leaf), sizeof(data)); + for (size_t i = 0; i < sizeof(data); ++i) { + const uint8_t descriptor = data[i]; + if (descriptor == 0) continue; + info->levels[info->size] = GetCacheLevelInfo(descriptor); + info->size++; + } +} + +static const CacheInfo kEmptyCacheInfo; + +// For newer Intel CPUs uses "CPUID, eax=0x00000004". +// https://www.felixcloutier.com/x86/cpuid#input-eax-=-04h--returns-deterministic-cache-parameters-for-each-level +// For newer AMD CPUs uses "CPUID, eax=0x8000001D" +static void ParseCacheInfo(const int max_cpuid_leaf, uint32_t leaf_id, + CacheInfo* old_info) { + CacheInfo info = kEmptyCacheInfo; + for (int index = 0; info.size < CPU_FEATURES_MAX_CACHE_LEVEL; ++index) { + const Leaf leaf = SafeCpuIdEx(max_cpuid_leaf, leaf_id, index); + int cache_type_field = ExtractBitRange(leaf.eax, 4, 0); + CacheType cache_type; + if (cache_type_field == 1) + cache_type = CPU_FEATURE_CACHE_DATA; + else if (cache_type_field == 2) + cache_type = CPU_FEATURE_CACHE_INSTRUCTION; + else if (cache_type_field == 3) + cache_type = CPU_FEATURE_CACHE_UNIFIED; + else + // Intel Processor Identification and the CPUID Instruction Application + // Note 485 page 37 Table 5-10. Deterministic Cache Parameters. + // We skip cache parsing in case null of cache type or cache type in the + // range of 4-31 according to documentation. + break; + int level = ExtractBitRange(leaf.eax, 7, 5); + int line_size = ExtractBitRange(leaf.ebx, 11, 0) + 1; + int partitioning = ExtractBitRange(leaf.ebx, 21, 12) + 1; + int ways = ExtractBitRange(leaf.ebx, 31, 22) + 1; + int tlb_entries = leaf.ecx + 1; + int cache_size = ways * partitioning * line_size * tlb_entries; + info.levels[info.size] = (CacheLevelInfo){.level = level, + .cache_type = cache_type, + .cache_size = cache_size, + .ways = ways, + .line_size = line_size, + .tlb_entries = tlb_entries, + .partitioning = partitioning}; + ++info.size; + } + // Override CacheInfo if we successfully extracted Deterministic Cache + // Parameters. + if (info.size > 0) *old_info = info; +} + +typedef struct { + int level; + int cache_id; + CacheType cache_type; +} CacheLevelInfoLegacyAMD; + +static int GetWaysLegacyAMD(int cache_level, const uint32_t cache_id) { + // https://www.amd.com/system/files/TechDocs/25481.pdf page 23 + // CPUID.8000_0005_ECX[23:16] L1 data cache associativity. + // CPUID.8000_0005_EDX[23:16] L1 instruction cache associativity. + if (cache_level == 1) { + return ExtractBitRange(cache_id, 23, 16); + } + // https://www.amd.com/system/files/TechDocs/25481.pdf page 24 + // See Table 4: L2/L3 Cache and TLB Associativity Field Definition. + // CPUID.8000_0006_ECX[15:12] L2 cache associativity. + // CPUID.8000_0006_EDX[15:12] L3 cache associativity. + const int ways = ExtractBitRange(cache_id, 15, 12); + switch (ways) { + case 0x0: + case 0x1: + case 0x2: + case 0x4: + return ways; + case 0x6: + return 8; + case 0x8: + return 16; + case 0xA: + return 32; + case 0xB: + return 48; + case 0xC: + return 64; + case 0xD: + return 96; + case 0xE: + return 128; + case 0xF: + return 255; + default: + return -1; // Reserved + } +} + +static int GetCacheSizeLegacyAMD(int cache_level, const uint32_t cache_id) { + switch (cache_level) { + case 1: + // https://www.amd.com/system/files/TechDocs/25481.pdf page 23 + // CPUID.8000_0005_ECX[31:24] L1 data cache size in KB. + // CPUID.8000_0005_EDX[31:24] L1 instruction cache size KB. + return ExtractBitRange(cache_id, 31, 24); + case 2: + // https://www.amd.com/system/files/TechDocs/25481.pdf page 25 + // CPUID.8000_0006_ECX[31:16] L2 cache size in KB. + return ExtractBitRange(cache_id, 31, 16); + case 3: + // https://www.amd.com/system/files/TechDocs/25481.pdf page 25 + // CPUID.8000_0006_EDX[31:18] L3 cache size. + // Specifies the L3 cache size is within the following range: + // (L3Size[31:18] * 512KB) <= L3 cache size < ((L3Size[31:18]+1) * 512KB). + return ExtractBitRange(cache_id, 31, 18) * 512; + default: + return 0; + } +} + +#define LEGACY_AMD_MAX_CACHE_LEVEL 4 + +// https://www.amd.com/system/files/TechDocs/25481.pdf +// CPUID Fn8000_0005_E[A,B,C,D]X, Fn8000_0006_E[A,B,C,D]X - TLB and Cache info +static void ParseCacheInfoLegacyAMD(const uint32_t max_ext, CacheInfo* info) { + const Leaf cache_tlb_leaf1 = SafeCpuIdEx(max_ext, 0x80000005, 0); + const Leaf cache_tlb_leaf2 = SafeCpuIdEx(max_ext, 0x80000006, 0); + + const CacheLevelInfoLegacyAMD legacy_cache_info[LEGACY_AMD_MAX_CACHE_LEVEL] = + {(CacheLevelInfoLegacyAMD){.cache_id = cache_tlb_leaf1.ecx, + .cache_type = CPU_FEATURE_CACHE_DATA, + .level = 1}, + (CacheLevelInfoLegacyAMD){.cache_id = cache_tlb_leaf1.edx, + .cache_type = CPU_FEATURE_CACHE_INSTRUCTION, + .level = 1}, + (CacheLevelInfoLegacyAMD){.cache_id = cache_tlb_leaf2.ecx, + .cache_type = CPU_FEATURE_CACHE_UNIFIED, + .level = 2}, + (CacheLevelInfoLegacyAMD){.cache_id = cache_tlb_leaf2.edx, + .cache_type = CPU_FEATURE_CACHE_UNIFIED, + .level = 3}}; + + const int KiB = 1024; + const int UNDEF = -1; + for (int i = 0; i < LEGACY_AMD_MAX_CACHE_LEVEL; ++i) { + const int level = legacy_cache_info[i].level; + const int cache_id = legacy_cache_info[i].cache_id; + const CacheType cache_type = legacy_cache_info[i].cache_type; + const int cache_size = GetCacheSizeLegacyAMD(level, cache_id); + if (cache_size == 0) break; + info->levels[i] = + (CacheLevelInfo){.level = level, + .cache_type = cache_type, + .cache_size = cache_size * KiB, + .ways = GetWaysLegacyAMD(level, cache_id), + .line_size = ExtractBitRange(cache_id, 7, 0), + .tlb_entries = UNDEF, + .partitioning = UNDEF}; + ++info->size; + } +} + +CacheInfo GetX86CacheInfo(void) { + CacheInfo info = kEmptyCacheInfo; + const Leaves leaves = ReadLeaves(); + if (IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_GENUINE_INTEL) || + IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_CENTAUR_HAULS) || + IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_SHANGHAI)) { + ParseLeaf2(&leaves, &info); + ParseCacheInfo(leaves.max_cpuid_leaf, 4, &info); + } else if (IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_AUTHENTIC_AMD) || + IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_HYGON_GENUINE)) { + // If CPUID Fn8000_0001_ECX[TopologyExtensions]==0 + // then CPUID Fn8000_0001_E[D,C,B,A]X is reserved. + // https://www.amd.com/system/files/TechDocs/25481.pdf + if (IsBitSet(leaves.leaf_80000001.ecx, 22)) { + ParseCacheInfo(leaves.max_cpuid_leaf_ext, 0x8000001D, &info); + } else { + ParseCacheInfoLegacyAMD(leaves.max_cpuid_leaf_ext, &info); + } + } + return info; +} + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for introspection. +//////////////////////////////////////////////////////////////////////////////// +#define INTROSPECTION_TABLE \ + LINE(X86_FPU, fpu, , , ) \ + LINE(X86_TSC, tsc, , , ) \ + LINE(X86_CX8, cx8, , , ) \ + LINE(X86_CLFSH, clfsh, , , ) \ + LINE(X86_MMX, mmx, , , ) \ + LINE(X86_AES, aes, , , ) \ + LINE(X86_ERMS, erms, , , ) \ + LINE(X86_F16C, f16c, , , ) \ + LINE(X86_FMA4, fma4, , , ) \ + LINE(X86_FMA3, fma3, , , ) \ + LINE(X86_VAES, vaes, , , ) \ + LINE(X86_VPCLMULQDQ, vpclmulqdq, , , ) \ + LINE(X86_BMI1, bmi1, , , ) \ + LINE(X86_HLE, hle, , , ) \ + LINE(X86_BMI2, bmi2, , , ) \ + LINE(X86_RTM, rtm, , , ) \ + LINE(X86_RDSEED, rdseed, , , ) \ + LINE(X86_CLFLUSHOPT, clflushopt, , , ) \ + LINE(X86_CLWB, clwb, , , ) \ + LINE(X86_SSE, sse, , , ) \ + LINE(X86_SSE2, sse2, , , ) \ + LINE(X86_SSE3, sse3, , , ) \ + LINE(X86_SSSE3, ssse3, , , ) \ + LINE(X86_SSE4_1, sse4_1, , , ) \ + LINE(X86_SSE4_2, sse4_2, , , ) \ + LINE(X86_SSE4A, sse4a, , , ) \ + LINE(X86_AVX, avx, , , ) \ + LINE(X86_AVX_VNNI, avx_vnni, , , ) \ + LINE(X86_AVX2, avx2, , , ) \ + LINE(X86_AVX512F, avx512f, , , ) \ + LINE(X86_AVX512CD, avx512cd, , , ) \ + LINE(X86_AVX512ER, avx512er, , , ) \ + LINE(X86_AVX512PF, avx512pf, , , ) \ + LINE(X86_AVX512BW, avx512bw, , , ) \ + LINE(X86_AVX512DQ, avx512dq, , , ) \ + LINE(X86_AVX512VL, avx512vl, , , ) \ + LINE(X86_AVX512IFMA, avx512ifma, , , ) \ + LINE(X86_AVX512VBMI, avx512vbmi, , , ) \ + LINE(X86_AVX512VBMI2, avx512vbmi2, , , ) \ + LINE(X86_AVX512VNNI, avx512vnni, , , ) \ + LINE(X86_AVX512BITALG, avx512bitalg, , , ) \ + LINE(X86_AVX512VPOPCNTDQ, avx512vpopcntdq, , , ) \ + LINE(X86_AVX512_4VNNIW, avx512_4vnniw, , , ) \ + LINE(X86_AVX512_4VBMI2, avx512_4vbmi2, , , ) \ + LINE(X86_AVX512_SECOND_FMA, avx512_second_fma, , , ) \ + LINE(X86_AVX512_4FMAPS, avx512_4fmaps, , , ) \ + LINE(X86_AVX512_BF16, avx512_bf16, , , ) \ + LINE(X86_AVX512_VP2INTERSECT, avx512_vp2intersect, , , ) \ + LINE(X86_AVX512_FP16, avx512_fp16, , , ) \ + LINE(X86_AMX_BF16, amx_bf16, , , ) \ + LINE(X86_AMX_TILE, amx_tile, , , ) \ + LINE(X86_AMX_INT8, amx_int8, , , ) \ + LINE(X86_PCLMULQDQ, pclmulqdq, , , ) \ + LINE(X86_SMX, smx, , , ) \ + LINE(X86_SGX, sgx, , , ) \ + LINE(X86_CX16, cx16, , , ) \ + LINE(X86_SHA, sha, , , ) \ + LINE(X86_POPCNT, popcnt, , , ) \ + LINE(X86_MOVBE, movbe, , , ) \ + LINE(X86_RDRND, rdrnd, , , ) \ + LINE(X86_DCA, dca, , , ) \ + LINE(X86_SS, ss, , , ) \ + LINE(X86_ADX, adx, , , ) \ + LINE(X86_LZCNT, lzcnt, , , ) \ + LINE(X86_GFNI, gfni, , , ) \ + LINE(X86_MOVDIRI, movdiri, , , ) \ + LINE(X86_MOVDIR64B, movdir64b, , , ) \ + LINE(X86_FS_REP_MOV, fs_rep_mov, , , ) \ + LINE(X86_FZ_REP_MOVSB, fz_rep_movsb, , , ) \ + LINE(X86_FS_REP_STOSB, fs_rep_stosb, , , ) \ + LINE(X86_FS_REP_CMPSB_SCASB, fs_rep_cmpsb_scasb, , , ) +#define INTROSPECTION_PREFIX X86 +#define INTROSPECTION_ENUM_PREFIX X86 +#include "define_introspection.inl" + +#define X86_MICROARCHITECTURE_NAMES \ + LINE(X86_UNKNOWN) \ + LINE(ZHAOXIN_ZHANGJIANG) \ + LINE(ZHAOXIN_WUDAOKOU) \ + LINE(ZHAOXIN_LUJIAZUI) \ + LINE(ZHAOXIN_YONGFENG) \ + LINE(INTEL_80486) \ + LINE(INTEL_P5) \ + LINE(INTEL_LAKEMONT) \ + LINE(INTEL_CORE) \ + LINE(INTEL_PNR) \ + LINE(INTEL_NHM) \ + LINE(INTEL_ATOM_BNL) \ + LINE(INTEL_WSM) \ + LINE(INTEL_SNB) \ + LINE(INTEL_IVB) \ + LINE(INTEL_ATOM_SMT) \ + LINE(INTEL_HSW) \ + LINE(INTEL_BDW) \ + LINE(INTEL_SKL) \ + LINE(INTEL_CCL) \ + LINE(INTEL_ATOM_GMT) \ + LINE(INTEL_ATOM_GMT_PLUS) \ + LINE(INTEL_ATOM_TMT) \ + LINE(INTEL_KBL) \ + LINE(INTEL_CFL) \ + LINE(INTEL_WHL) \ + LINE(INTEL_CML) \ + LINE(INTEL_CNL) \ + LINE(INTEL_ICL) \ + LINE(INTEL_TGL) \ + LINE(INTEL_SPR) \ + LINE(INTEL_ADL) \ + LINE(INTEL_RCL) \ + LINE(INTEL_RPL) \ + LINE(INTEL_KNIGHTS_M) \ + LINE(INTEL_KNIGHTS_L) \ + LINE(INTEL_KNIGHTS_F) \ + LINE(INTEL_KNIGHTS_C) \ + LINE(INTEL_NETBURST) \ + LINE(AMD_HAMMER) \ + LINE(AMD_K10) \ + LINE(AMD_K11) \ + LINE(AMD_K12) \ + LINE(AMD_BOBCAT) \ + LINE(AMD_PILEDRIVER) \ + LINE(AMD_STREAMROLLER) \ + LINE(AMD_EXCAVATOR) \ + LINE(AMD_BULLDOZER) \ + LINE(AMD_JAGUAR) \ + LINE(AMD_PUMA) \ + LINE(AMD_ZEN) \ + LINE(AMD_ZEN_PLUS) \ + LINE(AMD_ZEN2) \ + LINE(AMD_ZEN3) \ + LINE(AMD_ZEN4) + +const char* GetX86MicroarchitectureName(X86Microarchitecture value) { +#define LINE(ENUM) [ENUM] = STRINGIZE(ENUM), + static const char* kMicroarchitectureNames[] = {X86_MICROARCHITECTURE_NAMES}; +#undef LINE + if (value >= X86_MICROARCHITECTURE_LAST_) return "unknown microarchitecture"; + return kMicroarchitectureNames[value]; +} diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_x86_freebsd.c b/node_modules/cpu-features/deps/cpu_features/src/impl_x86_freebsd.c new file mode 100644 index 00000000..ba6c6e33 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_x86_freebsd.c @@ -0,0 +1,68 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_X86 +#ifdef CPU_FEATURES_OS_FREEBSD + +#include "impl_x86__base_implementation.inl" + +static void OverrideOsPreserves(OsPreserves* os_preserves) { + (void)os_preserves; + // No override +} + +#include "internal/filesystem.h" +#include "internal/stack_line_reader.h" +#include "internal/string_view.h" + +static void DetectFeaturesFromOs(X86Info* info, X86Features* features) { + (void)info; + // Handling FreeBSD platform through parsing /var/run/dmesg.boot. + const int fd = CpuFeatures_OpenFile("/var/run/dmesg.boot"); + if (fd >= 0) { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + for (bool stop = false; !stop;) { + const LineResult result = StackLineReader_NextLine(&reader); + if (result.eof) stop = true; + const StringView line = result.line; + if (!CpuFeatures_StringView_StartsWith(line, str(" Features"))) continue; + // Lines of interests are of the following form: + // " Features=0x1783fbff" + // We first extract the comma separated values between angle brackets. + StringView csv = result.line; + int index = CpuFeatures_StringView_IndexOfChar(csv, '<'); + if (index >= 0) csv = CpuFeatures_StringView_PopFront(csv, index + 1); + if (csv.size > 0 && CpuFeatures_StringView_Back(csv) == '>') + csv = CpuFeatures_StringView_PopBack(csv, 1); + if (CpuFeatures_StringView_HasWord(csv, "SSE", ',')) features->sse = true; + if (CpuFeatures_StringView_HasWord(csv, "SSE2", ',')) + features->sse2 = true; + if (CpuFeatures_StringView_HasWord(csv, "SSE3", ',')) + features->sse3 = true; + if (CpuFeatures_StringView_HasWord(csv, "SSSE3", ',')) + features->ssse3 = true; + if (CpuFeatures_StringView_HasWord(csv, "SSE4.1", ',')) + features->sse4_1 = true; + if (CpuFeatures_StringView_HasWord(csv, "SSE4.2", ',')) + features->sse4_2 = true; + } + CpuFeatures_CloseFile(fd); + } +} + +#endif // CPU_FEATURES_OS_FREEBSD +#endif // CPU_FEATURES_ARCH_X86 diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_x86_linux_or_android.c b/node_modules/cpu-features/deps/cpu_features/src/impl_x86_linux_or_android.c new file mode 100644 index 00000000..a4d07f3e --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_x86_linux_or_android.c @@ -0,0 +1,58 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_X86 +#if defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) + +#include "impl_x86__base_implementation.inl" + +static void OverrideOsPreserves(OsPreserves* os_preserves) { + (void)os_preserves; + // No override +} + +#include "internal/filesystem.h" +#include "internal/stack_line_reader.h" +#include "internal/string_view.h" +static void DetectFeaturesFromOs(X86Info* info, X86Features* features) { + (void)info; + // Handling Linux platform through /proc/cpuinfo. + const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); + if (fd >= 0) { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + for (bool stop = false; !stop;) { + const LineResult result = StackLineReader_NextLine(&reader); + if (result.eof) stop = true; + const StringView line = result.line; + StringView key, value; + if (!CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) + continue; + if (!CpuFeatures_StringView_IsEquals(key, str("flags"))) continue; + features->sse = CpuFeatures_StringView_HasWord(value, "sse", ' '); + features->sse2 = CpuFeatures_StringView_HasWord(value, "sse2", ' '); + features->sse3 = CpuFeatures_StringView_HasWord(value, "pni", ' '); + features->ssse3 = CpuFeatures_StringView_HasWord(value, "ssse3", ' '); + features->sse4_1 = CpuFeatures_StringView_HasWord(value, "sse4_1", ' '); + features->sse4_2 = CpuFeatures_StringView_HasWord(value, "sse4_2", ' '); + break; + } + CpuFeatures_CloseFile(fd); + } +} + +#endif // defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) +#endif // CPU_FEATURES_ARCH_X86 diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_x86_macos.c b/node_modules/cpu-features/deps/cpu_features/src/impl_x86_macos.c new file mode 100644 index 00000000..e5a5c35a --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_x86_macos.c @@ -0,0 +1,57 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_X86 +#ifdef CPU_FEATURES_OS_MACOS + +#include "impl_x86__base_implementation.inl" + +#if !defined(HAVE_SYSCTLBYNAME) +#error "Darwin needs support for sysctlbyname" +#endif +#include + +#if defined(CPU_FEATURES_MOCK_CPUID_X86) +extern bool GetDarwinSysCtlByName(const char*); +#else // CPU_FEATURES_MOCK_CPUID_X86 +static bool GetDarwinSysCtlByName(const char* name) { + int enabled; + size_t enabled_len = sizeof(enabled); + const int failure = sysctlbyname(name, &enabled, &enabled_len, NULL, 0); + return failure ? false : enabled; +} +#endif + +static void OverrideOsPreserves(OsPreserves* os_preserves) { + // On Darwin AVX512 support is On-demand. + // We have to query the OS instead of querying the Zmm save/restore state. + // https://github.com/apple/darwin-xnu/blob/8f02f2a044b9bb1ad951987ef5bab20ec9486310/osfmk/i386/fpu.c#L173-L199 + os_preserves->avx512_registers = GetDarwinSysCtlByName("hw.optional.avx512f"); +} + +static void DetectFeaturesFromOs(X86Info* info, X86Features* features) { + (void)info; + // Handling Darwin platform through sysctlbyname. + features->sse = GetDarwinSysCtlByName("hw.optional.sse"); + features->sse2 = GetDarwinSysCtlByName("hw.optional.sse2"); + features->sse3 = GetDarwinSysCtlByName("hw.optional.sse3"); + features->ssse3 = GetDarwinSysCtlByName("hw.optional.supplementalsse3"); + features->sse4_1 = GetDarwinSysCtlByName("hw.optional.sse4_1"); + features->sse4_2 = GetDarwinSysCtlByName("hw.optional.sse4_2"); +} + +#endif // CPU_FEATURES_OS_MACOS +#endif // CPU_FEATURES_ARCH_X86 diff --git a/node_modules/cpu-features/deps/cpu_features/src/impl_x86_windows.c b/node_modules/cpu-features/deps/cpu_features/src/impl_x86_windows.c new file mode 100644 index 00000000..8a82823a --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/impl_x86_windows.c @@ -0,0 +1,58 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_X86 +#ifdef CPU_FEATURES_OS_WINDOWS + +#include "impl_x86__base_implementation.inl" + +static void OverrideOsPreserves(OsPreserves* os_preserves) { + (void)os_preserves; + // No override +} + +#include "internal/windows_utils.h" + +#if defined(CPU_FEATURES_MOCK_CPUID_X86) +extern bool GetWindowsIsProcessorFeaturePresent(DWORD); +#else // CPU_FEATURES_MOCK_CPUID_X86 +static bool GetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature) { + return IsProcessorFeaturePresent(ProcessorFeature); +} +#endif + +static void DetectFeaturesFromOs(X86Info* info, X86Features* features) { + // Handling Windows platform through IsProcessorFeaturePresent. + // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-isprocessorfeaturepresent + features->sse = + GetWindowsIsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE); + features->sse2 = + GetWindowsIsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE); + features->sse3 = + GetWindowsIsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE); + features->ssse3 = + GetWindowsIsProcessorFeaturePresent(PF_SSSE3_INSTRUCTIONS_AVAILABLE); + features->sse4_1 = + GetWindowsIsProcessorFeaturePresent(PF_SSE4_1_INSTRUCTIONS_AVAILABLE); + features->sse4_2 = + GetWindowsIsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE); + +// do not bother checking PF_AVX* +// cause AVX enabled processor will have XCR0 be exposed and this function will be skipped at all +} + +#endif // CPU_FEATURES_OS_WINDOWS +#endif // CPU_FEATURES_ARCH_X86 diff --git a/node_modules/cpu-features/deps/cpu_features/src/stack_line_reader.c b/node_modules/cpu-features/deps/cpu_features/src/stack_line_reader.c new file mode 100644 index 00000000..ffc778d3 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/stack_line_reader.c @@ -0,0 +1,132 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/stack_line_reader.h" + +#include +#include +#include + +#include "internal/filesystem.h" + +void StackLineReader_Initialize(StackLineReader* reader, int fd) { + reader->view.ptr = reader->buffer; + reader->view.size = 0; + reader->skip_mode = false; + reader->fd = fd; +} + +// Replaces the content of buffer with bytes from the file. +static int LoadFullBuffer(StackLineReader* reader) { + const int read = CpuFeatures_ReadFile(reader->fd, reader->buffer, + STACK_LINE_READER_BUFFER_SIZE); + assert(read >= 0); + reader->view.ptr = reader->buffer; + reader->view.size = read; + return read; +} + +// Appends with bytes from the file to buffer, filling the remaining space. +static int LoadMore(StackLineReader* reader) { + char* const ptr = reader->buffer + reader->view.size; + const size_t size_to_read = STACK_LINE_READER_BUFFER_SIZE - reader->view.size; + const int read = CpuFeatures_ReadFile(reader->fd, ptr, size_to_read); + assert(read >= 0); + assert(read <= (int)size_to_read); + reader->view.size += read; + return read; +} + +static int IndexOfEol(StackLineReader* reader) { + return CpuFeatures_StringView_IndexOfChar(reader->view, '\n'); +} + +// Relocate buffer's pending bytes at the beginning of the array and fills the +// remaining space with bytes from the file. +static int BringToFrontAndLoadMore(StackLineReader* reader) { + if (reader->view.size && reader->view.ptr != reader->buffer) { + memmove(reader->buffer, reader->view.ptr, reader->view.size); + } + reader->view.ptr = reader->buffer; + return LoadMore(reader); +} + +// Loads chunks of buffer size from disks until it contains a newline character +// or end of file. +static void SkipToNextLine(StackLineReader* reader) { + for (;;) { + const int read = LoadFullBuffer(reader); + if (read == 0) { + break; + } else { + const int eol_index = IndexOfEol(reader); + if (eol_index >= 0) { + reader->view = + CpuFeatures_StringView_PopFront(reader->view, eol_index + 1); + break; + } + } + } +} + +static LineResult CreateLineResult(bool eof, bool full_line, StringView view) { + LineResult result; + result.eof = eof; + result.full_line = full_line; + result.line = view; + return result; +} + +// Helper methods to provide clearer semantic in StackLineReader_NextLine. +static LineResult CreateEOFLineResult(StringView view) { + return CreateLineResult(true, true, view); +} + +static LineResult CreateTruncatedLineResult(StringView view) { + return CreateLineResult(false, false, view); +} + +static LineResult CreateValidLineResult(StringView view) { + return CreateLineResult(false, true, view); +} + +LineResult StackLineReader_NextLine(StackLineReader* reader) { + if (reader->skip_mode) { + SkipToNextLine(reader); + reader->skip_mode = false; + } + { + const bool can_load_more = + reader->view.size < STACK_LINE_READER_BUFFER_SIZE; + int eol_index = IndexOfEol(reader); + if (eol_index < 0 && can_load_more) { + const int read = BringToFrontAndLoadMore(reader); + if (read == 0) { + return CreateEOFLineResult(reader->view); + } + eol_index = IndexOfEol(reader); + } + if (eol_index < 0) { + reader->skip_mode = true; + return CreateTruncatedLineResult(reader->view); + } + { + StringView line = + CpuFeatures_StringView_KeepFront(reader->view, eol_index); + reader->view = + CpuFeatures_StringView_PopFront(reader->view, eol_index + 1); + return CreateValidLineResult(line); + } + } +} diff --git a/node_modules/cpu-features/deps/cpu_features/src/string_view.c b/node_modules/cpu-features/deps/cpu_features/src/string_view.c new file mode 100644 index 00000000..2cac9da7 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/string_view.c @@ -0,0 +1,192 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/string_view.h" + +#include +#include + +#include "copy.inl" +#include "equals.inl" + +static const char* CpuFeatures_memchr(const char* const ptr, const size_t size, + const char c) { + for (size_t i = 0; ptr && ptr[i] != '\0' && i < size; ++i) + if (ptr[i] == c) return ptr + i; + return NULL; +} + +int CpuFeatures_StringView_IndexOfChar(const StringView view, char c) { + if (view.ptr && view.size) { + const char* const found = CpuFeatures_memchr(view.ptr, view.size, c); + if (found) { + return (int)(found - view.ptr); + } + } + return -1; +} + +int CpuFeatures_StringView_IndexOf(const StringView view, + const StringView sub_view) { + if (sub_view.size) { + StringView remainder = view; + while (remainder.size >= sub_view.size) { + const int found_index = + CpuFeatures_StringView_IndexOfChar(remainder, sub_view.ptr[0]); + if (found_index < 0) break; + remainder = CpuFeatures_StringView_PopFront(remainder, found_index); + if (CpuFeatures_StringView_StartsWith(remainder, sub_view)) { + return (int)(remainder.ptr - view.ptr); + } + remainder = CpuFeatures_StringView_PopFront(remainder, 1); + } + } + return -1; +} + +bool CpuFeatures_StringView_IsEquals(const StringView a, const StringView b) { + if (a.size == b.size) { + return a.ptr == b.ptr || equals(a.ptr, b.ptr, b.size); + } + return false; +} + +bool CpuFeatures_StringView_StartsWith(const StringView a, const StringView b) { + return a.ptr && b.ptr && b.size && a.size >= b.size + ? equals(a.ptr, b.ptr, b.size) + : false; +} + +StringView CpuFeatures_StringView_PopFront(const StringView str_view, + size_t count) { + if (count > str_view.size) { + return kEmptyStringView; + } + return view(str_view.ptr + count, str_view.size - count); +} + +StringView CpuFeatures_StringView_PopBack(const StringView str_view, + size_t count) { + if (count > str_view.size) { + return kEmptyStringView; + } + return view(str_view.ptr, str_view.size - count); +} + +StringView CpuFeatures_StringView_KeepFront(const StringView str_view, + size_t count) { + return count <= str_view.size ? view(str_view.ptr, count) : str_view; +} + +char CpuFeatures_StringView_Front(const StringView view) { + assert(view.size); + assert(view.ptr); + return view.ptr[0]; +} + +char CpuFeatures_StringView_Back(const StringView view) { + assert(view.size); + return view.ptr[view.size - 1]; +} + +StringView CpuFeatures_StringView_TrimWhitespace(StringView view) { + while (view.size && isspace(CpuFeatures_StringView_Front(view))) + view = CpuFeatures_StringView_PopFront(view, 1); + while (view.size && isspace(CpuFeatures_StringView_Back(view))) + view = CpuFeatures_StringView_PopBack(view, 1); + return view; +} + +static int HexValue(const char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return -1; +} + +// Returns -1 if view contains non digits. +static int ParsePositiveNumberWithBase(const StringView view, int base) { + int result = 0; + StringView remainder = view; + for (; remainder.size; + remainder = CpuFeatures_StringView_PopFront(remainder, 1)) { + const int value = HexValue(CpuFeatures_StringView_Front(remainder)); + if (value < 0 || value >= base) return -1; + result = (result * base) + value; + } + return result; +} + +int CpuFeatures_StringView_ParsePositiveNumber(const StringView view) { + if (view.size) { + const StringView hex_prefix = str("0x"); + if (CpuFeatures_StringView_StartsWith(view, hex_prefix)) { + const StringView span_no_prefix = + CpuFeatures_StringView_PopFront(view, hex_prefix.size); + return ParsePositiveNumberWithBase(span_no_prefix, 16); + } + return ParsePositiveNumberWithBase(view, 10); + } + return -1; +} + +void CpuFeatures_StringView_CopyString(const StringView src, char* dst, + size_t dst_size) { + if (dst_size > 0) { + const size_t max_copy_size = dst_size - 1; + const size_t copy_size = + src.size > max_copy_size ? max_copy_size : src.size; + copy(dst, src.ptr, copy_size); + dst[copy_size] = '\0'; + } +} + +bool CpuFeatures_StringView_HasWord(const StringView line, + const char* const word_str, + const char separator) { + const StringView word = str(word_str); + StringView remainder = line; + for (;;) { + const int index_of_word = CpuFeatures_StringView_IndexOf(remainder, word); + if (index_of_word < 0) { + return false; + } else { + const StringView before = + CpuFeatures_StringView_KeepFront(line, index_of_word); + const StringView after = + CpuFeatures_StringView_PopFront(line, index_of_word + word.size); + const bool valid_before = + before.size == 0 || CpuFeatures_StringView_Back(before) == separator; + const bool valid_after = + after.size == 0 || CpuFeatures_StringView_Front(after) == separator; + if (valid_before && valid_after) return true; + remainder = + CpuFeatures_StringView_PopFront(remainder, index_of_word + word.size); + } + } + return false; +} + +bool CpuFeatures_StringView_GetAttributeKeyValue(const StringView line, + StringView* key, + StringView* value) { + const StringView sep = str(": "); + const int index_of_separator = CpuFeatures_StringView_IndexOf(line, sep); + if (index_of_separator < 0) return false; + *value = CpuFeatures_StringView_TrimWhitespace( + CpuFeatures_StringView_PopFront(line, index_of_separator + sep.size)); + *key = CpuFeatures_StringView_TrimWhitespace( + CpuFeatures_StringView_KeepFront(line, index_of_separator)); + return true; +} diff --git a/node_modules/cpu-features/deps/cpu_features/src/utils/list_cpu_features.c b/node_modules/cpu-features/deps/cpu_features/src/utils/list_cpu_features.c new file mode 100644 index 00000000..8226d852 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/src/utils/list_cpu_features.c @@ -0,0 +1,461 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This program dumps current host data to the standard output. +// Output can be text or json if the `--json` flag is passed. + +#include +#include +#include +#include +#include +#include +#include + +#include "cpu_features_macros.h" + +#if defined(CPU_FEATURES_ARCH_X86) +#include "cpuinfo_x86.h" +#elif defined(CPU_FEATURES_ARCH_ARM) +#include "cpuinfo_arm.h" +#elif defined(CPU_FEATURES_ARCH_AARCH64) +#include "cpuinfo_aarch64.h" +#elif defined(CPU_FEATURES_ARCH_MIPS) +#include "cpuinfo_mips.h" +#elif defined(CPU_FEATURES_ARCH_PPC) +#include "cpuinfo_ppc.h" +#elif defined(CPU_FEATURES_ARCH_S390X) +#include "cpuinfo_s390x.h" +#elif defined(CPU_FEATURES_ARCH_RISCV) +#include "cpuinfo_riscv.h" +#endif + +// Design principles +// ----------------- +// We build a tree structure containing all the data to be displayed. +// Then depending on the output type (text or json) we walk the tree and display +// the data accordingly. + +// We use a bump allocator to allocate strings and nodes of the tree, +// Memory is not intended to be reclaimed. +typedef struct { + char* ptr; + size_t size; +} BumpAllocator; + +char gGlobalBuffer[64 * 1024]; +BumpAllocator gBumpAllocator = {.ptr = gGlobalBuffer, + .size = sizeof(gGlobalBuffer)}; + +static void internal_error(void) { + fputs("internal error\n", stderr); + exit(EXIT_FAILURE); +} + +#define ALIGN 8 + +static void assertAligned(void) { + if ((uintptr_t)(gBumpAllocator.ptr) % ALIGN) internal_error(); +} + +static void BA_Align(void) { + while (gBumpAllocator.size && (uintptr_t)(gBumpAllocator.ptr) % ALIGN) { + --gBumpAllocator.size; + ++gBumpAllocator.ptr; + } + assertAligned(); +} + +// Update the available memory left in the BumpAllocator. +static void* BA_Bump(size_t size) { + assertAligned(); + // Align size to next 8B boundary. + size = (size + ALIGN - 1) / ALIGN * ALIGN; + if (gBumpAllocator.size < size) internal_error(); + void* ptr = gBumpAllocator.ptr; + gBumpAllocator.size -= size; + gBumpAllocator.ptr += size; + return ptr; +} + +// The type of the nodes in the tree. +typedef enum { + NT_INVALID, + NT_INT, + NT_MAP, + NT_MAP_ENTRY, + NT_ARRAY, + NT_ARRAY_ELEMENT, + NT_STRING, +} NodeType; + +// The node in the tree. +typedef struct Node { + NodeType type; + unsigned integer; + const char* string; + struct Node* value; + struct Node* next; +} Node; + +// Creates an initialized Node. +static Node* BA_CreateNode(NodeType type) { + Node* tv = (Node*)BA_Bump(sizeof(Node)); + assert(tv); + *tv = (Node){.type = type}; + return tv; +} + +// Adds an integer node. +static Node* CreateInt(int value) { + Node* tv = BA_CreateNode(NT_INT); + tv->integer = value; + return tv; +} + +// Adds a string node. +// `value` must outlive the tree. +static Node* CreateConstantString(const char* value) { + Node* tv = BA_CreateNode(NT_STRING); + tv->string = value; + return tv; +} + +// Adds a map node. +static Node* CreateMap(void) { return BA_CreateNode(NT_MAP); } + +// Adds an array node. +static Node* CreateArray(void) { return BA_CreateNode(NT_ARRAY); } + +// Adds a formatted string node. +static Node* CreatePrintfString(const char* format, ...) { + va_list arglist; + va_start(arglist, format); + char* const ptr = gBumpAllocator.ptr; + const int written = vsnprintf(ptr, gBumpAllocator.size, format, arglist); + va_end(arglist); + if (written < 0 || written >= (int)gBumpAllocator.size) internal_error(); + return CreateConstantString((char*)BA_Bump(written)); +} + +// Adds a string node. +static Node* CreateString(const char* value) { + return CreatePrintfString("%s", value); +} + +// Adds a map entry node. +static void AddMapEntry(Node* map, const char* key, Node* value) { + assert(map && map->type == NT_MAP); + Node* current = map; + while (current->next) current = current->next; + current->next = (Node*)BA_Bump(sizeof(Node)); + *current->next = (Node){.type = NT_MAP_ENTRY, .string = key, .value = value}; +} + +// Adds an array element node. +static void AddArrayElement(Node* array, Node* value) { + assert(array && array->type == NT_ARRAY); + Node* current = array; + while (current->next) current = current->next; + current->next = (Node*)BA_Bump(sizeof(Node)); + *current->next = (Node){.type = NT_ARRAY_ELEMENT, .value = value}; +} + +static int cmp(const void* p1, const void* p2) { + return strcmp(*(const char* const*)p1, *(const char* const*)p2); +} + +#define DEFINE_ADD_FLAGS(HasFeature, FeatureName, FeatureType, LastEnum) \ + static void AddFlags(Node* map, const FeatureType* features) { \ + size_t i; \ + const char* ptrs[LastEnum] = {0}; \ + size_t count = 0; \ + for (i = 0; i < LastEnum; ++i) { \ + if (HasFeature(features, i)) { \ + ptrs[count] = FeatureName(i); \ + ++count; \ + } \ + } \ + qsort((void*)ptrs, count, sizeof(char*), cmp); \ + Node* const array = CreateArray(); \ + for (i = 0; i < count; ++i) \ + AddArrayElement(array, CreateConstantString(ptrs[i])); \ + AddMapEntry(map, "flags", array); \ + } + +#if defined(CPU_FEATURES_ARCH_X86) +DEFINE_ADD_FLAGS(GetX86FeaturesEnumValue, GetX86FeaturesEnumName, X86Features, + X86_LAST_) +#elif defined(CPU_FEATURES_ARCH_ARM) +DEFINE_ADD_FLAGS(GetArmFeaturesEnumValue, GetArmFeaturesEnumName, ArmFeatures, + ARM_LAST_) +#elif defined(CPU_FEATURES_ARCH_AARCH64) +DEFINE_ADD_FLAGS(GetAarch64FeaturesEnumValue, GetAarch64FeaturesEnumName, + Aarch64Features, AARCH64_LAST_) +#elif defined(CPU_FEATURES_ARCH_MIPS) +DEFINE_ADD_FLAGS(GetMipsFeaturesEnumValue, GetMipsFeaturesEnumName, + MipsFeatures, MIPS_LAST_) +#elif defined(CPU_FEATURES_ARCH_PPC) +DEFINE_ADD_FLAGS(GetPPCFeaturesEnumValue, GetPPCFeaturesEnumName, PPCFeatures, + PPC_LAST_) +#elif defined(CPU_FEATURES_ARCH_S390X) +DEFINE_ADD_FLAGS(GetS390XFeaturesEnumValue, GetS390XFeaturesEnumName, S390XFeatures, + S390X_LAST_) +#elif defined(CPU_FEATURES_ARCH_RISCV) +DEFINE_ADD_FLAGS(GetRiscvFeaturesEnumValue, GetRiscvFeaturesEnumName, RiscvFeatures, + RISCV_LAST_) +#endif + +// Prints a json string with characters escaping. +static void printJsonString(const char* str) { + putchar('"'); + for (; str && *str; ++str) { + switch (*str) { + case '\"': + case '\\': + case '/': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + putchar('\\'); + } + putchar(*str); + } + putchar('"'); +} + +// Walks a Node and print it as json. +static void printJson(const Node* current) { + assert(current); + switch (current->type) { + case NT_INVALID: + break; + case NT_INT: + printf("%d", current->integer); + break; + case NT_STRING: + printJsonString(current->string); + break; + case NT_ARRAY: + putchar('['); + if (current->next) printJson(current->next); + putchar(']'); + break; + case NT_MAP: + putchar('{'); + if (current->next) printJson(current->next); + putchar('}'); + break; + case NT_MAP_ENTRY: + printf("\"%s\":", current->string); + printJson(current->value); + if (current->next) { + putchar(','); + printJson(current->next); + } + break; + case NT_ARRAY_ELEMENT: + printJson(current->value); + if (current->next) { + putchar(','); + printJson(current->next); + } + break; + } +} + +// Walks a Node and print it as text. +static void printTextField(const Node* current) { + switch (current->type) { + case NT_INVALID: + break; + case NT_INT: + printf("%3d (0x%02X)", current->integer, current->integer); + break; + case NT_STRING: + fputs(current->string, stdout); + break; + case NT_ARRAY: + if (current->next) printTextField(current->next); + break; + case NT_MAP: + if (current->next) { + printf("{"); + printJson(current->next); + printf("}"); + } + break; + case NT_MAP_ENTRY: + printf("%-15s : ", current->string); + printTextField(current->value); + if (current->next) { + putchar('\n'); + printTextField(current->next); + } + break; + case NT_ARRAY_ELEMENT: + printTextField(current->value); + if (current->next) { + putchar(','); + printTextField(current->next); + } + break; + } +} + +static void printTextRoot(const Node* current) { + if (current->type == NT_MAP && current->next) printTextField(current->next); +} + +static void showUsage(const char* name) { + printf( + "\n" + "Usage: %s [options]\n" + " Options:\n" + " -h | --help Show help message.\n" + " -j | --json Format output as json instead of plain text.\n" + "\n", + name); +} + +static Node* GetCacheTypeString(CacheType cache_type) { + switch (cache_type) { + case CPU_FEATURE_CACHE_NULL: + return CreateConstantString("null"); + case CPU_FEATURE_CACHE_DATA: + return CreateConstantString("data"); + case CPU_FEATURE_CACHE_INSTRUCTION: + return CreateConstantString("instruction"); + case CPU_FEATURE_CACHE_UNIFIED: + return CreateConstantString("unified"); + case CPU_FEATURE_CACHE_TLB: + return CreateConstantString("tlb"); + case CPU_FEATURE_CACHE_DTLB: + return CreateConstantString("dtlb"); + case CPU_FEATURE_CACHE_STLB: + return CreateConstantString("stlb"); + case CPU_FEATURE_CACHE_PREFETCH: + return CreateConstantString("prefetch"); + } + CPU_FEATURES_UNREACHABLE(); +} + +static void AddCacheInfo(Node* root, const CacheInfo* cache_info) { + Node* array = CreateArray(); + for (int i = 0; i < cache_info->size; ++i) { + CacheLevelInfo info = cache_info->levels[i]; + Node* map = CreateMap(); + AddMapEntry(map, "level", CreateInt(info.level)); + AddMapEntry(map, "cache_type", GetCacheTypeString(info.cache_type)); + AddMapEntry(map, "cache_size", CreateInt(info.cache_size)); + AddMapEntry(map, "ways", CreateInt(info.ways)); + AddMapEntry(map, "line_size", CreateInt(info.line_size)); + AddMapEntry(map, "tlb_entries", CreateInt(info.tlb_entries)); + AddMapEntry(map, "partitioning", CreateInt(info.partitioning)); + AddArrayElement(array, map); + } + AddMapEntry(root, "cache_info", array); +} + +static Node* CreateTree(void) { + Node* root = CreateMap(); +#if defined(CPU_FEATURES_ARCH_X86) + const X86Info info = GetX86Info(); + const CacheInfo cache_info = GetX86CacheInfo(); + AddMapEntry(root, "arch", CreateString("x86")); + AddMapEntry(root, "brand", CreateString(info.brand_string)); + AddMapEntry(root, "family", CreateInt(info.family)); + AddMapEntry(root, "model", CreateInt(info.model)); + AddMapEntry(root, "stepping", CreateInt(info.stepping)); + AddMapEntry(root, "uarch", + CreateString( + GetX86MicroarchitectureName(GetX86Microarchitecture(&info)))); + AddFlags(root, &info.features); + AddCacheInfo(root, &cache_info); +#elif defined(CPU_FEATURES_ARCH_ARM) + const ArmInfo info = GetArmInfo(); + AddMapEntry(root, "arch", CreateString("ARM")); + AddMapEntry(root, "implementer", CreateInt(info.implementer)); + AddMapEntry(root, "architecture", CreateInt(info.architecture)); + AddMapEntry(root, "variant", CreateInt(info.variant)); + AddMapEntry(root, "part", CreateInt(info.part)); + AddMapEntry(root, "revision", CreateInt(info.revision)); + AddFlags(root, &info.features); +#elif defined(CPU_FEATURES_ARCH_AARCH64) + const Aarch64Info info = GetAarch64Info(); + AddMapEntry(root, "arch", CreateString("aarch64")); + AddMapEntry(root, "implementer", CreateInt(info.implementer)); + AddMapEntry(root, "variant", CreateInt(info.variant)); + AddMapEntry(root, "part", CreateInt(info.part)); + AddMapEntry(root, "revision", CreateInt(info.revision)); + AddFlags(root, &info.features); +#elif defined(CPU_FEATURES_ARCH_MIPS) + const MipsInfo info = GetMipsInfo(); + AddMapEntry(root, "arch", CreateString("mips")); + AddFlags(root, &info.features); +#elif defined(CPU_FEATURES_ARCH_PPC) + const PPCInfo info = GetPPCInfo(); + const PPCPlatformStrings strings = GetPPCPlatformStrings(); + AddMapEntry(root, "arch", CreateString("ppc")); + AddMapEntry(root, "platform", CreateString(strings.platform)); + AddMapEntry(root, "model", CreateString(strings.model)); + AddMapEntry(root, "machine", CreateString(strings.machine)); + AddMapEntry(root, "cpu", CreateString(strings.cpu)); + AddMapEntry(root, "instruction", CreateString(strings.type.platform)); + AddMapEntry(root, "microarchitecture", + CreateString(strings.type.base_platform)); + AddFlags(root, &info.features); +#elif defined(CPU_FEATURES_ARCH_S390X) + const S390XInfo info = GetS390XInfo(); + const S390XPlatformStrings strings = GetS390XPlatformStrings(); + AddMapEntry(root, "arch", CreateString("s390x")); + AddMapEntry(root, "platform", CreateString("zSeries")); + AddMapEntry(root, "model", CreateString(strings.type.platform)); + AddMapEntry(root, "# processors", CreateInt(strings.num_processors)); + AddFlags(root, &info.features); +#elif defined(CPU_FEATURES_ARCH_RISCV) + const RiscvInfo info = GetRiscvInfo(); + AddMapEntry(root, "arch", CreateString("risc-v")); + AddMapEntry(root, "vendor", CreateString(info.vendor)); + AddMapEntry(root, "microarchitecture", CreateString(info.uarch)); + AddFlags(root, &info.features); +#endif + return root; +} + +int main(int argc, char** argv) { + BA_Align(); + const Node* const root = CreateTree(); + bool outputJson = false; + int i = 1; + for (; i < argc; ++i) { + const char* arg = argv[i]; + if (strcmp(arg, "-j") == 0 || strcmp(arg, "--json") == 0) { + outputJson = true; + } else { + showUsage(argv[0]); + if (strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) + return EXIT_SUCCESS; + return EXIT_FAILURE; + } + } + if (outputJson) + printJson(root); + else + printTextRoot(root); + putchar('\n'); + return EXIT_SUCCESS; +} diff --git a/node_modules/cpu-features/deps/cpu_features/test/CMakeLists.txt b/node_modules/cpu-features/deps/cpu_features/test/CMakeLists.txt new file mode 100644 index 00000000..80a0466f --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/CMakeLists.txt @@ -0,0 +1,114 @@ +# +# libraries for tests +# + +include_directories(../include) +add_definitions(-DCPU_FEATURES_TEST) + +##------------------------------------------------------------------------------ +add_library(string_view ../src/string_view.c) +##------------------------------------------------------------------------------ +add_library(filesystem_for_testing filesystem_for_testing.cc) +target_compile_definitions(filesystem_for_testing PUBLIC CPU_FEATURES_MOCK_FILESYSTEM) +##------------------------------------------------------------------------------ +add_library(hwcaps_for_testing hwcaps_for_testing.cc) +target_link_libraries(hwcaps_for_testing filesystem_for_testing) +##------------------------------------------------------------------------------ +add_library(stack_line_reader ../src/stack_line_reader.c) +target_compile_definitions(stack_line_reader PUBLIC STACK_LINE_READER_BUFFER_SIZE=1024) +target_link_libraries(stack_line_reader string_view) +##------------------------------------------------------------------------------ +add_library(stack_line_reader_for_test ../src/stack_line_reader.c) +target_compile_definitions(stack_line_reader_for_test PUBLIC STACK_LINE_READER_BUFFER_SIZE=16) +target_link_libraries(stack_line_reader_for_test string_view filesystem_for_testing) +##------------------------------------------------------------------------------ +add_library(all_libraries ../src/hwcaps.c ../src/stack_line_reader.c) +target_link_libraries(all_libraries hwcaps_for_testing stack_line_reader string_view) + +# +# tests +# +link_libraries(gtest gmock_main) + +## bit_utils_test +add_executable(bit_utils_test bit_utils_test.cc) +target_link_libraries(bit_utils_test) +add_test(NAME bit_utils_test COMMAND bit_utils_test) +##------------------------------------------------------------------------------ +## string_view_test +add_executable(string_view_test string_view_test.cc ../src/string_view.c) +target_link_libraries(string_view_test string_view) +add_test(NAME string_view_test COMMAND string_view_test) +##------------------------------------------------------------------------------ +## stack_line_reader_test +add_executable(stack_line_reader_test stack_line_reader_test.cc) +target_link_libraries(stack_line_reader_test stack_line_reader_for_test) +add_test(NAME stack_line_reader_test COMMAND stack_line_reader_test) +##------------------------------------------------------------------------------ +## cpuinfo_x86_test +if(PROCESSOR_IS_X86) + add_executable(cpuinfo_x86_test + cpuinfo_x86_test.cc + ../src/impl_x86_freebsd.c + ../src/impl_x86_linux_or_android.c + ../src/impl_x86_macos.c + ../src/impl_x86_windows.c + ) + target_compile_definitions(cpuinfo_x86_test PUBLIC CPU_FEATURES_MOCK_CPUID_X86) + if(APPLE) + target_compile_definitions(cpuinfo_x86_test PRIVATE HAVE_SYSCTLBYNAME) + endif() + target_link_libraries(cpuinfo_x86_test all_libraries) + add_test(NAME cpuinfo_x86_test COMMAND cpuinfo_x86_test) +endif() +##------------------------------------------------------------------------------ +## cpuinfo_arm_test +if(PROCESSOR_IS_ARM) + add_executable(cpuinfo_arm_test cpuinfo_arm_test.cc ../src/impl_arm_linux_or_android.c) + target_link_libraries(cpuinfo_arm_test all_libraries) + add_test(NAME cpuinfo_arm_test COMMAND cpuinfo_arm_test) +endif() +##------------------------------------------------------------------------------ +## cpuinfo_aarch64_test +if(PROCESSOR_IS_AARCH64) + add_executable(cpuinfo_aarch64_test + cpuinfo_aarch64_test.cc + ../src/impl_aarch64_linux_or_android.c + ../src/impl_aarch64_macos_or_iphone.c + ../src/impl_aarch64_windows.c) + if(APPLE) + target_compile_definitions(cpuinfo_aarch64_test PUBLIC CPU_FEATURES_MOCK_SYSCTL_AARCH64) + target_compile_definitions(cpuinfo_aarch64_test PRIVATE HAVE_SYSCTLBYNAME) + endif() + target_compile_definitions(cpuinfo_aarch64_test PUBLIC CPU_FEATURES_MOCK_CPUID_AARCH64) + target_link_libraries(cpuinfo_aarch64_test all_libraries) + add_test(NAME cpuinfo_aarch64_test COMMAND cpuinfo_aarch64_test) +endif() +##------------------------------------------------------------------------------ +## cpuinfo_mips_test +if(PROCESSOR_IS_MIPS) + add_executable(cpuinfo_mips_test cpuinfo_mips_test.cc ../src/impl_mips_linux_or_android.c) + target_link_libraries(cpuinfo_mips_test all_libraries) + add_test(NAME cpuinfo_mips_test COMMAND cpuinfo_mips_test) +endif() +##------------------------------------------------------------------------------ +## cpuinfo_ppc_test +if(PROCESSOR_IS_POWER) + add_executable(cpuinfo_ppc_test cpuinfo_ppc_test.cc ../src/impl_ppc_linux.c) + target_link_libraries(cpuinfo_ppc_test all_libraries) + add_test(NAME cpuinfo_ppc_test COMMAND cpuinfo_ppc_test) +endif() +##------------------------------------------------------------------------------ +## cpuinfo_s390x_test +if(PROCESSOR_IS_S390X) + add_executable(cpuinfo_s390x_test cpuinfo_s390x_test.cc ../src/impl_s390x_linux.c) + target_link_libraries(cpuinfo_s390x_test all_libraries) + add_test(NAME cpuinfo_s390x_test COMMAND cpuinfo_s390x_test) +endif() +##------------------------------------------------------------------------------ +## cpuinfo_riscv_test +if(PROCESSOR_IS_RISCV) + add_executable(cpuinfo_riscv_test cpuinfo_riscv_test.cc ../src/impl_riscv_linux.c) + target_link_libraries(cpuinfo_riscv_test all_libraries) + add_test(NAME cpuinfo_riscv_test COMMAND cpuinfo_riscv_test) +endif() diff --git a/node_modules/cpu-features/deps/cpu_features/test/bit_utils_test.cc b/node_modules/cpu-features/deps/cpu_features/test/bit_utils_test.cc new file mode 100644 index 00000000..3874e130 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/bit_utils_test.cc @@ -0,0 +1,53 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/bit_utils.h" + +#include "gtest/gtest.h" + +namespace cpu_features { +namespace { + +TEST(UtilsTest, IsBitSet) { + for (size_t bit_set = 0; bit_set < 32; ++bit_set) { + const uint32_t value = 1UL << bit_set; + for (uint32_t i = 0; i < 32; ++i) { + EXPECT_EQ(IsBitSet(value, i), i == bit_set); + } + } + + // testing 0, all bits should be 0. + for (uint32_t i = 0; i < 32; ++i) { + EXPECT_FALSE(IsBitSet(0, i)); + } + + // testing ~0, all bits should be 1. + for (uint32_t i = 0; i < 32; ++i) { + EXPECT_TRUE(IsBitSet(-1, i)); + } +} + +TEST(UtilsTest, ExtractBitRange) { + // Extracting all bits gives the same number. + EXPECT_EQ(ExtractBitRange(123, 31, 0), 123); + // Extracting 1 bit gives parity. + EXPECT_EQ(ExtractBitRange(123, 0, 0), 1); + EXPECT_EQ(ExtractBitRange(122, 0, 0), 0); + + EXPECT_EQ(ExtractBitRange(0xF0, 7, 4), 0xF); + EXPECT_EQ(ExtractBitRange(0x42 << 2, 10, 2), 0x42); +} + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_aarch64_test.cc b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_aarch64_test.cc new file mode 100644 index 00000000..b43d1aa5 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_aarch64_test.cc @@ -0,0 +1,396 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpuinfo_aarch64.h" + +#include + +#include "filesystem_for_testing.h" +#include "gtest/gtest.h" +#include "hwcaps_for_testing.h" +#if defined(CPU_FEATURES_OS_WINDOWS) +#include "internal/windows_utils.h" +#endif // CPU_FEATURES_OS_WINDOWS + +namespace cpu_features { +class FakeCpuAarch64 { + public: +#if defined(CPU_FEATURES_OS_WINDOWS) + bool GetWindowsIsProcessorFeaturePresent(DWORD dwProcessorFeature) { + return windows_isprocessorfeaturepresent_.count(dwProcessorFeature); + } + + void SetWindowsIsProcessorFeaturePresent(DWORD dwProcessorFeature) { + windows_isprocessorfeaturepresent_.insert(dwProcessorFeature); + } + + WORD GetWindowsNativeSystemInfoProcessorRevision() const { + return processor_revision_; + } + + void SetWindowsNativeSystemInfoProcessorRevision(WORD wProcessorRevision) { + processor_revision_ = wProcessorRevision; + } + + private: + std::set windows_isprocessorfeaturepresent_; + WORD processor_revision_{}; +#endif // CPU_FEATURES_OS_WINDOWS +}; + +static FakeCpuAarch64* g_fake_cpu_instance = nullptr; + +static FakeCpuAarch64& cpu() { + assert(g_fake_cpu_instance != nullptr); + return *g_fake_cpu_instance; +} + +#if defined(CPU_FEATURES_OS_WINDOWS) +extern "C" bool GetWindowsIsProcessorFeaturePresent(DWORD dwProcessorFeature) { + return cpu().GetWindowsIsProcessorFeaturePresent(dwProcessorFeature); +} + +extern "C" WORD GetWindowsNativeSystemInfoProcessorRevision() { + return cpu().GetWindowsNativeSystemInfoProcessorRevision(); +} +#endif // CPU_FEATURES_OS_WINDOWS + +namespace { + +class CpuidAarch64Test : public ::testing::Test { + protected: + void SetUp() override { + assert(g_fake_cpu_instance == nullptr); + g_fake_cpu_instance = new FakeCpuAarch64(); + } + void TearDown() override { + delete g_fake_cpu_instance; + g_fake_cpu_instance = nullptr; + } +}; + +TEST(CpuinfoAarch64Test, Aarch64FeaturesEnum) { + const char* last_name = GetAarch64FeaturesEnumName(AARCH64_LAST_); + EXPECT_STREQ(last_name, "unknown_feature"); + for (int i = static_cast(AARCH64_FP); + i != static_cast(AARCH64_LAST_); ++i) { + const auto feature = static_cast(i); + const char* name = GetAarch64FeaturesEnumName(feature); + ASSERT_FALSE(name == nullptr); + EXPECT_STRNE(name, ""); + EXPECT_STRNE(name, last_name); + } +} + +#if defined(CPU_FEATURES_OS_LINUX) +void DisableHardwareCapabilities() { SetHardwareCapabilities(0, 0); } + +#if defined(CPU_FEATURES_OS_MACOS) + +class FakeCpu { + public: + bool GetDarwinSysCtlByName(std::string name) const { + return darwin_sysctlbyname_.count(name); + } + + int GetDarwinSysCtlByNameValue(std::string name) const { + std::map::const_iterator iter = darwin_sysctlbynamevalue_.find(name); + if (iter != std::end(darwin_sysctlbynamevalue_)) { + return iter->second; + } + + return 0; + } + + void SetDarwinSysCtlByName(std::string name) { + darwin_sysctlbyname_.insert(name); + } + + void SetDarwinSysCtlByNameValue(std::string name, int value) { + darwin_sysctlbynamevalue_[name] = value; + } + private: + std::set darwin_sysctlbyname_; + std::map darwin_sysctlbynamevalue_; +}; + +static FakeCpu* g_fake_cpu_instance = nullptr; + +static FakeCpu& cpu() { + assert(g_fake_cpu_instance != nullptr); + return *g_fake_cpu_instance; +} + +extern "C" bool GetDarwinSysCtlByName(const char* name) { + return cpu().GetDarwinSysCtlByName(name); +} + +extern "C" int GetDarwinSysCtlByNameValue(const char *name) { + return cpu().GetDarwinSysCtlByNameValue(name); +} + +class CpuinfoAarch64Test : public ::testing::Test { + protected: + void SetUp() override { + assert(g_fake_cpu_instance == nullptr); + g_fake_cpu_instance = new FakeCpu(); + } + void TearDown() override { + delete g_fake_cpu_instance; + g_fake_cpu_instance = nullptr; + } +}; + +TEST_F(CpuinfoAarch64Test, FromDarwinSysctlFromName) { + cpu().SetDarwinSysCtlByName("hw.optional.floatingpoint"); + cpu().SetDarwinSysCtlByName("hw.optional.neon"); + cpu().SetDarwinSysCtlByName("hw.optional.neon_hpfp"); + cpu().SetDarwinSysCtlByName("hw.optional.neon_fp16"); + cpu().SetDarwinSysCtlByName("hw.optional.armv8_1_atomics"); + cpu().SetDarwinSysCtlByName("hw.optional.armv8_crc32"); + cpu().SetDarwinSysCtlByName("hw.optional.armv8_2_fhm"); + cpu().SetDarwinSysCtlByName("hw.optional.armv8_2_sha512"); + cpu().SetDarwinSysCtlByName("hw.optional.armv8_2_sha3"); + cpu().SetDarwinSysCtlByName("hw.optional.amx_version"); + cpu().SetDarwinSysCtlByName("hw.optional.ucnormal_mem"); + cpu().SetDarwinSysCtlByName("hw.optional.arm64"); + + cpu().SetDarwinSysCtlByNameValue("hw.cputype", 16777228); + cpu().SetDarwinSysCtlByNameValue("hw.cpusubtype", 2); + cpu().SetDarwinSysCtlByNameValue("hw.cpu64bit", 1); + cpu().SetDarwinSysCtlByNameValue("hw.cpufamily", 458787763); + cpu().SetDarwinSysCtlByNameValue("hw.cpusubfamily", 2); + + const auto info = GetAarch64Info(); + + EXPECT_EQ(info.implementer, 0x100000C); + EXPECT_EQ(info.variant, 2); + EXPECT_EQ(info.part, 0x1B588BB3); + EXPECT_EQ(info.revision, 2); + + EXPECT_TRUE(info.features.fp); + EXPECT_FALSE(info.features.asimd); + EXPECT_FALSE(info.features.evtstrm); + EXPECT_FALSE(info.features.aes); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_TRUE(info.features.crc32); + EXPECT_TRUE(info.features.atomics); + EXPECT_TRUE(info.features.fphp); + EXPECT_FALSE(info.features.asimdhp); + EXPECT_FALSE(info.features.cpuid); + EXPECT_FALSE(info.features.asimdrdm); + EXPECT_FALSE(info.features.jscvt); + EXPECT_FALSE(info.features.fcma); + EXPECT_FALSE(info.features.lrcpc); + EXPECT_FALSE(info.features.dcpop); + EXPECT_TRUE(info.features.sha3); + EXPECT_FALSE(info.features.sm3); + EXPECT_FALSE(info.features.sm4); + EXPECT_FALSE(info.features.asimddp); + EXPECT_TRUE(info.features.sha512); + EXPECT_FALSE(info.features.sve); + EXPECT_TRUE(info.features.asimdfhm); + EXPECT_FALSE(info.features.dit); + EXPECT_FALSE(info.features.uscat); + EXPECT_FALSE(info.features.ilrcpc); + EXPECT_FALSE(info.features.flagm); + EXPECT_FALSE(info.features.ssbs); + EXPECT_FALSE(info.features.sb); + EXPECT_FALSE(info.features.paca); + EXPECT_FALSE(info.features.pacg); +} + +#else + +TEST(CpuinfoAarch64Test, FromHardwareCap) { + ResetHwcaps(); + SetHardwareCapabilities(AARCH64_HWCAP_FP | AARCH64_HWCAP_AES, 0); + GetEmptyFilesystem(); // disabling /proc/cpuinfo + const auto info = GetAarch64Info(); + EXPECT_TRUE(info.features.fp); + EXPECT_FALSE(info.features.asimd); + EXPECT_FALSE(info.features.evtstrm); + EXPECT_TRUE(info.features.aes); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_FALSE(info.features.crc32); + EXPECT_FALSE(info.features.atomics); + EXPECT_FALSE(info.features.fphp); + EXPECT_FALSE(info.features.asimdhp); + EXPECT_FALSE(info.features.cpuid); + EXPECT_FALSE(info.features.asimdrdm); + EXPECT_FALSE(info.features.jscvt); + EXPECT_FALSE(info.features.fcma); + EXPECT_FALSE(info.features.lrcpc); + EXPECT_FALSE(info.features.dcpop); + EXPECT_FALSE(info.features.sha3); + EXPECT_FALSE(info.features.sm3); + EXPECT_FALSE(info.features.sm4); + EXPECT_FALSE(info.features.asimddp); + EXPECT_FALSE(info.features.sha512); + EXPECT_FALSE(info.features.sve); + EXPECT_FALSE(info.features.asimdfhm); + EXPECT_FALSE(info.features.dit); + EXPECT_FALSE(info.features.uscat); + EXPECT_FALSE(info.features.ilrcpc); + EXPECT_FALSE(info.features.flagm); + EXPECT_FALSE(info.features.ssbs); + EXPECT_FALSE(info.features.sb); + EXPECT_FALSE(info.features.paca); + EXPECT_FALSE(info.features.pacg); +} + +TEST(CpuinfoAarch64Test, FromHardwareCap2) { + ResetHwcaps(); + SetHardwareCapabilities(AARCH64_HWCAP_FP, + AARCH64_HWCAP2_SVE2 | AARCH64_HWCAP2_BTI); + GetEmptyFilesystem(); // disabling /proc/cpuinfo + const auto info = GetAarch64Info(); + EXPECT_TRUE(info.features.fp); + + EXPECT_TRUE(info.features.sve2); + EXPECT_TRUE(info.features.bti); + + EXPECT_FALSE(info.features.dcpodp); + EXPECT_FALSE(info.features.sveaes); + EXPECT_FALSE(info.features.svepmull); + EXPECT_FALSE(info.features.svebitperm); + EXPECT_FALSE(info.features.svesha3); + EXPECT_FALSE(info.features.svesm4); + EXPECT_FALSE(info.features.flagm2); + EXPECT_FALSE(info.features.frint); + EXPECT_FALSE(info.features.svei8mm); + EXPECT_FALSE(info.features.svef32mm); + EXPECT_FALSE(info.features.svef64mm); + EXPECT_FALSE(info.features.svebf16); + EXPECT_FALSE(info.features.i8mm); + EXPECT_FALSE(info.features.bf16); + EXPECT_FALSE(info.features.dgh); + EXPECT_FALSE(info.features.rng); +} +#endif // CPU_FEATURES_OS_MACOS + +TEST(CpuinfoAarch64Test, ARMCortexA53) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(Processor : AArch64 Processor rev 3 (aarch64) +processor : 0 +processor : 1 +processor : 2 +processor : 3 +processor : 4 +processor : 5 +processor : 6 +processor : 7 +Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 +CPU implementer : 0x41 +CPU architecture: AArch64 +CPU variant : 0x0 +CPU part : 0xd03 +CPU revision : 3)"); + const auto info = GetAarch64Info(); + EXPECT_EQ(info.implementer, 0x41); + EXPECT_EQ(info.variant, 0x0); + EXPECT_EQ(info.part, 0xd03); + EXPECT_EQ(info.revision, 3); + + EXPECT_TRUE(info.features.fp); + EXPECT_TRUE(info.features.asimd); + EXPECT_TRUE(info.features.evtstrm); + EXPECT_TRUE(info.features.aes); + EXPECT_TRUE(info.features.pmull); + EXPECT_TRUE(info.features.sha1); + EXPECT_TRUE(info.features.sha2); + EXPECT_TRUE(info.features.crc32); + + EXPECT_FALSE(info.features.atomics); + EXPECT_FALSE(info.features.fphp); + EXPECT_FALSE(info.features.asimdhp); + EXPECT_FALSE(info.features.cpuid); + EXPECT_FALSE(info.features.asimdrdm); + EXPECT_FALSE(info.features.jscvt); + EXPECT_FALSE(info.features.fcma); + EXPECT_FALSE(info.features.lrcpc); + EXPECT_FALSE(info.features.dcpop); + EXPECT_FALSE(info.features.sha3); + EXPECT_FALSE(info.features.sm3); + EXPECT_FALSE(info.features.sm4); + EXPECT_FALSE(info.features.asimddp); + EXPECT_FALSE(info.features.sha512); + EXPECT_FALSE(info.features.sve); + EXPECT_FALSE(info.features.asimdfhm); + EXPECT_FALSE(info.features.dit); + EXPECT_FALSE(info.features.uscat); + EXPECT_FALSE(info.features.ilrcpc); + EXPECT_FALSE(info.features.flagm); + EXPECT_FALSE(info.features.ssbs); + EXPECT_FALSE(info.features.sb); + EXPECT_FALSE(info.features.paca); + EXPECT_FALSE(info.features.pacg); + EXPECT_FALSE(info.features.dcpodp); + EXPECT_FALSE(info.features.sve2); + EXPECT_FALSE(info.features.sveaes); + EXPECT_FALSE(info.features.svepmull); + EXPECT_FALSE(info.features.svebitperm); + EXPECT_FALSE(info.features.svesha3); + EXPECT_FALSE(info.features.svesm4); + EXPECT_FALSE(info.features.flagm2); + EXPECT_FALSE(info.features.frint); + EXPECT_FALSE(info.features.svei8mm); + EXPECT_FALSE(info.features.svef32mm); + EXPECT_FALSE(info.features.svef64mm); + EXPECT_FALSE(info.features.svebf16); + EXPECT_FALSE(info.features.i8mm); + EXPECT_FALSE(info.features.bf16); + EXPECT_FALSE(info.features.dgh); + EXPECT_FALSE(info.features.rng); + EXPECT_FALSE(info.features.bti); + EXPECT_FALSE(info.features.mte); + EXPECT_FALSE(info.features.ecv); + EXPECT_FALSE(info.features.afp); + EXPECT_FALSE(info.features.rpres); +} +#endif // CPU_FEATURES_OS_LINUX + +#if defined(CPU_FEATURES_OS_WINDOWS) +TEST_F(CpuidAarch64Test, WINDOWS_AARCH64_RPI4) { + cpu().SetWindowsNativeSystemInfoProcessorRevision(0x03); + cpu().SetWindowsIsProcessorFeaturePresent(PF_ARM_VFP_32_REGISTERS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent( + PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE); + + const auto info = GetAarch64Info(); + + EXPECT_EQ(info.revision, 0x03); + EXPECT_TRUE(info.features.fp); + EXPECT_TRUE(info.features.asimd); + EXPECT_TRUE(info.features.crc32); + EXPECT_FALSE(info.features.aes); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.atomics); + EXPECT_FALSE(info.features.asimddp); + EXPECT_FALSE(info.features.jscvt); + EXPECT_FALSE(info.features.lrcpc); +} +#endif // CPU_FEATURES_OS_WINDOWS + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_arm_test.cc b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_arm_test.cc new file mode 100644 index 00000000..745b2af3 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_arm_test.cc @@ -0,0 +1,384 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpuinfo_arm.h" + +#include "filesystem_for_testing.h" +#include "gtest/gtest.h" +#include "hwcaps_for_testing.h" + +namespace cpu_features { +namespace { + +TEST(CpuinfoArmTest, ArmFeaturesEnum) { + const char *last_name = GetArmFeaturesEnumName(ARM_LAST_); + EXPECT_STREQ(last_name, "unknown_feature"); + for (int i = static_cast(ARM_SWP); i != static_cast(ARM_LAST_); ++i) { + const auto feature = static_cast(i); + const char *name = GetArmFeaturesEnumName(feature); + ASSERT_FALSE(name == nullptr); + EXPECT_STRNE(name, ""); + EXPECT_STRNE(name, last_name); + } +} + +TEST(CpuinfoArmTest, FromHardwareCap) { + ResetHwcaps(); + SetHardwareCapabilities(ARM_HWCAP_NEON, ARM_HWCAP2_AES | ARM_HWCAP2_CRC32); + GetEmptyFilesystem(); // disabling /proc/cpuinfo + const auto info = GetArmInfo(); + EXPECT_TRUE(info.features.vfp); // triggered by vfpv3 + EXPECT_TRUE(info.features.vfpv3); // triggered by neon + EXPECT_TRUE(info.features.neon); + EXPECT_TRUE(info.features.aes); + EXPECT_TRUE(info.features.crc32); + + EXPECT_FALSE(info.features.vfpv4); + EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); + EXPECT_FALSE(info.features.vfpv3d16); + EXPECT_FALSE(info.features.idiva); + EXPECT_FALSE(info.features.idivt); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + + // check some random features with EnumValue(): + EXPECT_TRUE(GetArmFeaturesEnumValue(&info.features, ARM_VFP)); + EXPECT_FALSE(GetArmFeaturesEnumValue(&info.features, ARM_VFPV4)); + // out of bound EnumValue() check + EXPECT_FALSE(GetArmFeaturesEnumValue(&info.features, (ArmFeaturesEnum)~0x0)); +} + +TEST(CpuinfoArmTest, ODroidFromCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(processor : 0 +model name : ARMv7 Processor rev 3 (v71) +BogoMIPS : 120.00 +Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x2 +CPU part : 0xc0f +CPU revision : 3)"); + const auto info = GetArmInfo(); + EXPECT_EQ(info.implementer, 0x41); + EXPECT_EQ(info.variant, 0x2); + EXPECT_EQ(info.part, 0xc0f); + EXPECT_EQ(info.revision, 3); + EXPECT_EQ(info.architecture, 7); + + EXPECT_FALSE(info.features.swp); + EXPECT_TRUE(info.features.half); + EXPECT_TRUE(info.features.thumb); + EXPECT_FALSE(info.features._26bit); + EXPECT_TRUE(info.features.fastmult); + EXPECT_FALSE(info.features.fpa); + EXPECT_TRUE(info.features.vfp); + EXPECT_TRUE(info.features.edsp); + EXPECT_FALSE(info.features.java); + EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); + EXPECT_TRUE(info.features.neon); + EXPECT_TRUE(info.features.vfpv3); + EXPECT_FALSE(info.features.vfpv3d16); + EXPECT_TRUE(info.features.tls); + EXPECT_TRUE(info.features.vfpv4); + EXPECT_TRUE(info.features.idiva); + EXPECT_TRUE(info.features.idivt); + EXPECT_TRUE(info.features.vfpd32); + EXPECT_TRUE(info.features.lpae); + EXPECT_FALSE(info.features.evtstrm); + EXPECT_FALSE(info.features.aes); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_FALSE(info.features.crc32); +} + +// Linux test-case +TEST(CpuinfoArmTest, RaspberryPiZeroFromCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(processor : 0 +model name : ARMv6-compatible processor rev 7 (v6l) +BogoMIPS : 697.95 +Features : half thumb fastmult vfp edsp java tls +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x0 +CPU part : 0xb76 +CPU revision : 7 + +Hardware : BCM2835 +Revision : 9000c1 +Serial : 000000006cd946f3)"); + const auto info = GetArmInfo(); + EXPECT_EQ(info.implementer, 0x41); + EXPECT_EQ(info.variant, 0x0); + EXPECT_EQ(info.part, 0xb76); + EXPECT_EQ(info.revision, 7); + EXPECT_EQ(info.architecture, 6); + + EXPECT_FALSE(info.features.swp); + EXPECT_TRUE(info.features.half); + EXPECT_TRUE(info.features.thumb); + EXPECT_FALSE(info.features._26bit); + EXPECT_TRUE(info.features.fastmult); + EXPECT_FALSE(info.features.fpa); + EXPECT_TRUE(info.features.vfp); + EXPECT_TRUE(info.features.edsp); + EXPECT_TRUE(info.features.java); + EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); + EXPECT_FALSE(info.features.neon); + EXPECT_FALSE(info.features.vfpv3); + EXPECT_FALSE(info.features.vfpv3d16); + EXPECT_TRUE(info.features.tls); + EXPECT_FALSE(info.features.vfpv4); + EXPECT_FALSE(info.features.idiva); + EXPECT_FALSE(info.features.idivt); + EXPECT_FALSE(info.features.vfpd32); + EXPECT_FALSE(info.features.lpae); + EXPECT_FALSE(info.features.evtstrm); + EXPECT_FALSE(info.features.aes); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_FALSE(info.features.crc32); +} + +TEST(CpuinfoArmTest, MarvellArmadaFromCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(processor : 0 +model name : ARMv7 Processor rev 1 (v7l) +BogoMIPS : 50.00 +Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32 +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x4 +CPU part : 0xc09 +CPU revision : 1 + +processor : 1 +model name : ARMv7 Processor rev 1 (v7l) +BogoMIPS : 50.00 +Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32 +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x4 +CPU part : 0xc09 +CPU revision : 1 + +Hardware : Marvell Armada 380/385 (Device Tree) +Revision : 0000 +Serial : 0000000000000000)"); + const auto info = GetArmInfo(); + EXPECT_EQ(info.implementer, 0x41); + EXPECT_EQ(info.variant, 0x4); + EXPECT_EQ(info.part, 0xc09); + EXPECT_EQ(info.revision, 1); + EXPECT_EQ(info.architecture, 7); + + EXPECT_FALSE(info.features.swp); + EXPECT_TRUE(info.features.half); + EXPECT_TRUE(info.features.thumb); + EXPECT_FALSE(info.features._26bit); + EXPECT_TRUE(info.features.fastmult); + EXPECT_FALSE(info.features.fpa); + EXPECT_TRUE(info.features.vfp); + EXPECT_TRUE(info.features.edsp); + EXPECT_FALSE(info.features.java); + EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); + EXPECT_TRUE(info.features.neon); + EXPECT_TRUE(info.features.vfpv3); + EXPECT_FALSE(info.features.vfpv3d16); + EXPECT_TRUE(info.features.tls); + EXPECT_FALSE(info.features.vfpv4); + EXPECT_FALSE(info.features.idiva); + EXPECT_FALSE(info.features.idivt); + EXPECT_TRUE(info.features.vfpd32); + EXPECT_FALSE(info.features.lpae); + EXPECT_FALSE(info.features.evtstrm); + EXPECT_FALSE(info.features.aes); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_FALSE(info.features.crc32); +} + +// Android test-case +// http://code.google.com/p/android/issues/detail?id=10812 +TEST(CpuinfoArmTest, InvalidArmv7) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(Processor : ARMv6-compatible processor rev 6 (v6l) +BogoMIPS : 199.47 +Features : swp half thumb fastmult vfp edsp java +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x0 +CPU part : 0xb76 +CPU revision : 6 + +Hardware : SPICA +Revision : 0020 +Serial : 33323613546d00ec )"); + const auto info = GetArmInfo(); + EXPECT_EQ(info.architecture, 6); + + EXPECT_TRUE(info.features.swp); + EXPECT_TRUE(info.features.half); + EXPECT_TRUE(info.features.thumb); + EXPECT_FALSE(info.features._26bit); + EXPECT_TRUE(info.features.fastmult); + EXPECT_FALSE(info.features.fpa); + EXPECT_TRUE(info.features.vfp); + EXPECT_TRUE(info.features.edsp); + EXPECT_TRUE(info.features.java); + EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); + EXPECT_FALSE(info.features.neon); + EXPECT_FALSE(info.features.vfpv3); + EXPECT_FALSE(info.features.vfpv3d16); + EXPECT_FALSE(info.features.tls); + EXPECT_FALSE(info.features.vfpv4); + EXPECT_FALSE(info.features.idiva); + EXPECT_FALSE(info.features.idivt); + EXPECT_FALSE(info.features.vfpd32); + EXPECT_FALSE(info.features.lpae); + EXPECT_FALSE(info.features.evtstrm); + EXPECT_FALSE(info.features.aes); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_FALSE(info.features.crc32); +} + +// Android test-case +// https://crbug.com/341598. +TEST(CpuinfoArmTest, InvalidNeon) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(Processor: ARMv7 Processory rev 0 (v71) +processor: 0 +BogoMIPS: 13.50 + +Processor: 1 +BogoMIPS: 13.50 + +Features: swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt +CPU implementer : 0x51 +CPU architecture: 7 +CPU variant: 0x1 +CPU part: 0x04d +CPU revision: 0 + +Hardware: SAMSUNG M2 +Revision: 0010 +Serial: 00001e030000354e)"); + const auto info = GetArmInfo(); + EXPECT_TRUE(info.features.swp); + EXPECT_FALSE(info.features.neon); +} + +// The Nexus 4 (Qualcomm Krait) kernel configuration forgets to report IDIV +// support. +TEST(CpuinfoArmTest, Nexus4_0x510006f2) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(CPU implementer : 0x51 +CPU architecture: 7 +CPU variant : 0x0 +CPU part : 0x6f +CPU revision : 2)"); + const auto info = GetArmInfo(); + EXPECT_TRUE(info.features.idiva); + EXPECT_TRUE(info.features.idivt); + + EXPECT_EQ(GetArmCpuId(&info), 0x510006f2); +} + +// The Nexus 4 (Qualcomm Krait) kernel configuration forgets to report IDIV +// support. +TEST(CpuinfoArmTest, Nexus4_0x510006f3) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(CPU implementer : 0x51 +CPU architecture: 7 +CPU variant : 0x0 +CPU part : 0x6f +CPU revision : 3)"); + const auto info = GetArmInfo(); + EXPECT_TRUE(info.features.idiva); + EXPECT_TRUE(info.features.idivt); + + EXPECT_EQ(GetArmCpuId(&info), 0x510006f3); +} + +// The 2013 Nexus 7 (Qualcomm Krait) kernel configuration forgets to report IDIV +// support. +TEST(CpuinfoArmTest, Nexus7_2013_0x511006f0) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(CPU implementer : 0x51 +CPU architecture: 7 +CPU variant : 0x1 +CPU part : 0x06f +CPU revision : 0)"); + const auto info = GetArmInfo(); + EXPECT_TRUE(info.features.idiva); + EXPECT_TRUE(info.features.idivt); + + EXPECT_EQ(GetArmCpuId(&info), 0x511006f0); +} + +// The emulator-specific Android 4.2 kernel fails to report support for the +// 32-bit ARM IDIV instruction. Technically, this is a feature of the virtual +// CPU implemented by the emulator. +TEST(CpuinfoArmTest, EmulatorSpecificIdiv) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(Processor : ARMv7 Processor rev 0 (v7l) +BogoMIPS : 629.14 +Features : swp half thumb fastmult vfp edsp neon vfpv3 +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x0 +CPU part : 0xc08 +CPU revision : 0 + +Hardware : Goldfish +Revision : 0000 +Serial : 0000000000000000)"); + const auto info = GetArmInfo(); + EXPECT_TRUE(info.features.idiva); +} + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_mips_test.cc b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_mips_test.cc new file mode 100644 index 00000000..02ca6c98 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_mips_test.cc @@ -0,0 +1,176 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpuinfo_mips.h" + +#include "filesystem_for_testing.h" +#include "gtest/gtest.h" +#include "hwcaps_for_testing.h" +#include "internal/stack_line_reader.h" +#include "internal/string_view.h" + +namespace cpu_features { + +namespace { + +TEST(CpuinfoMipsTest, MipsFeaturesEnum) { + const char *last_name = GetMipsFeaturesEnumName(MIPS_LAST_); + EXPECT_STREQ(last_name, "unknown_feature"); + for (int i = static_cast(MIPS_MSA); i != static_cast(MIPS_LAST_); ++i) { + const auto feature = static_cast(i); + const char *name = GetMipsFeaturesEnumName(feature); + ASSERT_FALSE(name == nullptr); + EXPECT_STRNE(name, ""); + EXPECT_STRNE(name, last_name); + } +} + +TEST(CpuinfoMipsTest, FromHardwareCapBoth) { + ResetHwcaps(); + SetHardwareCapabilities(MIPS_HWCAP_MSA | MIPS_HWCAP_R6, 0); + GetEmptyFilesystem(); // disabling /proc/cpuinfo + const auto info = GetMipsInfo(); + EXPECT_TRUE(info.features.msa); + EXPECT_FALSE(info.features.eva); + EXPECT_TRUE(info.features.r6); +} + +TEST(CpuinfoMipsTest, FromHardwareCapOnlyOne) { + ResetHwcaps(); + SetHardwareCapabilities(MIPS_HWCAP_MSA, 0); + GetEmptyFilesystem(); // disabling /proc/cpuinfo + const auto info = GetMipsInfo(); + EXPECT_TRUE(info.features.msa); + EXPECT_FALSE(info.features.eva); +} + +TEST(CpuinfoMipsTest, Ci40) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(system type : IMG Pistachio SoC (B0) +machine : IMG Marduk – Ci40 with cc2520 +processor : 0 +cpu model : MIPS interAptiv (multi) V2.0 FPU V0.0 +BogoMIPS : 363.72 +wait instruction : yes +microsecond timers : yes +tlb_entries : 64 +extra interrupt vector : yes +hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb] +isa : mips1 mips2 mips32r1 mips32r2 +ASEs implemented : mips16 dsp mt eva +shadow register sets : 1 +kscratch registers : 0 +package : 0 +core : 0 +VCED exceptions : not available +VCEI exceptions : not available +VPE : 0 +)"); + const auto info = GetMipsInfo(); + EXPECT_FALSE(info.features.msa); + EXPECT_TRUE(info.features.eva); + EXPECT_FALSE(info.features.r6); + EXPECT_TRUE(info.features.mips16); + EXPECT_FALSE(info.features.mdmx); + EXPECT_FALSE(info.features.mips3d); + EXPECT_FALSE(info.features.smart); + EXPECT_TRUE(info.features.dsp); +} + +TEST(CpuinfoMipsTest, AR7161) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(system type : Atheros AR7161 rev 2 +machine : NETGEAR WNDR3700/WNDR3800/WNDRMAC +processor : 0 +cpu model : MIPS 24Kc V7.4 +BogoMIPS : 452.19 +wait instruction : yes +microsecond timers : yes +tlb_entries : 16 +extra interrupt vector : yes +hardware watchpoint : yes, count: 4, address/irw mask: [0x0000, 0x0f98, 0x0f78, 0x0df8] +ASEs implemented : mips16 +shadow register sets : 1 +kscratch registers : 0 +core : 0 +VCED exceptions : not available +VCEI exceptions : not available +)"); + const auto info = GetMipsInfo(); + EXPECT_FALSE(info.features.msa); + EXPECT_FALSE(info.features.eva); + EXPECT_TRUE(info.features.mips16); +} + +TEST(CpuinfoMipsTest, Goldfish) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(system type : MIPS-Goldfish +Hardware : goldfish +Revison : 1 +processor : 0 +cpu model : MIPS 24Kc V0.0 FPU V0.0 +BogoMIPS : 1042.02 +wait instruction : yes +microsecond timers : yes +tlb_entries : 16 +extra interrupt vector : yes +hardware watchpoint : yes, count: 1, address/irw mask: [0x0ff8] +ASEs implemented : +shadow register sets : 1 +core : 0 +VCED exceptions : not available +VCEI exceptions : not available +)"); + const auto info = GetMipsInfo(); + EXPECT_FALSE(info.features.msa); + EXPECT_FALSE(info.features.eva); +} + +TEST(CpuinfoMipsTest, BCM1250) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(system type : SiByte BCM91250A (SWARM) +processor : 0 +cpu model : SiByte SB1 V0.2 FPU V0.2 +BogoMIPS : 532.48 +wait instruction : no +microsecond timers : yes +tlb_entries : 64 +extra interrupt vector : yes +hardware watchpoint : yes, count: 1, address/irw mask: [0x0ff8] +isa : mips1 mips2 mips3 mips4 mips5 mips32r1 mips32r2 mips64r1 mips64r2 +ASEs implemented : mdmx mips3d +shadow register sets : 1 +kscratch registers : 0 +package : 0 +core : 0 +VCED exceptions : not available +VCEI exceptions : not available +)"); + const auto info = GetMipsInfo(); + EXPECT_FALSE(info.features.msa); + EXPECT_FALSE(info.features.eva); + EXPECT_FALSE(info.features.mips16); + EXPECT_TRUE(info.features.mdmx); + EXPECT_TRUE(info.features.mips3d); + EXPECT_FALSE(info.features.smart); + EXPECT_FALSE(info.features.dsp); +} + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_ppc_test.cc b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_ppc_test.cc new file mode 100644 index 00000000..fc8d2885 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_ppc_test.cc @@ -0,0 +1,131 @@ +// Copyright 2018 IBM. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpuinfo_ppc.h" + +#include "filesystem_for_testing.h" +#include "gtest/gtest.h" +#include "hwcaps_for_testing.h" +#include "internal/string_view.h" + +namespace cpu_features { +namespace { + +TEST(CpustringsPPCTest, PPCFeaturesEnum) { + const char *last_name = GetPPCFeaturesEnumName(PPC_LAST_); + EXPECT_STREQ(last_name, "unknown_feature"); + for (int i = static_cast(PPC_32); i != static_cast(PPC_LAST_); ++i) { + const auto feature = static_cast(i); + const char *name = GetPPCFeaturesEnumName(feature); + ASSERT_FALSE(name == nullptr); + EXPECT_STRNE(name, ""); + EXPECT_STRNE(name, last_name); + } +} + +TEST(CpustringsPPCTest, FromHardwareCap) { + ResetHwcaps(); + SetHardwareCapabilities(PPC_FEATURE_HAS_FPU | PPC_FEATURE_HAS_VSX, + PPC_FEATURE2_ARCH_3_00); + GetEmptyFilesystem(); // disabling /proc/cpuinfo + const auto info = GetPPCInfo(); + EXPECT_TRUE(info.features.fpu); + EXPECT_FALSE(info.features.mmu); + EXPECT_TRUE(info.features.vsx); + EXPECT_TRUE(info.features.arch300); + EXPECT_FALSE(info.features.power4); + EXPECT_FALSE(info.features.altivec); + EXPECT_FALSE(info.features.vcrypto); + EXPECT_FALSE(info.features.htm); +} + +TEST(CpustringsPPCTest, Blade) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(processor : 14 +cpu : POWER7 (architected), altivec supported +clock : 3000.000000MHz +revision : 2.1 (pvr 003f 0201) + +processor : 15 +cpu : POWER7 (architected), altivec supported +clock : 3000.000000MHz +revision : 2.1 (pvr 003f 0201) + +timebase : 512000000 +platform : pSeries +model : IBM,8406-70Y +machine : CHRP IBM,8406-70Y)"); + SetPlatformPointer("power7"); + SetBasePlatformPointer("power8"); + const auto strings = GetPPCPlatformStrings(); + ASSERT_STREQ(strings.platform, "pSeries"); + ASSERT_STREQ(strings.model, "IBM,8406-70Y"); + ASSERT_STREQ(strings.machine, "CHRP IBM,8406-70Y"); + ASSERT_STREQ(strings.cpu, "POWER7 (architected), altivec supported"); + ASSERT_STREQ(strings.type.platform, "power7"); + ASSERT_STREQ(strings.type.base_platform, "power8"); +} + +TEST(CpustringsPPCTest, Firestone) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(processor : 126 +cpu : POWER8 (raw), altivec supported +clock : 2061.000000MHz +revision : 2.0 (pvr 004d 0200) + +processor : 127 +cpu : POWER8 (raw), altivec supported +clock : 2061.000000MHz +revision : 2.0 (pvr 004d 0200) + +timebase : 512000000 +platform : PowerNV +model : 8335-GTA +machine : PowerNV 8335-GTA +firmware : OPAL v3)"); + const auto strings = GetPPCPlatformStrings(); + ASSERT_STREQ(strings.platform, "PowerNV"); + ASSERT_STREQ(strings.model, "8335-GTA"); + ASSERT_STREQ(strings.machine, "PowerNV 8335-GTA"); + ASSERT_STREQ(strings.cpu, "POWER8 (raw), altivec supported"); +} + +TEST(CpustringsPPCTest, w8) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(processor : 143 +cpu : POWER9, altivec supported +clock : 2300.000000MHz +revision : 2.2 (pvr 004e 1202) + +timebase : 512000000 +platform : PowerNV +model : 0000000000000000 +machine : PowerNV 0000000000000000 +firmware : OPAL +MMU : Radix)"); + const auto strings = GetPPCPlatformStrings(); + ASSERT_STREQ(strings.platform, "PowerNV"); + ASSERT_STREQ(strings.model, "0000000000000000"); + ASSERT_STREQ(strings.machine, "PowerNV 0000000000000000"); + ASSERT_STREQ(strings.cpu, "POWER9, altivec supported"); +} + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_riscv_test.cc b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_riscv_test.cc new file mode 100644 index 00000000..2ffe2b35 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_riscv_test.cc @@ -0,0 +1,180 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpuinfo_riscv.h" + +#include "filesystem_for_testing.h" +#include "gtest/gtest.h" +#include "hwcaps_for_testing.h" + +namespace cpu_features { +namespace { + +TEST(CpuinfoRiscvTest, Sipeed_Lichee_RV_FromCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(processor : 0 +hart : 0 +isa : rv64imafdc +mmu : sv39 +uarch : thead,c906)"); + const auto info = GetRiscvInfo(); + EXPECT_STREQ(info.uarch, "c906"); + EXPECT_STREQ(info.vendor, "thead"); + + EXPECT_FALSE(info.features.RV32I); + EXPECT_TRUE(info.features.RV64I); + EXPECT_TRUE(info.features.M); + EXPECT_TRUE(info.features.A); + EXPECT_TRUE(info.features.F); + EXPECT_TRUE(info.features.D); + EXPECT_FALSE(info.features.Q); + EXPECT_TRUE(info.features.C); + EXPECT_FALSE(info.features.V); +} + +// https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/Kendryte-K510-4.17.0.cpuinfo +TEST(CpuinfoRiscvTest, Kendryte_K510_FromCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"( +hart : 0 +isa : rv64i2p0m2p0a2p0f2p0d2p0c2p0xv5-0p0 +mmu : sv39 + +hart : 1 +isa : rv64i2p0m2p0a2p0f2p0d2p0c2p0xv5-0p0 +mmu : sv39"); + const auto info = GetRiscvInfo(); + EXPECT_STREQ(info.uarch, ""); + EXPECT_STREQ(info.vendor, ""); + + EXPECT_FALSE(info.features.RV32I); + EXPECT_TRUE(info.features.RV64I); + EXPECT_TRUE(info.features.M); + EXPECT_TRUE(info.features.A); + EXPECT_TRUE(info.features.F); + EXPECT_TRUE(info.features.D); + EXPECT_FALSE(info.features.Q); + EXPECT_TRUE(info.features.C); + EXPECT_FALSE(info.features.V); +} + +// https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/T-Head-C910-5.10.4.cpuinfo +TEST(CpuinfoRiscvTest, T_Head_C910_FromCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"( +processor : 0 +hart : 0 +isa : rv64imafdcsu +mmu : sv39 +cpu-freq : 1.2Ghz +cpu-icache : 64KB +cpu-dcache : 64KB +cpu-l2cache : 2MB +cpu-tlb : 1024 4-ways +cpu-cacheline : 64Bytes +cpu-vector : 0.7.1 + +processor : 1 +hart : 1 +isa : rv64imafdcsu +mmu : sv39 +cpu-freq : 1.2Ghz +cpu-icache : 64KB +cpu-dcache : 64KB +cpu-l2cache : 2MB +cpu-tlb : 1024 4-ways +cpu-cacheline : 64Bytes +cpu-vector : 0.7.1"); + const auto info = GetRiscvInfo(); + EXPECT_STREQ(info.uarch, ""); + EXPECT_STREQ(info.vendor, ""); + + EXPECT_FALSE(info.features.RV32I); + EXPECT_TRUE(info.features.RV64I); + EXPECT_TRUE(info.features.M); + EXPECT_TRUE(info.features.A); + EXPECT_TRUE(info.features.F); + EXPECT_TRUE(info.features.D); + EXPECT_FALSE(info.features.Q); + EXPECT_TRUE(info.features.C); + EXPECT_FALSE(info.features.V); +} + +TEST(CpuinfoRiscvTest, UnknownFromCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"( +processor : 0 +hart : 2 +isa : rv64imafdc +mmu : sv39 +uarch : sifive,bullet0 + +processor : 1 +hart : 1 +isa : rv64imafdc +mmu : sv39 +uarch : sifive,bullet0 + +processor : 2 +hart : 3 +isa : rv64imafdc +mmu : sv39 +uarch : sifive,bullet0 + +processor : 3 +hart : 4 +isa : rv64imafdc +mmu : sv39 +uarch : sifive,bullet0)"); + const auto info = GetRiscvInfo(); + EXPECT_STREQ(info.uarch, "bullet0"); + EXPECT_STREQ(info.vendor, "sifive"); + + EXPECT_FALSE(info.features.RV32I); + EXPECT_TRUE(info.features.RV64I); + EXPECT_TRUE(info.features.M); + EXPECT_TRUE(info.features.A); + EXPECT_TRUE(info.features.F); + EXPECT_TRUE(info.features.D); + EXPECT_FALSE(info.features.Q); + EXPECT_TRUE(info.features.C); + EXPECT_FALSE(info.features.V); +} + +TEST(CpuinfoRiscvTest, QemuCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"( +processor : 0 +hart : 0 +isa : rv64imafdcvh_zba_zbb_zbc_zbs +mmu : sv48)"); + const auto info = GetRiscvInfo(); + EXPECT_FALSE(info.features.RV32I); + EXPECT_TRUE(info.features.RV64I); + EXPECT_TRUE(info.features.M); + EXPECT_TRUE(info.features.A); + EXPECT_TRUE(info.features.F); + EXPECT_TRUE(info.features.D); + EXPECT_FALSE(info.features.Q); + EXPECT_TRUE(info.features.C); + EXPECT_TRUE(info.features.V); +} + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_s390x_test.cc b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_s390x_test.cc new file mode 100644 index 00000000..800d3e99 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_s390x_test.cc @@ -0,0 +1,82 @@ +// Copyright 2022 IBM. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpuinfo_s390x.h" +#include "filesystem_for_testing.h" +#include "gtest/gtest.h" +#include "hwcaps_for_testing.h" + +namespace cpu_features { +namespace { + +TEST(CpustringsS390XTest, S390XFeaturesEnum) { + const char *last_name = GetS390XFeaturesEnumName(S390X_LAST_); + EXPECT_STREQ(last_name, "unknown_feature"); + for (int i = static_cast(S390_ZARCH); i != static_cast(S390X_LAST_); ++i) { + const auto feature = static_cast(i); + const char *name = GetS390XFeaturesEnumName(feature); + ASSERT_FALSE(name == nullptr); + EXPECT_STRNE(name, ""); + EXPECT_STRNE(name, last_name); + } +} + +TEST(CpustringsS390XTest, FromHardwareCap) { + ResetHwcaps(); + SetHardwareCapabilities(HWCAP_S390_ESAN3 | HWCAP_S390_HPAGE | + HWCAP_S390_NNPA | HWCAP_S390_SIE, 0); + GetEmptyFilesystem(); // disabling /proc/cpuinfo + const auto info = GetS390XInfo(); + EXPECT_TRUE(info.features.esan3); + EXPECT_TRUE(info.features.edat); + EXPECT_TRUE(info.features.nnpa); + EXPECT_TRUE(info.features.sie); + EXPECT_FALSE(info.features.msa); + EXPECT_FALSE(info.features.stfle); + EXPECT_FALSE(info.features.vxp2); + EXPECT_FALSE(info.features.pcimio); +} + +TEST(CpustringsS390XTest, z16) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(vendor_id : IBM/S390 +# processors : 24 +bogomips per cpu: 26315.00 +max thread id : 1 +features : esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te vx vxd vxe gs vxe2 vxp sort dflt vxp2 nnpa pcimio sie )"); + SetPlatformPointer("z16"); + const auto strings = GetS390XPlatformStrings(); + EXPECT_EQ(strings.num_processors, 24); + ASSERT_STREQ(strings.type.platform, "z16"); +} + +TEST(CpustringsS390XTest, z15) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", + R"(vendor_id : IBM/S390 +# processors : 2 +bogomips per cpu: 24038.00 +max thread id : 1 +features : esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te vx vxd vxe gs vxe2 vxp sort dflt sie)"); + SetPlatformPointer("z15"); + const auto strings = GetS390XPlatformStrings(); + EXPECT_EQ(strings.num_processors, 2); + ASSERT_STREQ(strings.type.platform, "z15"); +} + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_x86_test.cc b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_x86_test.cc new file mode 100644 index 00000000..de271cc5 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_x86_test.cc @@ -0,0 +1,1729 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "cpuinfo_x86.h" + +#include +#include +#include +#include +#if defined(CPU_FEATURES_OS_WINDOWS) +#include "internal/windows_utils.h" +#endif // CPU_FEATURES_OS_WINDOWS + +#include "filesystem_for_testing.h" +#include "gtest/gtest.h" +#include "internal/cpuid_x86.h" + +namespace cpu_features { + +class FakeCpu { + public: + Leaf GetCpuidLeaf(uint32_t leaf_id, int ecx) const { + const auto itr = cpuid_leaves_.find(std::make_pair(leaf_id, ecx)); + if (itr != cpuid_leaves_.end()) { + return itr->second; + } + return {0, 0, 0, 0}; + } + + uint32_t GetXCR0Eax() const { return xcr0_eax_; } + + void SetLeaves(std::map, Leaf> configuration) { + cpuid_leaves_ = std::move(configuration); + } + + void SetOsBackupsExtendedRegisters(bool os_backups_extended_registers) { + xcr0_eax_ = os_backups_extended_registers ? -1 : 0; + } + +#if defined(CPU_FEATURES_OS_MACOS) + bool GetDarwinSysCtlByName(std::string name) const { + return darwin_sysctlbyname_.count(name); + } + + void SetDarwinSysCtlByName(std::string name) { + darwin_sysctlbyname_.insert(name); + } +#endif // CPU_FEATURES_OS_MACOS + +#if defined(CPU_FEATURES_OS_WINDOWS) + bool GetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature) { + return windows_isprocessorfeaturepresent_.count(ProcessorFeature); + } + + void SetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature) { + windows_isprocessorfeaturepresent_.insert(ProcessorFeature); + } +#endif // CPU_FEATURES_OS_WINDOWS + + private: + std::map, Leaf> cpuid_leaves_; +#if defined(CPU_FEATURES_OS_MACOS) + std::set darwin_sysctlbyname_; +#endif // CPU_FEATURES_OS_MACOS +#if defined(CPU_FEATURES_OS_WINDOWS) + std::set windows_isprocessorfeaturepresent_; +#endif // CPU_FEATURES_OS_WINDOWS + uint32_t xcr0_eax_; +}; + +static FakeCpu* g_fake_cpu_instance = nullptr; + +static FakeCpu& cpu() { + assert(g_fake_cpu_instance != nullptr); + return *g_fake_cpu_instance; +} + +extern "C" Leaf GetCpuidLeaf(uint32_t leaf_id, int ecx) { + return cpu().GetCpuidLeaf(leaf_id, ecx); +} + +extern "C" uint32_t GetXCR0Eax(void) { return cpu().GetXCR0Eax(); } + +#if defined(CPU_FEATURES_OS_MACOS) +extern "C" bool GetDarwinSysCtlByName(const char* name) { + return cpu().GetDarwinSysCtlByName(name); +} +#endif // CPU_FEATURES_OS_MACOS + +#if defined(CPU_FEATURES_OS_WINDOWS) +extern "C" bool GetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature) { + return cpu().GetWindowsIsProcessorFeaturePresent(ProcessorFeature); +} +#endif // CPU_FEATURES_OS_WINDOWS + +namespace { + +class CpuidX86Test : public ::testing::Test { + protected: + void SetUp() override { + assert(g_fake_cpu_instance == nullptr); + g_fake_cpu_instance = new FakeCpu(); + } + void TearDown() override { + delete g_fake_cpu_instance; + g_fake_cpu_instance = nullptr; + } +}; + +TEST_F(CpuidX86Test, X86MicroarchitectureEnum) { + const char *last_name = GetX86MicroarchitectureName(X86_MICROARCHITECTURE_LAST_); + EXPECT_STREQ(last_name, "unknown microarchitecture"); + for (int i = static_cast(X86_UNKNOWN); i != static_cast(X86_MICROARCHITECTURE_LAST_); ++i) { + const auto micro = static_cast(i); + const char *name = GetX86MicroarchitectureName(micro); + ASSERT_FALSE(name == nullptr); + EXPECT_STRNE(name, ""); + EXPECT_STRNE(name, last_name); + } +} + +TEST_F(CpuidX86Test, X86FeaturesEnum) { + const char *last_name = GetX86FeaturesEnumName(X86_LAST_); + EXPECT_STREQ(last_name, "unknown_feature"); + for (int i = static_cast(X86_FPU); i != static_cast(X86_LAST_); ++i) { + const auto feature = static_cast(i); + const char *name = GetX86FeaturesEnumName(feature); + ASSERT_FALSE(name == nullptr); + EXPECT_STRNE(name, ""); + EXPECT_STRNE(name, last_name); + } +} + +TEST_F(CpuidX86Test, SandyBridge) { + cpu().SetOsBackupsExtendedRegisters(true); + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000206A6, 0x00100800, 0x1F9AE3BF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + }); + const auto info = GetX86Info(); + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x02A); + EXPECT_EQ(info.stepping, 0x06); + // Leaf 7 is zeroed out so none of the Leaf 7 flags are set. + const auto features = info.features; + EXPECT_FALSE(features.erms); + EXPECT_FALSE(features.avx2); + EXPECT_FALSE(features.avx512f); + EXPECT_FALSE(features.avx512cd); + EXPECT_FALSE(features.avx512er); + EXPECT_FALSE(features.avx512pf); + EXPECT_FALSE(features.avx512bw); + EXPECT_FALSE(features.avx512dq); + EXPECT_FALSE(features.avx512vl); + EXPECT_FALSE(features.avx512ifma); + EXPECT_FALSE(features.avx512vbmi); + EXPECT_FALSE(features.avx512vbmi2); + EXPECT_FALSE(features.avx512vnni); + EXPECT_FALSE(features.avx512bitalg); + EXPECT_FALSE(features.avx512vpopcntdq); + EXPECT_FALSE(features.avx512_4vnniw); + EXPECT_FALSE(features.avx512_4fmaps); + // All old cpu features should be set. + EXPECT_TRUE(features.aes); + EXPECT_TRUE(features.ssse3); + EXPECT_TRUE(features.sse4_1); + EXPECT_TRUE(features.sse4_2); + EXPECT_TRUE(features.avx); + EXPECT_FALSE(features.sha); + EXPECT_TRUE(features.popcnt); + EXPECT_FALSE(features.movbe); + EXPECT_FALSE(features.rdrnd); + EXPECT_FALSE(features.adx); +} + +const int UNDEF = -1; +const int KiB = 1024; +const int MiB = 1024 * KiB; + +TEST_F(CpuidX86Test, SandyBridgeTestOsSupport) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000206A6, 0x00100800, 0x1F9AE3BF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + }); + // avx is disabled if os does not support backing up ymm registers. + cpu().SetOsBackupsExtendedRegisters(false); + EXPECT_FALSE(GetX86Info().features.avx); + // avx is disabled if os does not support backing up ymm registers. + cpu().SetOsBackupsExtendedRegisters(true); + EXPECT_TRUE(GetX86Info().features.avx); +} + +TEST_F(CpuidX86Test, SkyLake) { + cpu().SetOsBackupsExtendedRegisters(true); + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, + }); + const auto info = GetX86Info(); + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x04E); + EXPECT_EQ(info.stepping, 0x03); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_SKL); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel0050654_SkylakeXeon_CPUID8.txt +TEST_F(CpuidX86Test, SkyLakeXeon) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00050654, 0x00100800, 0x7FFEFBFF, 0xBFEBFBFF}} + }); + const auto info = GetX86Info(); + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x055); + EXPECT_EQ(info.stepping, 0x04); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_SKL); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel0050657_CascadeLakeXeon_CPUID.txt +TEST_F(CpuidX86Test, CascadeLake) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00050657, 0x00400800, 0x7FFEFBFF, 0xBFEBFBFF}} + }); + const auto info = GetX86Info(); + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x055); + EXPECT_EQ(info.stepping, 0x07); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CCL); +} + +TEST_F(CpuidX86Test, Branding) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}}, + {{0x80000002, 0}, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}}, + {{0x80000003, 0}, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}}, + {{0x80000004, 0}, Leaf{0x352E3220, 0x7A484730, 0x00000000, 0x00000000}}, + }); + const auto info = GetX86Info(); + EXPECT_STREQ(info.brand_string, "Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz"); +} + +TEST_F(CpuidX86Test, KabyLakeCache) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000004, 0}, Leaf{0x1C004121, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x00000004, 1}, Leaf{0x1C004122, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x00000004, 2}, Leaf{0x1C004143, 0x00C0003F, 0x000003FF, 0x00000000}}, + {{0x00000004, 3}, Leaf{0x1C03C163, 0x02C0003F, 0x00001FFF, 0x00000002}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}}, + {{0x80000002, 0}, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}}, + {{0x80000003, 0}, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}}, + }); + const auto info = GetX86CacheInfo(); + EXPECT_EQ(info.size, 4); + EXPECT_EQ(info.levels[0].level, 1); + EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA); + EXPECT_EQ(info.levels[0].cache_size, 32 * KiB); + EXPECT_EQ(info.levels[0].ways, 8); + EXPECT_EQ(info.levels[0].line_size, 64); + EXPECT_EQ(info.levels[0].tlb_entries, 64); + EXPECT_EQ(info.levels[0].partitioning, 1); + + EXPECT_EQ(info.levels[1].level, 1); + EXPECT_EQ(info.levels[1].cache_type, + CacheType::CPU_FEATURE_CACHE_INSTRUCTION); + EXPECT_EQ(info.levels[1].cache_size, 32 * KiB); + EXPECT_EQ(info.levels[1].ways, 8); + EXPECT_EQ(info.levels[1].line_size, 64); + EXPECT_EQ(info.levels[1].tlb_entries, 64); + EXPECT_EQ(info.levels[1].partitioning, 1); + + EXPECT_EQ(info.levels[2].level, 2); + EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[2].cache_size, 256 * KiB); + EXPECT_EQ(info.levels[2].ways, 4); + EXPECT_EQ(info.levels[2].line_size, 64); + EXPECT_EQ(info.levels[2].tlb_entries, 1024); + EXPECT_EQ(info.levels[2].partitioning, 1); + + EXPECT_EQ(info.levels[3].level, 3); + EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[3].cache_size, 6 * MiB); + EXPECT_EQ(info.levels[3].ways, 12); + EXPECT_EQ(info.levels[3].line_size, 64); + EXPECT_EQ(info.levels[3].tlb_entries, 8192); + EXPECT_EQ(info.levels[3].partitioning, 1); +} + +TEST_F(CpuidX86Test, HSWCache) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000004, 0}, Leaf{0x1C004121, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x00000004, 1}, Leaf{0x1C004122, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x00000004, 2}, Leaf{0x1C004143, 0x01C0003F, 0x000001FF, 0x00000000}}, + {{0x00000004, 3}, Leaf{0x1C03C163, 0x02C0003F, 0x00001FFF, 0x00000006}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}}, + {{0x80000002, 0}, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}}, + {{0x80000003, 0}, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}}, + }); + const auto info = GetX86CacheInfo(); + EXPECT_EQ(info.size, 4); + EXPECT_EQ(info.levels[0].level, 1); + EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA); + EXPECT_EQ(info.levels[0].cache_size, 32 * KiB); + EXPECT_EQ(info.levels[0].ways, 8); + EXPECT_EQ(info.levels[0].line_size, 64); + EXPECT_EQ(info.levels[0].tlb_entries, 64); + EXPECT_EQ(info.levels[0].partitioning, 1); + + EXPECT_EQ(info.levels[1].level, 1); + EXPECT_EQ(info.levels[1].cache_type, + CacheType::CPU_FEATURE_CACHE_INSTRUCTION); + EXPECT_EQ(info.levels[1].cache_size, 32 * KiB); + EXPECT_EQ(info.levels[1].ways, 8); + EXPECT_EQ(info.levels[1].line_size, 64); + EXPECT_EQ(info.levels[1].tlb_entries, 64); + EXPECT_EQ(info.levels[1].partitioning, 1); + + EXPECT_EQ(info.levels[2].level, 2); + EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[2].cache_size, 256 * KiB); + EXPECT_EQ(info.levels[2].ways, 8); + EXPECT_EQ(info.levels[2].line_size, 64); + EXPECT_EQ(info.levels[2].tlb_entries, 512); + EXPECT_EQ(info.levels[2].partitioning, 1); + + EXPECT_EQ(info.levels[3].level, 3); + EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[3].cache_size, 6 * MiB); + EXPECT_EQ(info.levels[3].ways, 12); + EXPECT_EQ(info.levels[3].line_size, 64); + EXPECT_EQ(info.levels[3].tlb_entries, 8192); + EXPECT_EQ(info.levels[3].partitioning, 1); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0200F30_K11_Griffin_CPUID.txt +TEST_F(CpuidX86Test, AMD_K11_GRIFFIN) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000001, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00200F30, 0x00020800, 0x00002001, 0x178BFBFF}}, + {{0x80000000, 0}, Leaf{0x8000001A, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00200F30, 0x20000000, 0x0000131F, 0xEBD3FBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x11); + EXPECT_EQ(info.model, 0x03); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_K11); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0300F10_K12_Llano_CPUID.txt +TEST_F(CpuidX86Test, AMD_K12_LLANO) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00300F10, 0x00040800, 0x00802009, 0x178BFBFF}}, + {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00300F10, 0x20002B31, 0x000037FF, 0xEFD3FBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x12); + EXPECT_EQ(info.model, 0x01); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_K12); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0500F01_K14_Bobcat_CPUID.txt +TEST_F(CpuidX86Test, AMD_K14_BOBCAT_AMD0500F01) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00500F01, 0x00020800, 0x00802209, 0x178BFBFF}}, + {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00500F01, 0x00000000, 0x000035FF, 0x2FD3FBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x14); + EXPECT_EQ(info.model, 0x00); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_BOBCAT); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0500F10_K14_Bobcat_CPUID.txt +TEST_F(CpuidX86Test, AMD_K14_BOBCAT_AMD0500F10) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00500F10, 0x00020800, 0x00802209, 0x178BFBFF}}, + {{0x00000002, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x00000003, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x00000005, 0}, Leaf{0x00000040, 0x00000040, 0x00000003, 0x00000000}}, + {{0x00000006, 0}, Leaf{0x00000000, 0x00000000, 0x00000001, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00500F10, 0x00001242, 0x000035FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x35332D45, 0x72502030, 0x7365636F}}, + {{0x80000003, 0}, Leaf{0x00726F73, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000004, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000005, 0}, Leaf{0xFF08FF08, 0xFF280000, 0x20080140, 0x20020140}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x14); + EXPECT_EQ(info.model, 0x01); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_BOBCAT); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0500F20_K14_Bobcat_CPUID.txt +TEST_F(CpuidX86Test, AMD_K14_BOBCAT_AMD0500F20) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00500F20, 0x00020800, 0x00802209, 0x178BFBFF}}, + {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00500F20, 0x000012E9, 0x000035FF, 0x2FD3FBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x14); + EXPECT_EQ(info.model, 0x02); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_BOBCAT); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0670F00_K15_StoneyRidge_CPUID.txt +TEST_F(CpuidX86Test, AMD_K15_EXCAVATOR_STONEY_RIDGE) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00670F00, 0x00020800, 0x7ED8320B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x000001A9, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00670F00, 0x00000000, 0x2FABBFFF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x392D3941, 0x20303134, 0x45444152}}, + {{0x80000003, 0}, Leaf{0x52204E4F, 0x35202C35, 0x4D4F4320, 0x45545550}}, + {{0x80000004, 0}, Leaf{0x524F4320, 0x32205345, 0x47332B43, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x15); + EXPECT_EQ(info.model, 0x70); + EXPECT_STREQ(info.brand_string, + "AMD A9-9410 RADEON R5, 5 COMPUTE CORES 2C+3G "); + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::AMD_EXCAVATOR); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0600F20_K15_AbuDhabi_CPUID0.txt +TEST_F(CpuidX86Test, AMD_K15_PILEDRIVER_ABU_DHABI) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00600F20, 0x00100800, 0x3E98320B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00600F20, 0x30000000, 0x01EBBFFF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x6574704F, 0x286E6F72, 0x20296D74}}, + {{0x80000003, 0}, Leaf{0x636F7250, 0x6F737365, 0x33362072, 0x20203637}}, + {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x15); + EXPECT_EQ(info.model, 0x02); + EXPECT_STREQ(info.brand_string, + "AMD Opteron(tm) Processor 6376 "); + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::AMD_PILEDRIVER); + + EXPECT_STREQ(info.brand_string, "AMD Opteron(tm) Processor 6376 "); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0600F20_K15_AbuDhabi_CPUID0.txt +TEST_F(CpuidX86Test, AMD_K15_PILEDRIVER_ABU_DHABI_CACHE_INFO) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00600F20, 0x00100800, 0x3E98320B, 0x178BFBFF}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00600F20, 0x30000000, 0x01EBBFFF, 0x2FD3FBFF}}, + {{0x8000001D, 0}, Leaf{0x00000121, 0x00C0003F, 0x0000003F, 0x00000000}}, + {{0x8000001D, 1}, Leaf{0x00004122, 0x0040003F, 0x000001FF, 0x00000000}}, + {{0x8000001D, 2}, Leaf{0x00004143, 0x03C0003F, 0x000007FF, 0x00000001}}, + {{0x8000001D, 3}, Leaf{0x0001C163, 0x0BC0003F, 0x000007FF, 0x00000001}}, + }); + const auto info = GetX86CacheInfo(); + + EXPECT_EQ(info.size, 4); + EXPECT_EQ(info.levels[0].level, 1); + EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA); + EXPECT_EQ(info.levels[0].cache_size, 16 * KiB); + EXPECT_EQ(info.levels[0].ways, 4); + EXPECT_EQ(info.levels[0].line_size, 64); + EXPECT_EQ(info.levels[0].tlb_entries, 64); + EXPECT_EQ(info.levels[0].partitioning, 1); + + EXPECT_EQ(info.levels[1].level, 1); + EXPECT_EQ(info.levels[1].cache_type, + CacheType::CPU_FEATURE_CACHE_INSTRUCTION); + EXPECT_EQ(info.levels[1].cache_size, 64 * KiB); + EXPECT_EQ(info.levels[1].ways, 2); + EXPECT_EQ(info.levels[1].line_size, 64); + EXPECT_EQ(info.levels[1].tlb_entries, 512); + EXPECT_EQ(info.levels[1].partitioning, 1); + + EXPECT_EQ(info.levels[2].level, 2); + EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[2].cache_size, 2 * MiB); + EXPECT_EQ(info.levels[2].ways, 16); + EXPECT_EQ(info.levels[2].line_size, 64); + EXPECT_EQ(info.levels[2].tlb_entries, 2048); + EXPECT_EQ(info.levels[2].partitioning, 1); + + EXPECT_EQ(info.levels[3].level, 3); + EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[3].cache_size, 6 * MiB); + EXPECT_EQ(info.levels[3].ways, 48); + EXPECT_EQ(info.levels[3].line_size, 64); + EXPECT_EQ(info.levels[3].tlb_entries, 2048); + EXPECT_EQ(info.levels[3].partitioning, 1); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/AuthenticAMD/AuthenticAMD0610F01_K15_Piledriver_CPUID.txt +TEST_F(CpuidX86Test, AMD_K15_PILEDRIVER_A10) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00610F01, 0x00040800, 0x3E98320B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00610F01, 0x20000000, 0x01EBBFFF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x2D303141, 0x30303835, 0x5041204B}}, + {{0x80000003, 0}, Leaf{0x69772055, 0x52206874, 0x6F656461, 0x6D74286E}}, + {{0x80000004, 0}, Leaf{0x44482029, 0x61724720, 0x63696870, 0x00202073}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x15); + EXPECT_EQ(info.model, 0x10); + EXPECT_STREQ(info.brand_string, + "AMD A10-5800K APU with Radeon(tm) HD Graphics "); + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::AMD_PILEDRIVER); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0600F12_K15_Interlagos_CPUID3.txt +TEST_F(CpuidX86Test, AMD_K15_BULLDOZER_INTERLAGOS) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00600F12, 0x000C0800, 0x1E98220B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00600F12, 0x30000000, 0x01C9BFFF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x6574704F, 0x286E6F72, 0x20294D54}}, + {{0x80000003, 0}, Leaf{0x636F7250, 0x6F737365, 0x32362072, 0x20203833}}, + {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x15); + EXPECT_EQ(info.model, 0x01); + EXPECT_STREQ(info.brand_string, + "AMD Opteron(TM) Processor 6238 "); + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::AMD_BULLDOZER); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD0630F81_K15_Godavari_CPUID.txt +TEST_F(CpuidX86Test, AMD_K15_STREAMROLLER_GODAVARI) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00630F81, 0x00040800, 0x3E98320B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00630F81, 0x10000000, 0x0FEBBFFF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x372D3841, 0x4B303736, 0x64615220}}, + {{0x80000003, 0}, Leaf{0x206E6F65, 0x202C3752, 0x43203031, 0x75706D6F}}, + {{0x80000004, 0}, Leaf{0x43206574, 0x7365726F, 0x2B433420, 0x00204736}}, + {{0x80000005, 0}, Leaf{0xFF40FF18, 0xFF40FF30, 0x10040140, 0x60030140}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x15); + EXPECT_EQ(info.model, 0x38); + EXPECT_EQ(info.stepping, 0x01); + EXPECT_STREQ(info.brand_string, + "AMD A8-7670K Radeon R7, 10 Compute Cores 4C+6G "); + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::AMD_STREAMROLLER); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0600F12_K15_Zambezi8C_CPUID.txt +TEST_F(CpuidX86Test, AMD_K15_BULLDOZER_ZAMBEZI_ABM) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00600F12, 0x00080800, 0x1E98220B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00600F12, 0x10000000, 0x01C9BFFF, 0x2FD3FBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x15); + EXPECT_EQ(info.model, 0x01); + + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::AMD_BULLDOZER); + + EXPECT_TRUE(info.features.lzcnt); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0700F01_K16_Kabini_CPUID.txt +TEST_F(CpuidX86Test, AMD_K16_JAGUAR_KABINI) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00700F01, 0x00040800, 0x3ED8220B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00700F01, 0x00000000, 0x154037FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x352D3441, 0x20303030, 0x20555041}}, + {{0x80000003, 0}, Leaf{0x68746977, 0x64615220, 0x286E6F65, 0x20294D54}}, + {{0x80000004, 0}, Leaf{0x47204448, 0x68706172, 0x20736369, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x16); + EXPECT_EQ(info.model, 0x00); + EXPECT_STREQ(info.brand_string, + "AMD A4-5000 APU with Radeon(TM) HD Graphics "); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_JAGUAR); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0730F01_K16_Beema_CPUID2.txt +TEST_F(CpuidX86Test, AMD_K16_PUMA_BEEMA) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00730F01, 0x00040800, 0x7ED8220B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00730F01, 0x00000000, 0x1D4037FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x362D3641, 0x20303133, 0x20555041}}, + {{0x80000003, 0}, Leaf{0x68746977, 0x444D4120, 0x64615220, 0x206E6F65}}, + {{0x80000004, 0}, Leaf{0x47203452, 0x68706172, 0x20736369, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x16); + EXPECT_EQ(info.model, 0x30); + EXPECT_STREQ(info.brand_string, + "AMD A6-6310 APU with AMD Radeon R4 Graphics "); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_PUMA); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/AuthenticAMD/AuthenticAMD0720F61_K16_Cato_CPUID.txt +TEST_F(CpuidX86Test, AMD_K16_CATO) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00720F61, 0x00080800, 0x3ED8220B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00720F61, 0x00000000, 0x154837FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x392D3941, 0x20303238, 0x636F7250}}, + {{0x80000003, 0}, Leaf{0x6F737365, 0x00000072, 0x00000000, 0x00000000}}, + {{0x80000004, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x16); + EXPECT_EQ(info.model, 0x26); + EXPECT_STREQ(info.brand_string, + "AMD A9-9820 Processor"); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_JAGUAR); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0820F01_K17_Dali_CPUID.txt +TEST_F(CpuidX86Test, AMD_K17_ZEN_DALI) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00820F01, 0x00020800, 0x7ED8320B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x209C01A9, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001F, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00820F01, 0x00000000, 0x35C233FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x30323033, 0x69772065, 0x52206874}}, + {{0x80000003, 0}, Leaf{0x6F656461, 0x7247206E, 0x69687061, 0x20207363}}, + {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x17); + EXPECT_EQ(info.model, 0x20); + EXPECT_STREQ(info.brand_string, + "AMD 3020e with Radeon Graphics "); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0800F82_K17_ZenP_CPUID.txt +TEST_F(CpuidX86Test, AMD_K17_ZEN_PLUS_PINNACLE_RIDGE) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00800F82, 0x00100800, 0x7ED8320B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x209C01A9, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001F, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00800F82, 0x20000000, 0x35C233FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x657A7952, 0x2037206E, 0x30303732}}, + {{0x80000003, 0}, Leaf{0x69452058, 0x2D746867, 0x65726F43, 0x6F725020}}, + {{0x80000004, 0}, Leaf{0x73736563, 0x2020726F, 0x20202020, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x17); + EXPECT_EQ(info.model, 0x08); + EXPECT_STREQ(info.brand_string, + "AMD Ryzen 7 2700X Eight-Core Processor "); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN_PLUS); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0840F70_K17_CPUID.txt +TEST_F(CpuidX86Test, AMD_K17_ZEN2_XBOX_SERIES_X) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00840F70, 0x00100800, 0x7ED8320B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x219C91A9, 0x00400004, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000020, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00840F70, 0x00000000, 0xF5C2B7FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x30303734, 0x2D382053, 0x65726F43}}, + {{0x80000003, 0}, Leaf{0x6F725020, 0x73736563, 0x4420726F, 0x746B7365}}, + {{0x80000004, 0}, Leaf{0x4B20706F, 0x00007469, 0x00000000, 0x00000000}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x17); + EXPECT_EQ(info.model, 0x47); + EXPECT_STREQ(info.brand_string, "AMD 4700S 8-Core Processor Desktop Kit"); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN2); +} + +// http://users.atw.hu/instlatx64/HygonGenuine/HygonGenuine0900F02_Hygon_CPUID3.txt +TEST_F(CpuidX86Test, AMD_K18_ZEN_DHYANA) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x6F677948, 0x656E6975, 0x6E65476E}}, + {{0x00000001, 0}, Leaf{0x00900F02, 0x00100800, 0x74D83209, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x009C01A9, 0x0040068C, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001F, 0x6F677948, 0x656E6975, 0x6E65476E}}, + {{0x80000001, 0}, Leaf{0x00900F02, 0x60000000, 0x35C233FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x6F677948, 0x3843206E, 0x31332036, 0x20203538}}, + {{0x80000003, 0}, Leaf{0x6F632D38, 0x50206572, 0x65636F72, 0x726F7373}}, + {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_HYGON_GENUINE); + EXPECT_EQ(info.family, 0x18); + EXPECT_EQ(info.model, 0x00); + EXPECT_STREQ(info.brand_string, + "Hygon C86 3185 8-core Processor "); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN); +} + +// http://users.atw.hu/instlatx64/HygonGenuine/HygonGenuine0900F02_Hygon_CPUID.txt +TEST_F(CpuidX86Test, AMD_K18_ZEN_DHYANA_CACHE_INFO) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x6F677948, 0x656E6975, 0x6E65476E}}, + {{0x00000001, 0}, Leaf{0x00900F02, 0x00100800, 0x74D83209, 0x178BFBFF}}, + {{0x80000000, 0}, Leaf{0x8000001F, 0x6F677948, 0x656E6975, 0x6E65476E}}, + {{0x80000001, 0}, Leaf{0x00900F02, 0x60000000, 0x35C233FF, 0x2FD3FBFF}}, + {{0x8000001D, 0}, Leaf{0x00004121, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x8000001D, 1}, Leaf{0x00004122, 0x00C0003F, 0x000000FF, 0x00000000}}, + {{0x8000001D, 2}, Leaf{0x00004143, 0x01C0003F, 0x000003FF, 0x00000002}}, + {{0x8000001D, 3}, Leaf{0x0001C163, 0x03C0003F, 0x00001FFF, 0x00000001}}, + }); + const auto info = GetX86CacheInfo(); + + EXPECT_EQ(info.size, 4); + EXPECT_EQ(info.levels[0].level, 1); + EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA); + EXPECT_EQ(info.levels[0].cache_size, 32 * KiB); + EXPECT_EQ(info.levels[0].ways, 8); + EXPECT_EQ(info.levels[0].line_size, 64); + EXPECT_EQ(info.levels[0].tlb_entries, 64); + EXPECT_EQ(info.levels[0].partitioning, 1); + + EXPECT_EQ(info.levels[1].level, 1); + EXPECT_EQ(info.levels[1].cache_type, + CacheType::CPU_FEATURE_CACHE_INSTRUCTION); + EXPECT_EQ(info.levels[1].cache_size, 64 * KiB); + EXPECT_EQ(info.levels[1].ways, 4); + EXPECT_EQ(info.levels[1].line_size, 64); + EXPECT_EQ(info.levels[1].tlb_entries, 256); + EXPECT_EQ(info.levels[1].partitioning, 1); + + EXPECT_EQ(info.levels[2].level, 2); + EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[2].cache_size, 512 * KiB); + EXPECT_EQ(info.levels[2].ways, 8); + EXPECT_EQ(info.levels[2].line_size, 64); + EXPECT_EQ(info.levels[2].tlb_entries, 1024); + EXPECT_EQ(info.levels[2].partitioning, 1); + + EXPECT_EQ(info.levels[3].level, 3); + EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[3].cache_size, 8 * MiB); + EXPECT_EQ(info.levels[3].ways, 16); + EXPECT_EQ(info.levels[3].line_size, 64); + EXPECT_EQ(info.levels[3].tlb_entries, 8192); + EXPECT_EQ(info.levels[3].partitioning, 1); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0A20F10_K19_Vermeer2_CPUID.txt +TEST_F(CpuidX86Test, AMD_K19_ZEN3_VERMEER) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00A20F10, 0x01180800, 0x7ED8320B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x219C97A9, 0x0040068C, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000023, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00A20F10, 0x20000000, 0x75C237FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x657A7952, 0x2039206E, 0x30303935}}, + {{0x80000003, 0}, Leaf{0x32312058, 0x726F432D, 0x72502065, 0x7365636F}}, + {{0x80000004, 0}, Leaf{0x20726F73, 0x20202020, 0x20202020, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x19); + EXPECT_EQ(info.model, 0x21); + EXPECT_STREQ(info.brand_string, + "AMD Ryzen 9 5900X 12-Core Processor "); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN3); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0A40F41_K19_Rembrandt_03_CPUID.txt +TEST_F(CpuidX86Test, AMD_K19_ZEN3) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00A40F41, 0x00100800, 0x7EF8320B, 0x178BFBFF}}, + {{0x80000000, 0}, Leaf{0x80000023, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00A40F41, 0x50000000, 0x75C237FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x657A7952, 0x2039206E, 0x30303936}}, + {{0x80000003, 0}, Leaf{0x77205848, 0x20687469, 0x65646152, 0x47206E6F}}, + {{0x80000004, 0}, Leaf{0x68706172, 0x20736369, 0x20202020, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x19); + EXPECT_EQ(info.model, 0x44); + EXPECT_STREQ(info.brand_string, + "AMD Ryzen 9 6900HX with Radeon Graphics "); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN3); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0A60F12_K19_Raphael_01_CPUID.txt +TEST_F(CpuidX86Test, AMD_K19_ZEN4_RAPHAEL) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00A60F12, 0x000C0800, 0x7EF8320B, 0x178BFBFF}}, + {{0x80000000, 0}, Leaf{0x80000028, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00A60F12, 0x00000000, 0x75C237FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x657A7952, 0x2035206E, 0x30303637}}, + {{0x80000003, 0}, Leaf{0x2D362058, 0x65726F43, 0x6F725020, 0x73736563}}, + {{0x80000004, 0}, Leaf{0x2020726F, 0x20202020, 0x20202020, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(info.family, 0x19); + EXPECT_EQ(info.model, 0x61); + EXPECT_STREQ(info.brand_string, + "AMD Ryzen 5 7600X 6-Core Processor "); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN4); +} + +// http://users.atw.hu/instlatx64/HygonGenuine/HygonGenuine0900F11_Hygon_01_CPUID.txt +TEST_F(CpuidX86Test, AMD_K18_ZEN_DHYANA_OCTAL_CORE_C86_3250) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x6F677948, 0x656E6975, 0x6E65476E}}, + {{0x00000001, 0}, Leaf{0x00900F11, 0x00100800, 0x76D8320B, 0x178BFBFF}}, + {{0x80000000, 0}, Leaf{0x8000001F, 0x6F677948, 0x656E6975, 0x6E65476E}}, + {{0x80000001, 0}, Leaf{0x00900F11, 0x60000000, 0x35C233FF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x6F677948, 0x3843206E, 0x32332036, 0x20203035}}, + {{0x80000003, 0}, Leaf{0x6F632D38, 0x50206572, 0x65636F72, 0x726F7373}}, + {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}}, + }); + const auto info = GetX86Info(); + + EXPECT_EQ(info.model, 0x01); + EXPECT_EQ(info.family, 0x18); + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_HYGON_GENUINE); + EXPECT_STREQ(info.brand_string, + "Hygon C86 3250 8-core Processor "); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD08A0F00_K17_Mendocino_01_CPUID.txt +TEST_F(CpuidX86Test, AMD_ZEN2_MENDOCINO) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x008A0F00, 0x00080800, 0x7EF8320B, 0x178BFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_EQ(info.model, 0xA0); + EXPECT_EQ(info.family, 0x17); + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN2); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00906A4_AlderLakeP_00_CPUID.txt +TEST_F(CpuidX86Test, INTEL_ALDER_LAKE_AVX_VNNI) { + cpu().SetOsBackupsExtendedRegisters(true); + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000906A4, 0x00400800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000001, 0x239CA7EB, 0x984007AC, 0xFC18C410}}, + {{0x00000007, 1}, Leaf{0x00400810, 0x00000000, 0x00000000, 0x00000000}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x9A); + EXPECT_TRUE(info.features.avx_vnni); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ADL); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0090672_AlderLake_BC_AVX512_CPUID01.txt +TEST_F(CpuidX86Test, INTEL_ALDER_LAKE_AVX512) { + cpu().SetOsBackupsExtendedRegisters(true); +#if defined(CPU_FEATURES_OS_MACOS) + cpu().SetDarwinSysCtlByName("hw.optional.avx512f"); +#endif + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000906A4, 0x00400800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000001, 0xF3BFA7EB, 0x98C07FEE, 0xFC9CC510}}, + {{0x00000007, 1}, Leaf{0x00401C30, 0x00000000, 0x00000000, 0x00000000}}, + }); + + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x9A); + EXPECT_TRUE(info.features.avx512f); + EXPECT_TRUE(info.features.avx512bw); + EXPECT_TRUE(info.features.avx512dq); + EXPECT_TRUE(info.features.avx512cd); + EXPECT_TRUE(info.features.avx512vl); + EXPECT_TRUE(info.features.avx512_vp2intersect); + EXPECT_TRUE(info.features.avx512vbmi); + EXPECT_TRUE(info.features.avx512vbmi2); + EXPECT_TRUE(info.features.avx512bitalg); + EXPECT_TRUE(info.features.avx512vpopcntdq); + EXPECT_TRUE(info.features.avx512ifma); + EXPECT_TRUE(info.features.avx512_bf16); + EXPECT_TRUE(info.features.avx512_fp16); + + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ADL); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00806C1_TigerLake_CPUID3.txt +TEST_F(CpuidX86Test, INTEL_TIGER_LAKE_AVX512) { + cpu().SetOsBackupsExtendedRegisters(true); +#if defined(CPU_FEATURES_OS_MACOS) + cpu().SetDarwinSysCtlByName("hw.optional.avx512f"); +#endif + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000806C1, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0xF3BFA7EB, 0x18C05FCE, 0xFC100510}}, + }); + + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x8C); + EXPECT_TRUE(info.features.avx512f); + EXPECT_TRUE(info.features.avx512bw); + EXPECT_TRUE(info.features.avx512dq); + EXPECT_TRUE(info.features.avx512cd); + EXPECT_TRUE(info.features.avx512vl); + EXPECT_TRUE(info.features.avx512_vp2intersect); + EXPECT_TRUE(info.features.avx512vbmi); + EXPECT_TRUE(info.features.avx512vbmi2); + EXPECT_TRUE(info.features.avx512bitalg); + EXPECT_TRUE(info.features.avx512vpopcntdq); + EXPECT_TRUE(info.features.avx512ifma); + + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_TGL); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00706E5_IceLakeY_CPUID.txt +TEST_F(CpuidX86Test, INTEL_ICE_LAKE_GFNI) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000706E5, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0xF2BF27EF, 0x40405F4E, 0xBC000410}}, + }); + + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x7E); + EXPECT_TRUE(info.features.gfni); + + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ICL); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00906C0_JasperLake_CPUID01.txt +TEST_F(CpuidX86Test, INTEL_TREMONT_JASPER_LAKE_MOVDR) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00090661, 0x00800800, 0x4FF8EBBF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x2394A2C3, 0x18400124, 0xFC000400}}, + }); + + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x96); + EXPECT_TRUE(info.features.movdiri); + EXPECT_TRUE(info.features.movdir64b); + + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ATOM_TMT); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel0090672_AlderLake_LC_BC_CPUID01.txt +TEST_F(CpuidX86Test, INTEL_ALDER_LAKE_REP) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00090672, 0x00800800, 0x7FFAFBFF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000001, 0x239CA7EB, 0x98C027AC, 0xFC1CC410}}, + {{0x00000007, 1}, Leaf{0x00400810, 0x00000000, 0x00000000, 0x00000000}}, + }); + + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x97); + EXPECT_TRUE(info.features.erms); + EXPECT_TRUE(info.features.fs_rep_mov); + EXPECT_FALSE(info.features.fz_rep_movsb); + EXPECT_TRUE(info.features.fs_rep_stosb); + EXPECT_FALSE(info.features.fs_rep_cmpsb_scasb); + + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ADL); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0100FA0_K10_Thuban_CPUID.txt +TEST_F(CpuidX86Test, AMD_THUBAN_CACHE_INFO) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00100FA0, 0x10000050, 0x000037FF, 0xEFD3FBFF}}, + {{0x80000005, 0}, Leaf{0xFF30FF10, 0xFF30FF20, 0x40020140, 0x40020140}}, + {{0x80000006, 0}, Leaf{0x20800000, 0x42004200, 0x02008140, 0x0030B140}}, + }); + const auto info = GetX86CacheInfo(); + + EXPECT_EQ(info.size, 4); + EXPECT_EQ(info.levels[0].level, 1); + EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA); + EXPECT_EQ(info.levels[0].cache_size, 64 * KiB); + EXPECT_EQ(info.levels[0].ways, 2); + EXPECT_EQ(info.levels[0].line_size, 64); + + EXPECT_EQ(info.levels[1].level, 1); + EXPECT_EQ(info.levels[1].cache_type, + CacheType::CPU_FEATURE_CACHE_INSTRUCTION); + EXPECT_EQ(info.levels[1].cache_size, 64 * KiB); + EXPECT_EQ(info.levels[1].ways, 2); + EXPECT_EQ(info.levels[1].line_size, 64); + + EXPECT_EQ(info.levels[2].level, 2); + EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[2].cache_size, 512 * KiB); + EXPECT_EQ(info.levels[2].ways, 16); + EXPECT_EQ(info.levels[2].line_size, 64); + + EXPECT_EQ(info.levels[3].level, 3); + EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[3].cache_size, 6 * MiB); + EXPECT_EQ(info.levels[3].ways, 48); + EXPECT_EQ(info.levels[3].line_size, 64); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0020FB1_K8_Manchester_CPUID.txt +TEST_F(CpuidX86Test, AMD_MANCHESTER_CACHE_INFO) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000001, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000000, 0}, Leaf{0x80000018, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00020FB1, 0x00000150, 0x00000003, 0xE3D3FBFF}}, + {{0x80000005, 0}, Leaf{0xFF08FF08, 0xFF20FF20, 0x40020140, 0x40020140}}, + {{0x80000006, 0}, Leaf{0x00000000, 0x42004200, 0x02008140, 0x00000000}}, + }); + const auto info = GetX86CacheInfo(); + + EXPECT_EQ(info.size, 3); + EXPECT_EQ(info.levels[0].level, 1); + EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA); + EXPECT_EQ(info.levels[0].cache_size, 64 * KiB); + EXPECT_EQ(info.levels[0].ways, 2); + EXPECT_EQ(info.levels[0].line_size, 64); + + EXPECT_EQ(info.levels[1].level, 1); + EXPECT_EQ(info.levels[1].cache_type, + CacheType::CPU_FEATURE_CACHE_INSTRUCTION); + EXPECT_EQ(info.levels[1].cache_size, 64 * KiB); + EXPECT_EQ(info.levels[1].ways, 2); + EXPECT_EQ(info.levels[1].line_size, 64); + + EXPECT_EQ(info.levels[2].level, 2); + EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[2].cache_size, 512 * KiB); + EXPECT_EQ(info.levels[2].ways, 16); + EXPECT_EQ(info.levels[2].line_size, 64); +} + +// http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0100F22_K10_Agena_CPUID.txt +TEST_F(CpuidX86Test, AMD_AGENA_CACHE_INFO) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000005, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000000, 0}, Leaf{0x8000001A, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00100F22, 0x10000000, 0x000007FF, 0xEFD3FBFF}}, + {{0x80000005, 0}, Leaf{0xFF30FF10, 0xFF30FF20, 0x40020140, 0x40020140}}, + {{0x80000006, 0}, Leaf{0x20800000, 0x42004200, 0x02008140, 0x0010A140}}, + }); + const auto info = GetX86CacheInfo(); + + EXPECT_EQ(info.size, 4); + EXPECT_EQ(info.levels[0].level, 1); + EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA); + EXPECT_EQ(info.levels[0].cache_size, 64 * KiB); + EXPECT_EQ(info.levels[0].ways, 2); + EXPECT_EQ(info.levels[0].line_size, 64); + + EXPECT_EQ(info.levels[1].level, 1); + EXPECT_EQ(info.levels[1].cache_type, + CacheType::CPU_FEATURE_CACHE_INSTRUCTION); + EXPECT_EQ(info.levels[1].cache_size, 64 * KiB); + EXPECT_EQ(info.levels[1].ways, 2); + EXPECT_EQ(info.levels[1].line_size, 64); + + EXPECT_EQ(info.levels[2].level, 2); + EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[2].cache_size, 512 * KiB); + EXPECT_EQ(info.levels[2].ways, 16); + EXPECT_EQ(info.levels[2].line_size, 64); + + EXPECT_EQ(info.levels[3].level, 3); + EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED); + EXPECT_EQ(info.levels[3].cache_size, 2 * MiB); + EXPECT_EQ(info.levels[3].ways, 32); + EXPECT_EQ(info.levels[3].line_size, 64); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00106A1_Nehalem_CPUID.txt +TEST_F(CpuidX86Test, Nehalem) { + // Pre AVX cpus don't have xsave + cpu().SetOsBackupsExtendedRegisters(false); +#if defined(CPU_FEATURES_OS_WINDOWS) + cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSSE3_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_1_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE); +#elif defined(CPU_FEATURES_OS_MACOS) + cpu().SetDarwinSysCtlByName("hw.optional.sse"); + cpu().SetDarwinSysCtlByName("hw.optional.sse2"); + cpu().SetDarwinSysCtlByName("hw.optional.sse3"); + cpu().SetDarwinSysCtlByName("hw.optional.supplementalsse3"); + cpu().SetDarwinSysCtlByName("hw.optional.sse4_1"); + cpu().SetDarwinSysCtlByName("hw.optional.sse4_2"); +#elif defined(CPU_FEATURES_OS_FREEBSD) + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/var/run/dmesg.boot", R"( + ---<>--- +Copyright (c) 1992-2020 The FreeBSD Project. +FreeBSD is a registered trademark of The FreeBSD Foundation. + Features=0x1783fbff + Features2=0x5eda2203 +real memory = 2147418112 (2047 MB) +)"); +#elif defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(processor : +flags : fpu mmx sse sse2 pni ssse3 sse4_1 sse4_2 +)"); +#endif + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000B, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000106A2, 0x00100800, 0x00BCE3BD, 0xBFEBFBFF}}, + {{0x00000002, 0}, Leaf{0x55035A01, 0x00F0B0E3, 0x00000000, 0x09CA212C}}, + {{0x00000003, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x00000004, 0}, Leaf{0x1C004121, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x00000004, 0}, Leaf{0x1C004122, 0x00C0003F, 0x0000007F, 0x00000000}}, + {{0x00000004, 0}, Leaf{0x1C004143, 0x01C0003F, 0x000001FF, 0x00000000}}, + {{0x00000004, 0}, Leaf{0x1C03C163, 0x03C0003F, 0x00000FFF, 0x00000002}}, + {{0x00000005, 0}, Leaf{0x00000040, 0x00000040, 0x00000003, 0x00021120}}, + {{0x00000006, 0}, Leaf{0x00000001, 0x00000002, 0x00000001, 0x00000000}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x00000008, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x00000009, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x0000000A, 0}, Leaf{0x07300403, 0x00000000, 0x00000000, 0x00000603}}, + {{0x0000000B, 0}, Leaf{0x00000001, 0x00000001, 0x00000100, 0x00000000}}, + {{0x0000000B, 0}, Leaf{0x00000004, 0x00000002, 0x00000201, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000001, 0x28100000}}, + {{0x80000002, 0}, Leaf{0x756E6547, 0x20656E69, 0x65746E49, 0x2952286C}}, + {{0x80000003, 0}, Leaf{0x55504320, 0x20202020, 0x20202020, 0x40202020}}, + {{0x80000004, 0}, Leaf{0x30303020, 0x20402030, 0x37382E31, 0x007A4847}}, + {{0x80000005, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000006, 0}, Leaf{0x00000000, 0x00000000, 0x01006040, 0x00000000}}, + {{0x80000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000100}}, + {{0x80000008, 0}, Leaf{0x00003028, 0x00000000, 0x00000000, 0x00000000}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x1A); + EXPECT_EQ(info.stepping, 0x02); + EXPECT_STREQ(info.brand_string, + "Genuine Intel(R) CPU @ 0000 @ 1.87GHz"); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_NHM); + + EXPECT_TRUE(info.features.sse); + EXPECT_TRUE(info.features.sse2); + EXPECT_TRUE(info.features.sse3); + EXPECT_TRUE(info.features.ssse3); + EXPECT_TRUE(info.features.sse4_1); + EXPECT_TRUE(info.features.sse4_2); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0030673_Silvermont3_CPUID.txt +TEST_F(CpuidX86Test, Atom) { + // Pre AVX cpus don't have xsave + cpu().SetOsBackupsExtendedRegisters(false); +#if defined(CPU_FEATURES_OS_WINDOWS) + cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSSE3_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_1_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE); +#elif defined(CPU_FEATURES_OS_MACOS) + cpu().SetDarwinSysCtlByName("hw.optional.sse"); + cpu().SetDarwinSysCtlByName("hw.optional.sse2"); + cpu().SetDarwinSysCtlByName("hw.optional.sse3"); + cpu().SetDarwinSysCtlByName("hw.optional.supplementalsse3"); + cpu().SetDarwinSysCtlByName("hw.optional.sse4_1"); + cpu().SetDarwinSysCtlByName("hw.optional.sse4_2"); +#elif defined(CPU_FEATURES_OS_FREEBSD) + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/var/run/dmesg.boot", R"( + ---<>--- +Copyright (c) 1992-2020 The FreeBSD Project. +FreeBSD is a registered trademark of The FreeBSD Foundation. + Features=0x1783fbff + Features2=0x5eda2203 +real memory = 2147418112 (2047 MB) +)"); +#elif defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"( +flags : fpu mmx sse sse2 pni ssse3 sse4_1 sse4_2 +)"); +#endif + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000B, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00030673, 0x00100800, 0x41D8E3BF, 0xBFEBFBFF}}, + {{0x00000002, 0}, Leaf{0x61B3A001, 0x0000FFC2, 0x00000000, 0x00000000}}, + {{0x00000003, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x00000004, 0}, Leaf{0x1C000121, 0x0140003F, 0x0000003F, 0x00000001}}, + {{0x00000004, 1}, Leaf{0x1C000122, 0x01C0003F, 0x0000003F, 0x00000001}}, + {{0x00000004, 2}, Leaf{0x1C00C143, 0x03C0003F, 0x000003FF, 0x00000001}}, + {{0x00000005, 0}, Leaf{0x00000040, 0x00000040, 0x00000003, 0x33000020}}, + {{0x00000006, 0}, Leaf{0x00000005, 0x00000002, 0x00000009, 0x00000000}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00002282, 0x00000000, 0x00000000}}, + {{0x00000008, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x00000009, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x0000000A, 0}, Leaf{0x07280203, 0x00000000, 0x00000000, 0x00004503}}, + {{0x0000000B, 0}, Leaf{0x00000001, 0x00000001, 0x00000100, 0x00000000}}, + {{0x0000000B, 1}, Leaf{0x00000004, 0x00000004, 0x00000201, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000101, 0x28100000}}, + {{0x80000002, 0}, Leaf{0x20202020, 0x6E492020, 0x286C6574, 0x43202952}}, + {{0x80000003, 0}, Leaf{0x72656C65, 0x52286E6F, 0x50432029, 0x4A202055}}, + {{0x80000004, 0}, Leaf{0x30303931, 0x20402020, 0x39392E31, 0x007A4847}}, + {{0x80000005, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000006, 0}, Leaf{0x00000000, 0x00000000, 0x04008040, 0x00000000}}, + {{0x80000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000100}}, + {{0x80000008, 0}, Leaf{0x00003024, 0x00000000, 0x00000000, 0x00000000}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x37); + EXPECT_EQ(info.stepping, 0x03); + EXPECT_STREQ(info.brand_string, + " Intel(R) Celeron(R) CPU J1900 @ 1.99GHz"); + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::INTEL_ATOM_SMT); + + EXPECT_TRUE(info.features.sse); + EXPECT_TRUE(info.features.sse2); + EXPECT_TRUE(info.features.sse3); + EXPECT_TRUE(info.features.ssse3); + EXPECT_TRUE(info.features.sse4_1); + EXPECT_TRUE(info.features.sse4_2); +} + +// https://www.felixcloutier.com/x86/cpuid#example-3-1--example-of-cache-and-tlb-interpretation +TEST_F(CpuidX86Test, P4_CacheInfo) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000002, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00000F0A, 0x00010808, 0x00000000, 0x3FEBFBFF}}, + {{0x00000002, 0}, Leaf{0x665B5001, 0x00000000, 0x00000000, 0x007A7000}}, + }); + + const auto info = GetX86CacheInfo(); + EXPECT_EQ(info.size, 5); + + EXPECT_EQ(info.levels[0].level, UNDEF); + EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_TLB); + EXPECT_EQ(info.levels[0].cache_size, 4 * KiB); + EXPECT_EQ(info.levels[0].ways, UNDEF); + EXPECT_EQ(info.levels[0].line_size, UNDEF); + EXPECT_EQ(info.levels[0].tlb_entries, 64); + EXPECT_EQ(info.levels[0].partitioning, 0); + + EXPECT_EQ(info.levels[1].level, UNDEF); + EXPECT_EQ(info.levels[1].cache_type, CacheType::CPU_FEATURE_CACHE_TLB); + EXPECT_EQ(info.levels[1].cache_size, 4 * KiB); + EXPECT_EQ(info.levels[1].ways, UNDEF); + EXPECT_EQ(info.levels[1].line_size, UNDEF); + EXPECT_EQ(info.levels[1].tlb_entries, 64); + EXPECT_EQ(info.levels[1].partitioning, 0); + + EXPECT_EQ(info.levels[2].level, 1); + EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_DATA); + EXPECT_EQ(info.levels[2].cache_size, 8 * KiB); + EXPECT_EQ(info.levels[2].ways, 4); + EXPECT_EQ(info.levels[2].line_size, 64); + EXPECT_EQ(info.levels[2].tlb_entries, UNDEF); + EXPECT_EQ(info.levels[2].partitioning, 0); + + EXPECT_EQ(info.levels[3].level, 1); + EXPECT_EQ(info.levels[3].cache_type, + CacheType::CPU_FEATURE_CACHE_INSTRUCTION); + EXPECT_EQ(info.levels[3].cache_size, 12 * KiB); + EXPECT_EQ(info.levels[3].ways, 8); + EXPECT_EQ(info.levels[3].line_size, UNDEF); + EXPECT_EQ(info.levels[3].tlb_entries, UNDEF); + EXPECT_EQ(info.levels[3].partitioning, 0); + + EXPECT_EQ(info.levels[4].level, 2); + EXPECT_EQ(info.levels[4].cache_type, CacheType::CPU_FEATURE_CACHE_DATA); + EXPECT_EQ(info.levels[4].cache_size, 256 * KiB); + EXPECT_EQ(info.levels[4].ways, 8); + EXPECT_EQ(info.levels[4].line_size, 64); + EXPECT_EQ(info.levels[4].tlb_entries, UNDEF); + EXPECT_EQ(info.levels[4].partitioning, 2); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0000673_P3_KatmaiDP_CPUID.txt +TEST_F(CpuidX86Test, P3) { + // Pre AVX cpus don't have xsave + cpu().SetOsBackupsExtendedRegisters(false); +#if defined(CPU_FEATURES_OS_WINDOWS) + cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE); +#elif defined(CPU_FEATURES_OS_MACOS) + cpu().SetDarwinSysCtlByName("hw.optional.sse"); +#elif defined(CPU_FEATURES_OS_FREEBSD) + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/var/run/dmesg.boot", R"( + ---<>--- +Copyright (c) 1992-2020 The FreeBSD Project. +FreeBSD is a registered trademark of The FreeBSD Foundation. + Features=0x1783fbff +real memory = 2147418112 (2047 MB) +)"); +#elif defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"( +flags : fpu mmx sse +)"); +#endif + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000003, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00000673, 0x00000000, 0x00000000, 0x0387FBFF}}, + {{0x00000002, 0}, Leaf{0x03020101, 0x00000000, 0x00000000, 0x0C040843}}, + {{0x00000003, 0}, Leaf{0x00000000, 0x00000000, 0x4CECC782, 0x00006778}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x07); + EXPECT_EQ(info.stepping, 0x03); + EXPECT_STREQ(info.brand_string, ""); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::X86_UNKNOWN); + + EXPECT_TRUE(info.features.mmx); + EXPECT_TRUE(info.features.sse); + EXPECT_FALSE(info.features.sse2); + EXPECT_FALSE(info.features.sse3); + EXPECT_FALSE(info.features.ssse3); + EXPECT_FALSE(info.features.sse4_1); + EXPECT_FALSE(info.features.sse4_2); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0000480_486_CPUID.txt +TEST_F(CpuidX86Test, INTEL_80486) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000001, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00000480, 0x00000000, 0x00000000, 0x00000003}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x04); + EXPECT_EQ(info.model, 0x08); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_80486); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0000526_P54C_CPUID.txt +TEST_F(CpuidX86Test, INTEL_P54C) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000001, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00000525, 0x00000000, 0x00000000, 0x000001BF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x05); + EXPECT_EQ(info.model, 0x02); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_P5); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0000590_Lakemont_CPUID2.txt +TEST_F(CpuidX86Test, INTEL_LAKEMONT) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000002, 0x756E6547, 0x6c65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00000590, 0x00000000, 0x00010200, 0x8000237B}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x05); + EXPECT_EQ(info.model, 0x09); + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::INTEL_LAKEMONT); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00006E8_PM_Yonah_CPUID.txt +TEST_F(CpuidX86Test, INTEL_CORE_YONAH) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000A, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000006E8, 0x00010800, 0x0000C109, 0xAFE9FBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x0E); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CORE); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00706A8_GoldmontPlus_CPUID.txt +TEST_F(CpuidX86Test, INTEL_GOLDMONT_PLUS) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000018, 0x756E6547, 0x6c65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000706A8, 0x00400800, 0x4FF8EBBF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x7A); + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::INTEL_ATOM_GMT_PLUS); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0050670_KnightsLanding_CPUID.txt +TEST_F(CpuidX86Test, INTEL_KNIGHTS_LANDING) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00050670, 0x02FF0800, 0x7FF8F3BF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x57); + EXPECT_EQ(GetX86Microarchitecture(&info), + X86Microarchitecture::INTEL_KNIGHTS_L); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00806EC_CometLake_CPUID2.txt +TEST_F(CpuidX86Test, INTEL_CML_U) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000806EC, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x8E); + EXPECT_EQ(info.stepping, 0x0C); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CML); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00A0652_CometLake_CPUID1.txt +TEST_F(CpuidX86Test, INTEL_CML_H) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000A0652, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0xA5); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CML); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00A0660_CometLake_CPUID1.txt +TEST_F(CpuidX86Test, INTEL_CML_U2) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000A0660, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0xA6); + EXPECT_EQ(info.stepping, 0x00); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CML); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00806A1_Lakefield_CPUID.txt +TEST_F(CpuidX86Test, INTEL_ATOM_TMT_LAKEFIELD) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000806A1, 0x00100800, 0x4FD8EBBF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x8A); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ATOM_TMT); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0090661_ElkhartLake_CPUID01.txt +TEST_F(CpuidX86Test, INTEL_ATOM_TMT_ELKHART_LAKE) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x00090661, 0x00800800, 0x4FF8EBBF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x96); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ATOM_TMT); +} + +// https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00906C0_JasperLake_01_CPUID.txt +TEST_F(CpuidX86Test, INTEL_ATOM_TMT_JASPER_LAKE) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000906C0, 0x00800800, 0x4FF8EBBF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x9C); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ATOM_TMT); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00B0671_RaptorLake_02_CPUID.txt +TEST_F(CpuidX86Test, INTEL_RAPTOR_LAKE) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000B0671, 0x00800800, 0x7FFAFBBF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0xB7); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_RPL); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00306F2_HaswellEP2_CPUID.txt +TEST_F(CpuidX86Test, INTEL_HASWELL_LZCNT) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000F, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000306F2, 0x00200800, 0x7FFEFBFF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x000037AB, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000021, 0x2C100000}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x3F); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_HSW); + + EXPECT_TRUE(info.features.lzcnt); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00B06A2_RaptorLakeP_03_CPUID.txt +TEST_F(CpuidX86Test, INTEL_RAPTOR_LAKE_P) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000B06A3, 0x00400800, 0x7FFAFBFF, 0xBFEBFBFF}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0xBA); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_RPL); +} + +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00B06F2_RaptorLakeS_02_CPUID.txt +TEST_F(CpuidX86Test, INTEL_RAPTOR_LAKE_S) { + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000B06F2, 0x00800800, 0x7FFAFBFF, 0xBFEBFBFF}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}}, + }); + const auto info = GetX86Info(); + + EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL); + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0xBF); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_RPL); +} + +// https://github.com/google/cpu_features/issues/200 +// http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00206F2_Eagleton_CPUID.txt +#if defined(CPU_FEATURES_OS_WINDOWS) +TEST_F(CpuidX86Test, WIN_INTEL_WESTMERE_EX) { + // Pre AVX cpus don't have xsave + cpu().SetOsBackupsExtendedRegisters(false); + cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSSE3_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_1_INSTRUCTIONS_AVAILABLE); + cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE); + + cpu().SetLeaves({ + {{0x00000000, 0}, Leaf{0x0000000B, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000206F2, 0x00400800, 0x02BEE3FF, 0xBFEBFBFF}}, + }); + const auto info = GetX86Info(); + + EXPECT_EQ(info.family, 0x06); + EXPECT_EQ(info.model, 0x2F); + EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_WSM); + + EXPECT_TRUE(info.features.sse); + EXPECT_TRUE(info.features.sse2); + EXPECT_TRUE(info.features.sse3); + EXPECT_TRUE(info.features.ssse3); + EXPECT_TRUE(info.features.sse4_1); + EXPECT_TRUE(info.features.sse4_2); +} +#endif // CPU_FEATURES_OS_WINDOWS + +// TODO(user): test what happens when xsave/osxsave are not present. +// TODO(user): test what happens when xmm/ymm/zmm os support are not +// present. + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.cc b/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.cc new file mode 100644 index 00000000..648a53e3 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.cc @@ -0,0 +1,103 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "filesystem_for_testing.h" + +#include +#include +#include +#include +#include + +namespace cpu_features { + +FakeFile::FakeFile(int file_descriptor, const char* content) + : file_descriptor_(file_descriptor), content_(content) {} + +FakeFile::~FakeFile() { assert(!opened_); } + +void FakeFile::Open() { + assert(!opened_); + opened_ = true; +} + +void FakeFile::Close() { + assert(opened_); + opened_ = false; +} + +int FakeFile::Read(int fd, void* buf, size_t count) { + assert(count < INT_MAX); + assert(fd == file_descriptor_); + const size_t remainder = content_.size() - head_index_; + const size_t read = count > remainder ? remainder : count; + memcpy(buf, content_.data() + head_index_, read); + head_index_ += read; + assert(read < INT_MAX); + return (int)read; +} + +void FakeFilesystem::Reset() { files_.clear(); } + +FakeFile* FakeFilesystem::CreateFile(const std::string& filename, + const char* content) { + auto& file = files_[filename]; + file = + std::unique_ptr(new FakeFile(next_file_descriptor_++, content)); + return file.get(); +} + +FakeFile* FakeFilesystem::FindFileOrNull(const std::string& filename) const { + const auto itr = files_.find(filename); + return itr == files_.end() ? nullptr : itr->second.get(); +} + +FakeFile* FakeFilesystem::FindFileOrDie(const int file_descriptor) const { + for (const auto& filename_file_pair : files_) { + FakeFile* const file_ptr = filename_file_pair.second.get(); + if (file_ptr->GetFileDescriptor() == file_descriptor) { + return file_ptr; + } + } + assert(false); + return nullptr; +} + +static FakeFilesystem* kFilesystem = new FakeFilesystem(); + +FakeFilesystem& GetEmptyFilesystem() { + kFilesystem->Reset(); + return *kFilesystem; +} + +extern "C" int CpuFeatures_OpenFile(const char* filename) { + auto* const file = kFilesystem->FindFileOrNull(filename); + if (file) { + file->Open(); + return file->GetFileDescriptor(); + } + return -1; +} + +extern "C" void CpuFeatures_CloseFile(int file_descriptor) { + kFilesystem->FindFileOrDie(file_descriptor)->Close(); +} + +extern "C" int CpuFeatures_ReadFile(int file_descriptor, void* buffer, + size_t buffer_size) { + return kFilesystem->FindFileOrDie(file_descriptor) + ->Read(file_descriptor, buffer, buffer_size); +} + +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.h b/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.h new file mode 100644 index 00000000..ef717fdf --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.h @@ -0,0 +1,61 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements a fake filesystem, useful for tests. +#ifndef CPU_FEATURES_TEST_FILESYSTEM_FOR_TESTING_H_ +#define CPU_FEATURES_TEST_FILESYSTEM_FOR_TESTING_H_ + +#include +#include +#include + +#include "internal/filesystem.h" + +namespace cpu_features { + +class FakeFile { + public: + explicit FakeFile(int file_descriptor, const char* content); + ~FakeFile(); + + void Open(); + void Close(); + int Read(int fd, void* buf, size_t count); + + int GetFileDescriptor() const { return file_descriptor_; } + + private: + const int file_descriptor_; + const std::string content_; + bool opened_ = false; + size_t head_index_ = 0; +}; + +class FakeFilesystem { + public: + void Reset(); + FakeFile* CreateFile(const std::string& filename, const char* content); + FakeFile* FindFileOrDie(const int file_descriptor) const; + FakeFile* FindFileOrNull(const std::string& filename) const; + + private: + int next_file_descriptor_ = 0; + std::unordered_map> files_; +}; + +FakeFilesystem& GetEmptyFilesystem(); + +} // namespace cpu_features + +#endif // CPU_FEATURES_TEST_FILESYSTEM_FOR_TESTING_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.cc b/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.cc new file mode 100644 index 00000000..fc0013df --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.cc @@ -0,0 +1,52 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "hwcaps_for_testing.h" + +#include + +#include "internal/string_view.h" + +namespace cpu_features { + +namespace { +static auto* const g_hardware_capabilities = new HardwareCapabilities(); +static const char* g_platform_pointer = nullptr; +static const char* g_base_platform_pointer = nullptr; +} // namespace + +void SetHardwareCapabilities(uint32_t hwcaps, uint32_t hwcaps2) { + g_hardware_capabilities->hwcaps = hwcaps; + g_hardware_capabilities->hwcaps2 = hwcaps2; +} +void SetPlatformPointer(const char* string) { g_platform_pointer = string; } +void SetBasePlatformPointer(const char* string) { + g_base_platform_pointer = string; +} + +void ResetHwcaps() { + SetHardwareCapabilities(0, 0); + SetPlatformPointer(nullptr); + SetBasePlatformPointer(nullptr); +} + +HardwareCapabilities CpuFeatures_GetHardwareCapabilities(void) { + return *g_hardware_capabilities; +} +const char* CpuFeatures_GetPlatformPointer(void) { return g_platform_pointer; } +const char* CpuFeatures_GetBasePlatformPointer(void) { + return g_base_platform_pointer; +} + +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.h b/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.h new file mode 100644 index 00000000..2138bacb --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.h @@ -0,0 +1,31 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_TEST_HWCAPS_FOR_TESTING_H_ +#define CPU_FEATURES_TEST_HWCAPS_FOR_TESTING_H_ + +#include "internal/hwcaps.h" + +namespace cpu_features { + +void SetHardwareCapabilities(uint32_t hwcaps, uint32_t hwcaps2); +void SetPlatformPointer(const char* string); +void SetBasePlatformPointer(const char* string); + +// To be called before each test. +void ResetHwcaps(); + +} // namespace cpu_features + +#endif // CPU_FEATURES_TEST_HWCAPS_FOR_TESTING_H_ diff --git a/node_modules/cpu-features/deps/cpu_features/test/stack_line_reader_test.cc b/node_modules/cpu-features/deps/cpu_features/test/stack_line_reader_test.cc new file mode 100644 index 00000000..9ac5388d --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/stack_line_reader_test.cc @@ -0,0 +1,132 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/stack_line_reader.h" + +#include "filesystem_for_testing.h" +#include "gtest/gtest.h" + +namespace cpu_features { + +bool operator==(const StringView& a, const StringView& b) { + return CpuFeatures_StringView_IsEquals(a, b); +} + +namespace { + +std::string ToString(StringView view) { return {view.ptr, view.size}; } + +TEST(StackLineReaderTest, Empty) { + auto& fs = GetEmptyFilesystem(); + auto* file = fs.CreateFile("/proc/cpuinfo", ""); + StackLineReader reader; + StackLineReader_Initialize(&reader, file->GetFileDescriptor()); + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_TRUE(result.eof); + EXPECT_TRUE(result.full_line); + EXPECT_EQ(result.line, str("")); + } +} + +TEST(StackLineReaderTest, ManySmallLines) { + auto& fs = GetEmptyFilesystem(); + auto* file = fs.CreateFile("/proc/cpuinfo", "a\nb\nc"); + + StackLineReader reader; + StackLineReader_Initialize(&reader, file->GetFileDescriptor()); + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_FALSE(result.eof); + EXPECT_TRUE(result.full_line); + EXPECT_EQ(result.line, str("a")); + } + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_FALSE(result.eof); + EXPECT_TRUE(result.full_line); + EXPECT_EQ(result.line, str("b")); + } + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_TRUE(result.eof); + EXPECT_TRUE(result.full_line); + EXPECT_EQ(result.line, str("c")); + } +} + +TEST(StackLineReaderTest, TruncatedLine) { + auto& fs = GetEmptyFilesystem(); + auto* file = fs.CreateFile("/proc/cpuinfo", R"(First +Second +More than 16 characters, this will be truncated. +last)"); + + StackLineReader reader; + StackLineReader_Initialize(&reader, file->GetFileDescriptor()); + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_FALSE(result.eof); + EXPECT_TRUE(result.full_line); + EXPECT_EQ(result.line, str("First")); + } + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_FALSE(result.eof); + EXPECT_TRUE(result.full_line); + EXPECT_EQ(result.line, str("Second")); + } + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_FALSE(result.eof); + EXPECT_FALSE(result.full_line); + EXPECT_EQ(result.line, str("More than 16 cha")); + } + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_TRUE(result.eof); + EXPECT_TRUE(result.full_line); + EXPECT_EQ(result.line, str("last")); + } +} + +TEST(StackLineReaderTest, TruncatedLines) { + auto& fs = GetEmptyFilesystem(); + auto* file = fs.CreateFile("/proc/cpuinfo", R"(More than 16 characters +Another line that is too long)"); + + StackLineReader reader; + StackLineReader_Initialize(&reader, file->GetFileDescriptor()); + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_FALSE(result.eof); + EXPECT_FALSE(result.full_line); + EXPECT_EQ(result.line, str("More than 16 cha")); + } + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_FALSE(result.eof); + EXPECT_FALSE(result.full_line); + EXPECT_EQ(result.line, str("Another line tha")); + } + { + const auto result = StackLineReader_NextLine(&reader); + EXPECT_TRUE(result.eof); + EXPECT_TRUE(result.full_line); + EXPECT_EQ(result.line, str("")); + } +} + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/deps/cpu_features/test/string_view_test.cc b/node_modules/cpu-features/deps/cpu_features/test/string_view_test.cc new file mode 100644 index 00000000..772ac3f5 --- /dev/null +++ b/node_modules/cpu-features/deps/cpu_features/test/string_view_test.cc @@ -0,0 +1,202 @@ +// Copyright 2017 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/string_view.h" + +#include "gtest/gtest.h" + +namespace cpu_features { + +bool operator==(const StringView& a, const StringView& b) { + return CpuFeatures_StringView_IsEquals(a, b); +} + +namespace { + +TEST(StringViewTest, Empty) { + EXPECT_EQ(kEmptyStringView.ptr, nullptr); + EXPECT_EQ(kEmptyStringView.size, 0); +} + +TEST(StringViewTest, Build) { + const auto view = str("test"); + EXPECT_EQ(view.ptr[0], 't'); + EXPECT_EQ(view.size, 4); +} + +TEST(StringViewTest, CpuFeatures_StringView_IndexOfChar) { + // Found. + EXPECT_EQ(CpuFeatures_StringView_IndexOfChar(str("test"), 'e'), 1); + EXPECT_EQ(CpuFeatures_StringView_IndexOfChar(str("test"), 't'), 0); + EXPECT_EQ(CpuFeatures_StringView_IndexOfChar(str("beef"), 'e'), 1); + // Not found. + EXPECT_EQ(CpuFeatures_StringView_IndexOfChar(str("test"), 'z'), -1); + // Empty. + EXPECT_EQ(CpuFeatures_StringView_IndexOfChar(kEmptyStringView, 'z'), -1); +} + +TEST(StringViewTest, CpuFeatures_StringView_IndexOf) { + // Found. + EXPECT_EQ(CpuFeatures_StringView_IndexOf(str("test"), str("es")), 1); + EXPECT_EQ(CpuFeatures_StringView_IndexOf(str("test"), str("test")), 0); + EXPECT_EQ(CpuFeatures_StringView_IndexOf(str("tesstest"), str("test")), 4); + // Not found. + EXPECT_EQ(CpuFeatures_StringView_IndexOf(str("test"), str("aa")), -1); + // Empty. + EXPECT_EQ(CpuFeatures_StringView_IndexOf(kEmptyStringView, str("aa")), -1); + EXPECT_EQ(CpuFeatures_StringView_IndexOf(str("aa"), kEmptyStringView), -1); +} + +TEST(StringViewTest, CpuFeatures_StringView_StartsWith) { + EXPECT_TRUE(CpuFeatures_StringView_StartsWith(str("test"), str("te"))); + EXPECT_TRUE(CpuFeatures_StringView_StartsWith(str("test"), str("test"))); + EXPECT_FALSE(CpuFeatures_StringView_StartsWith(str("test"), str("st"))); + EXPECT_FALSE(CpuFeatures_StringView_StartsWith(str("test"), str("est"))); + EXPECT_FALSE(CpuFeatures_StringView_StartsWith(str("test"), str(""))); + EXPECT_FALSE( + CpuFeatures_StringView_StartsWith(str("test"), kEmptyStringView)); + EXPECT_FALSE( + CpuFeatures_StringView_StartsWith(kEmptyStringView, str("test"))); +} + +TEST(StringViewTest, CpuFeatures_StringView_IsEquals) { + EXPECT_TRUE( + CpuFeatures_StringView_IsEquals(kEmptyStringView, kEmptyStringView)); + EXPECT_TRUE(CpuFeatures_StringView_IsEquals(kEmptyStringView, str(""))); + EXPECT_TRUE(CpuFeatures_StringView_IsEquals(str(""), kEmptyStringView)); + EXPECT_TRUE(CpuFeatures_StringView_IsEquals(str("test"), str("test"))); + EXPECT_TRUE(CpuFeatures_StringView_IsEquals(str("a"), str("a"))); + EXPECT_FALSE(CpuFeatures_StringView_IsEquals(str("a"), str("b"))); + EXPECT_FALSE(CpuFeatures_StringView_IsEquals(str("aa"), str("a"))); + EXPECT_FALSE(CpuFeatures_StringView_IsEquals(str("a"), str("aa"))); + EXPECT_FALSE(CpuFeatures_StringView_IsEquals(str("a"), kEmptyStringView)); + EXPECT_FALSE(CpuFeatures_StringView_IsEquals(kEmptyStringView, str("a"))); +} + +TEST(StringViewTest, CpuFeatures_StringView_PopFront) { + EXPECT_EQ(CpuFeatures_StringView_PopFront(str("test"), 2), str("st")); + EXPECT_EQ(CpuFeatures_StringView_PopFront(str("test"), 0), str("test")); + EXPECT_EQ(CpuFeatures_StringView_PopFront(str("test"), 4), str("")); + EXPECT_EQ(CpuFeatures_StringView_PopFront(str("test"), 100), str("")); +} + +TEST(StringViewTest, CpuFeatures_StringView_PopBack) { + EXPECT_EQ(CpuFeatures_StringView_PopBack(str("test"), 2), str("te")); + EXPECT_EQ(CpuFeatures_StringView_PopBack(str("test"), 0), str("test")); + EXPECT_EQ(CpuFeatures_StringView_PopBack(str("test"), 4), str("")); + EXPECT_EQ(CpuFeatures_StringView_PopBack(str("test"), 100), str("")); +} + +TEST(StringViewTest, CpuFeatures_StringView_KeepFront) { + EXPECT_EQ(CpuFeatures_StringView_KeepFront(str("test"), 2), str("te")); + EXPECT_EQ(CpuFeatures_StringView_KeepFront(str("test"), 0), str("")); + EXPECT_EQ(CpuFeatures_StringView_KeepFront(str("test"), 4), str("test")); + EXPECT_EQ(CpuFeatures_StringView_KeepFront(str("test"), 6), str("test")); +} + +TEST(StringViewTest, CpuFeatures_StringView_Front) { + EXPECT_EQ(CpuFeatures_StringView_Front(str("apple")), 'a'); + EXPECT_EQ(CpuFeatures_StringView_Front(str("a")), 'a'); +} + +TEST(StringViewTest, CpuFeatures_StringView_Back) { + EXPECT_EQ(CpuFeatures_StringView_Back(str("apple")), 'e'); + EXPECT_EQ(CpuFeatures_StringView_Back(str("a")), 'a'); +} + +TEST(StringViewTest, CpuFeatures_StringView_TrimWhitespace) { + EXPECT_EQ(CpuFeatures_StringView_TrimWhitespace(str(" first middle last ")), + str("first middle last")); + EXPECT_EQ(CpuFeatures_StringView_TrimWhitespace(str("first middle last ")), + str("first middle last")); + EXPECT_EQ(CpuFeatures_StringView_TrimWhitespace(str(" first middle last")), + str("first middle last")); + EXPECT_EQ(CpuFeatures_StringView_TrimWhitespace(str("first middle last")), + str("first middle last")); +} + +TEST(StringViewTest, CpuFeatures_StringView_ParsePositiveNumber) { + EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("42")), 42); + EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("0x2a")), 42); + EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("0x2A")), 42); + EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("0x2A2a")), 10794); + EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("0x2a2A")), 10794); + + EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("-10")), -1); + EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("-0x2A")), -1); + EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("abc")), -1); + EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("")), -1); +} + +TEST(StringViewTest, CpuFeatures_StringView_CopyString) { + char buf[4]; + buf[0] = 'X'; + + // Empty + CpuFeatures_StringView_CopyString(str(""), buf, sizeof(buf)); + EXPECT_STREQ(buf, ""); + + // Less + CpuFeatures_StringView_CopyString(str("a"), buf, sizeof(buf)); + EXPECT_STREQ(buf, "a"); + + // exact + CpuFeatures_StringView_CopyString(str("abc"), buf, sizeof(buf)); + EXPECT_STREQ(buf, "abc"); + + // More + CpuFeatures_StringView_CopyString(str("abcd"), buf, sizeof(buf)); + EXPECT_STREQ(buf, "abc"); +} + +TEST(StringViewTest, CpuFeatures_StringView_HasWord) { + // Find flags at beginning, middle and end. + EXPECT_TRUE( + CpuFeatures_StringView_HasWord(str("first middle last"), "first", ' ')); + EXPECT_TRUE( + CpuFeatures_StringView_HasWord(str("first middle last"), "middle", ' ')); + EXPECT_TRUE( + CpuFeatures_StringView_HasWord(str("first middle last"), "last", ' ')); + // Find flags at beginning, middle and end with a different separator + EXPECT_TRUE( + CpuFeatures_StringView_HasWord(str("first-middle-last"), "first", '-')); + EXPECT_TRUE( + CpuFeatures_StringView_HasWord(str("first-middle-last"), "middle", '-')); + EXPECT_TRUE( + CpuFeatures_StringView_HasWord(str("first-middle-last"), "last", '-')); + // Do not match partial flags + EXPECT_FALSE( + CpuFeatures_StringView_HasWord(str("first middle last"), "irst", ' ')); + EXPECT_FALSE( + CpuFeatures_StringView_HasWord(str("first middle last"), "mid", ' ')); + EXPECT_FALSE( + CpuFeatures_StringView_HasWord(str("first middle last"), "las", ' ')); +} + +TEST(StringViewTest, CpuFeatures_StringView_GetAttributeKeyValue) { + const StringView line = str(" key : first middle last "); + StringView key, value; + EXPECT_TRUE(CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)); + EXPECT_EQ(key, str("key")); + EXPECT_EQ(value, str("first middle last")); +} + +TEST(StringViewTest, FailingGetAttributeKeyValue) { + const StringView line = str("key first middle last"); + StringView key, value; + EXPECT_FALSE(CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)); +} + +} // namespace +} // namespace cpu_features diff --git a/node_modules/cpu-features/lib/index.js b/node_modules/cpu-features/lib/index.js new file mode 100644 index 00000000..bc3cff25 --- /dev/null +++ b/node_modules/cpu-features/lib/index.js @@ -0,0 +1,5 @@ +'use strict'; + +const binding = require('../build/Release/cpufeatures.node'); + +module.exports = binding.getCPUInfo; diff --git a/node_modules/cpu-features/package.json b/node_modules/cpu-features/package.json new file mode 100644 index 00000000..39d45fd7 --- /dev/null +++ b/node_modules/cpu-features/package.json @@ -0,0 +1,40 @@ +{ + "name": "cpu-features", + "version": "0.0.9", + "author": "Brian White ", + "description": "A simple binding to Google's cpu_features library for obtaining information about installed CPU(s)", + "main": "./lib/index", + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.17.0" + }, + "devDependencies": { + "@mscdex/eslint-config": "^1.1.0", + "eslint": "^7.0.0" + }, + "scripts": { + "install": "node buildcheck.js > buildcheck.gypi && node-gyp rebuild", + "test": "node test/test.js", + "lint": "eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js lib test", + "lint:fix": "npm run lint -- --fix" + }, + "engines": { + "node": ">=10.0.0" + }, + "keywords": [ + "cpu", + "detect", + "detection", + "features" + ], + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/mscdex/cpu-features/raw/master/LICENSE" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/mscdex/cpu-features.git" + } +} diff --git a/node_modules/cpu-features/src/binding.cc b/node_modules/cpu-features/src/binding.cc new file mode 100644 index 00000000..79052392 --- /dev/null +++ b/node_modules/cpu-features/src/binding.cc @@ -0,0 +1,151 @@ +#include +#include +#include +#include // isspace + +#include "cpu_features_macros.h" + +#if defined(CPU_FEATURES_ARCH_X86) +# include "cpuinfo_x86.h" +# define GetFeatureName GetX86FeaturesEnumName +# define GetFeatureValue GetX86FeaturesEnumValue +# define FeatureType X86Features +# define FeatureEnumType X86FeaturesEnum +# define LastFeature X86_LAST_ +#elif defined(CPU_FEATURES_ARCH_ARM) +# include "cpuinfo_arm.h" +# define GetFeatureName GetArmFeaturesEnumName +# define GetFeatureValue GetArmFeaturesEnumValue +# define FeatureType ArmFeatures +# define FeatureEnumType ArmFeaturesEnum +# define LastFeature ARM_LAST_ +#elif defined(CPU_FEATURES_ARCH_AARCH64) +# include "cpuinfo_aarch64.h" +# define GetFeatureName GetAarch64FeaturesEnumName +# define GetFeatureValue GetAarch64FeaturesEnumValue +# define FeatureType Aarch64Features +# define FeatureEnumType Aarch64FeaturesEnum +# define LastFeature AARCH64_LAST_ +#elif defined(CPU_FEATURES_ARCH_MIPS) +# include "cpuinfo_mips.h" +# define GetFeatureName GetMipsFeaturesEnumName +# define GetFeatureValue GetMipsFeaturesEnumValue +# define FeatureType MipsFeatures +# define FeatureEnumType MipsFeaturesEnum +# define LastFeature MIPS_LAST_ +#elif defined(CPU_FEATURES_ARCH_PPC) +# include "cpuinfo_ppc.h" +# define GetFeatureName GetPPCFeaturesEnumName +# define GetFeatureValue GetPPCFeaturesEnumValue +# define FeatureType PPCFeatures +# define FeatureEnumType PPCFeaturesEnum +# define LastFeature PPC_LAST_ +#endif + +#define SET_FLAG(key) \ +Nan::Set(ret, Nan::New(key).ToLocalChecked(), Nan::New(true)) + +#define SET_STR(key, val) \ +Nan::Set(ret, \ + Nan::New(key).ToLocalChecked(), \ + Nan::New(trim(val)).ToLocalChecked()) + +#define SET_NUM(key, val) \ +Nan::Set(ret, Nan::New(key).ToLocalChecked(), Nan::New(val)) + +#define SET_VAL(key, val) \ +Nan::Set(ret, Nan::New(key).ToLocalChecked(), val) + +using namespace node; +using namespace v8; +using namespace cpu_features; +using namespace std; + +static inline void ltrim(string& s) { + s.erase(s.begin(), find_if(s.begin(), s.end(), [](int ch) { + return !isspace(ch); + })); +} + +static inline void rtrim(string& s) { + s.erase(find_if(s.rbegin(), s.rend(), [](int ch) { + return !isspace(ch); + }).base(), s.end()); +} + +static inline string trim(const char* str) { + string ret = str; + ltrim(ret); + rtrim(ret); + return ret; +} + +#if defined(LastFeature) +Local GenerateFlags(const FeatureType* features) { + const auto ret = Nan::New(); + for (size_t i = 0; i < LastFeature; ++i) { + const auto enum_val = static_cast(i); + if (GetFeatureValue(features, enum_val)) + SET_FLAG(GetFeatureName(enum_val)); + } + return ret; +} +#endif + +NAN_METHOD(GetCPUInfo) { + const auto ret = Nan::New(); +#if defined(CPU_FEATURES_ARCH_X86) + const X86Info details = GetX86Info(); + SET_STR("arch", "x86"); + SET_STR("brand", details.brand_string); + SET_NUM("family", details.family); + SET_NUM("model", details.model); + SET_NUM("stepping", details.stepping); + SET_STR("uarch", + GetX86MicroarchitectureName(GetX86Microarchitecture(&details))); + SET_VAL("flags", GenerateFlags(&details.features)); +#elif defined(CPU_FEATURES_ARCH_ARM) + const ArmInfo details = GetArmInfo(); + SET_STR("arch", "arm"); + SET_NUM("implementer", details.implementer); + SET_NUM("architecture", details.architecture); + SET_NUM("variant", details.variant); + SET_NUM("part", details.part); + SET_NUM("revision", details.revision); + SET_VAL("flags", GenerateFlags(&details.features)); +#elif defined(CPU_FEATURES_ARCH_AARCH64) + const Aarch64Info details = GetAarch64Info(); + SET_STR("arch", "aarch64"); + SET_NUM("implementer", details.implementer); + SET_NUM("variant", details.variant); + SET_NUM("part", details.part); + SET_NUM("revision", details.revision); + SET_VAL("flags", GenerateFlags(&details.features)); +#elif defined(CPU_FEATURES_ARCH_MIPS) + const MipsInfo details = GetMipsInfo(); + SET_STR("arch", "mips"); + SET_VAL("flags", GenerateFlags(&details.features)); +#elif defined(CPU_FEATURES_ARCH_PPC) + const PPCInfo details = GetPPCInfo(); + const PPCPlatformStrings strings = GetPPCPlatformStrings(); + SET_STR("arch", "ppc"); + SET_STR("platform", strings.platform); + SET_STR("model", strings.model); + SET_STR("machine", strings.machine); + SET_STR("cpu", strings.cpu); + SET_STR("instruction set", strings.type.platform); + SET_STR("microarchitecture", strings.type.base_platform); + SET_VAL("flags", GenerateFlags(&details.features)); +#else + SET_STR("arch", "unknown"); + SET_VAL("flags", Nan::New()); +#endif + info.GetReturnValue().Set(ret); +} + +NAN_MODULE_INIT(init) { + Nan::Set(target, Nan::New("getCPUInfo").ToLocalChecked(), + Nan::GetFunction(Nan::New(GetCPUInfo)).ToLocalChecked()); +} + +NODE_MODULE(cpufeatures, init) diff --git a/node_modules/cpu-features/test/test.js b/node_modules/cpu-features/test/test.js new file mode 100644 index 00000000..1b22f64c --- /dev/null +++ b/node_modules/cpu-features/test/test.js @@ -0,0 +1,12 @@ +'use strict'; + +const assert = require('assert'); + +const info = require('../lib/index.js')(); + +console.log(info); +assert(typeof info === 'object' && info !== null); +assert(typeof info.arch === 'string' && info.arch); +assert(typeof info.flags === 'object' && info.flags !== null); +if (process.platform !== 'darwin' && process.arch !== 'arm64') + assert(Object.keys(info).length > 2); // Assume we are on a known platform diff --git a/node_modules/file-uri-to-path/.npmignore b/node_modules/file-uri-to-path/.npmignore new file mode 100644 index 00000000..07e6e472 --- /dev/null +++ b/node_modules/file-uri-to-path/.npmignore @@ -0,0 +1 @@ +/node_modules diff --git a/node_modules/file-uri-to-path/.travis.yml b/node_modules/file-uri-to-path/.travis.yml new file mode 100644 index 00000000..016bb6e7 --- /dev/null +++ b/node_modules/file-uri-to-path/.travis.yml @@ -0,0 +1,30 @@ +sudo: false + +language: node_js + +node_js: + - "0.8" + - "0.10" + - "0.12" + - "1" + - "2" + - "3" + - "4" + - "5" + - "6" + - "7" + - "8" + +install: + - PATH="`npm bin`:`npm bin -g`:$PATH" + # Node 0.8 comes with a too obsolete npm + - if [[ "`node --version`" =~ ^v0\.8\. ]]; then npm install -g npm@1.4.28 ; fi + # Install dependencies and build + - npm install + +script: + # Output useful info for debugging + - node --version + - npm --version + # Run tests + - npm test diff --git a/node_modules/file-uri-to-path/History.md b/node_modules/file-uri-to-path/History.md new file mode 100644 index 00000000..c8682be4 --- /dev/null +++ b/node_modules/file-uri-to-path/History.md @@ -0,0 +1,21 @@ + +1.0.0 / 2017-07-06 +================== + + * update "mocha" to v3 + * fixed unicode URI decoding (#6) + * add typings for Typescript + * README: use SVG Travis-CI badge + * add LICENSE file (MIT) + * add .travis.yml file (testing Node.js 0.8 through 8 currently) + * add README.md file + +0.0.2 / 2014-01-27 +================== + + * index: invert the path separators on Windows + +0.0.1 / 2014-01-27 +================== + + * initial commit diff --git a/node_modules/file-uri-to-path/LICENSE b/node_modules/file-uri-to-path/LICENSE new file mode 100644 index 00000000..e1af7838 --- /dev/null +++ b/node_modules/file-uri-to-path/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/file-uri-to-path/README.md b/node_modules/file-uri-to-path/README.md new file mode 100644 index 00000000..ab30be8f --- /dev/null +++ b/node_modules/file-uri-to-path/README.md @@ -0,0 +1,74 @@ +file-uri-to-path +================ +### Convert a `file:` URI to a file path +[![Build Status](https://travis-ci.org/TooTallNate/file-uri-to-path.svg?branch=master)](https://travis-ci.org/TooTallNate/file-uri-to-path) + +Accepts a `file:` URI and returns a regular file path suitable for use with the +`fs` module functions. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install file-uri-to-path +``` + + +Example +------- + +``` js +var uri2path = require('file-uri-to-path'); + +uri2path('file://localhost/c|/WINDOWS/clock.avi'); +// "c:\\WINDOWS\\clock.avi" + +uri2path('file:///c|/WINDOWS/clock.avi'); +// "c:\\WINDOWS\\clock.avi" + +uri2path('file://localhost/c:/WINDOWS/clock.avi'); +// "c:\\WINDOWS\\clock.avi" + +uri2path('file://hostname/path/to/the%20file.txt'); +// "\\\\hostname\\path\\to\\the file.txt" + +uri2path('file:///c:/path/to/the%20file.txt'); +// "c:\\path\\to\\the file.txt" +``` + + +API +--- + +### fileUriToPath(String uri) → String + + + +License +------- + +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/file-uri-to-path/index.d.ts b/node_modules/file-uri-to-path/index.d.ts new file mode 100644 index 00000000..99dc3f96 --- /dev/null +++ b/node_modules/file-uri-to-path/index.d.ts @@ -0,0 +1,2 @@ +declare function fileUriToPath(uri: string): string; +export = fileUriToPath; diff --git a/node_modules/file-uri-to-path/index.js b/node_modules/file-uri-to-path/index.js new file mode 100644 index 00000000..48cb280c --- /dev/null +++ b/node_modules/file-uri-to-path/index.js @@ -0,0 +1,66 @@ + +/** + * Module dependencies. + */ + +var sep = require('path').sep || '/'; + +/** + * Module exports. + */ + +module.exports = fileUriToPath; + +/** + * File URI to Path function. + * + * @param {String} uri + * @return {String} path + * @api public + */ + +function fileUriToPath (uri) { + if ('string' != typeof uri || + uri.length <= 7 || + 'file://' != uri.substring(0, 7)) { + throw new TypeError('must pass in a file:// URI to convert to a file path'); + } + + var rest = decodeURI(uri.substring(7)); + var firstSlash = rest.indexOf('/'); + var host = rest.substring(0, firstSlash); + var path = rest.substring(firstSlash + 1); + + // 2. Scheme Definition + // As a special case, can be the string "localhost" or the empty + // string; this is interpreted as "the machine from which the URL is + // being interpreted". + if ('localhost' == host) host = ''; + + if (host) { + host = sep + sep + host; + } + + // 3.2 Drives, drive letters, mount points, file system root + // Drive letters are mapped into the top of a file URI in various ways, + // depending on the implementation; some applications substitute + // vertical bar ("|") for the colon after the drive letter, yielding + // "file:///c|/tmp/test.txt". In some cases, the colon is left + // unchanged, as in "file:///c:/tmp/test.txt". In other cases, the + // colon is simply omitted, as in "file:///c/tmp/test.txt". + path = path.replace(/^(.+)\|/, '$1:'); + + // for Windows, we need to invert the path separators from what a URI uses + if (sep == '\\') { + path = path.replace(/\//g, '\\'); + } + + if (/^.+\:/.test(path)) { + // has Windows drive at beginning of path + } else { + // unix path… + path = sep + path; + } + + return host + path; +} diff --git a/node_modules/file-uri-to-path/package.json b/node_modules/file-uri-to-path/package.json new file mode 100644 index 00000000..b6a4a075 --- /dev/null +++ b/node_modules/file-uri-to-path/package.json @@ -0,0 +1,32 @@ +{ + "name": "file-uri-to-path", + "version": "1.0.0", + "description": "Convert a file: URI to a file path", + "main": "index.js", + "types": "index.d.ts", + "directories": { + "test": "test" + }, + "scripts": { + "test": "mocha --reporter spec" + }, + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/file-uri-to-path.git" + }, + "keywords": [ + "file", + "uri", + "convert", + "path" + ], + "author": "Nathan Rajlich (http://n8.io/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/TooTallNate/file-uri-to-path/issues" + }, + "homepage": "https://github.com/TooTallNate/file-uri-to-path", + "devDependencies": { + "mocha": "3" + } +} diff --git a/node_modules/file-uri-to-path/test/test.js b/node_modules/file-uri-to-path/test/test.js new file mode 100644 index 00000000..79305dca --- /dev/null +++ b/node_modules/file-uri-to-path/test/test.js @@ -0,0 +1,24 @@ + +var sep = require('path').sep || '/'; +var assert = require('assert'); +var uri2path = require('../'); +var tests = require('./tests.json'); + +describe('file-uri-to-path', function () { + + Object.keys(tests).forEach(function (uri) { + + // the test cases were generated from Windows' PathCreateFromUrlA() function. + // On Unix, we have to replace the path separator with the Unix one instead of + // the Windows one. + var expected = tests[uri].replace(/\\/g, sep); + + it('should convert ' + JSON.stringify(uri) + ' to ' + JSON.stringify(expected), + function () { + var actual = uri2path(uri); + assert.equal(actual, expected); + }); + + }); + +}); diff --git a/node_modules/file-uri-to-path/test/tests.json b/node_modules/file-uri-to-path/test/tests.json new file mode 100644 index 00000000..b935a639 --- /dev/null +++ b/node_modules/file-uri-to-path/test/tests.json @@ -0,0 +1,13 @@ +{ + "file://host/path": "\\\\host\\path", + "file://localhost/etc/fstab": "\\etc\\fstab", + "file:///etc/fstab": "\\etc\\fstab", + "file:///c:/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi", + "file://localhost/c|/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi", + "file:///c|/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi", + "file://localhost/c:/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi", + "file://hostname/path/to/the%20file.txt": "\\\\hostname\\path\\to\\the file.txt", + "file:///c:/path/to/the%20file.txt": "c:\\path\\to\\the file.txt", + "file:///C:/Documents%20and%20Settings/davris/FileSchemeURIs.doc": "C:\\Documents and Settings\\davris\\FileSchemeURIs.doc", + "file:///C:/caf%C3%A9/%C3%A5r/d%C3%BCnn/%E7%89%9B%E9%93%83/Ph%E1%BB%9F/%F0%9F%98%B5.exe": "C:\\café\\år\\dünn\\牛铃\\Phở\\😵.exe" +} diff --git a/node_modules/fsevents/.travis.yml b/node_modules/fsevents/.travis.yml new file mode 100644 index 00000000..7352e7ce --- /dev/null +++ b/node_modules/fsevents/.travis.yml @@ -0,0 +1,103 @@ +language: objective-c + + +env: + global: + - secure: "gve1nkeKkwFEG1VAT3i+JwYyAdF0gKXwKx0uxbkBTsmm2M+0MDusohQdFLoEIkSIFktXBIDefoa7iGpLKRfG2VsZLpwJgnvnD0HqbnuR+k+W+bu7BHt4CAaR6GTllsDCjyq9zNyhUThzSnf2WNIpOEF5kHspZlbGfawURuUJH/U=" + - secure: "jqVpmWxxBVXu2X8+XJMpKH0cooc2EKz9xKL2znBfYdNafJORSXcFAVbjCX5mZmVDcgIMwDtm2+gIG4P73hzJ2e3S+y2Z9ROJGyXHa3AxUTvXHQsxqzH8coHHqB8vTvfr0t2O5aKfpvpICpSea39r0hzNoMv6Ie5SwBdqj1YY9K0=" + matrix: + - NODE_VERSION="v13" + - NODE_VERSION="v12" + - NODE_VERSION="v11" + - NODE_VERSION="v10" + - NODE_VERSION="v9" + - NODE_VERSION="v8" + - NODE_VERSION="v7" + - NODE_VERSION="v6" + +before_install: + + - echo $TRAVIS_OS_NAME + + # commit + # ------------------------ + # The commit message is used to determine the whether to manually + # invoke a binary publish + + - COMMIT_MESSAGE=$(git show -s --format=%B $TRAVIS_COMMIT | tr -d '\n') + + # node + # ------------------------ + + - export PATH=./node_modules/.bin/:$PATH + - rm -rf ~/.nvm && git clone --depth 1 https://github.com/creationix/nvm.git ~/.nvm + - source ~/.nvm/nvm.sh + - nvm install $NODE_VERSION + - nvm use $NODE_VERSION + - npm install -g npm@3 + - node --version + - npm --version + - nvm --version + + # publish dependencies + # ------------------------ + + - npm install node-gyp -g + - npm install aws-sdk + +install: + + # in the first instance we build from source to create the initial binary + # which can then be used to create a package + + - npm install --build-from-source + - npm test + +before_script: + + # Detemine if a publish is required. + # + # a) we are building a tag + # b) we put [publish binary] in the commit message + + - PUBLISH_BINARY=false + + - if [[ $TRAVIS_BRANCH == `git describe --tags --always HEAD` ]]; then PUBLISH_BINARY=true; fi; # a + - if test "${COMMIT_MESSAGE#*'[publish binary]'}" != "$COMMIT_MESSAGE"; then PUBLISH_BINARY=true; fi; # b + + # package & publish + # ------------------------ + + - if [[ $PUBLISH_BINARY == true ]]; then ./node_modules/.bin/node-pre-gyp package publish; fi; + + # clean-up + # ------------------------ + + - ./node_modules/.bin/node-pre-gyp clean + - node-gyp clean + +script: + + # validate + # ------------------------ + # Post publishing a release verify that installing will pull down latest + # binary from remote host + + - INSTALL_RESULT=0 + - if [[ $PUBLISH_BINARY == true ]]; then INSTALL_RESULT=$(npm install --fallback-to-build=false > /dev/null)$? || true; fi; + + - ./node_modules/.bin/node-pre-gyp clean + + # failure? + # ------------------------ + # if install returned non zero (errored) then we first unpublish and then + # call false so travis will bail at this line. + + - if [[ $INSTALL_RESULT != 0 ]]; then ./node_modules/.bin/node-pre-gyp unpublish; fi; + - if [[ $INSTALL_RESULT != 0 ]]; then echo "returned $INSTALL_RESULT";false; fi; + +after_success: + + # display all published binaries + + - npm run node-pre-gyp info diff --git a/node_modules/fsevents/ISSUE_TEMPLATE.md b/node_modules/fsevents/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..426abbb7 --- /dev/null +++ b/node_modules/fsevents/ISSUE_TEMPLATE.md @@ -0,0 +1,8 @@ +If you are NOT on OS X and have come here to file an issue about compatibility problems, +please stop and go to #115 for your answer. + +You can look through many other similar closed issues as well if you're interested: +https://github.com/strongloop/fsevents/search?utf8=%E2%9C%93&q=%22notsup%22+OR+%22EBADPLATFORM%22&type=Issues. + +If you are here to report an issue observed while using this module on OS X, please delete +all this pre-filled text then go ahead and submit your report. diff --git a/node_modules/fsevents/LICENSE b/node_modules/fsevents/LICENSE new file mode 100644 index 00000000..4a49ad8d --- /dev/null +++ b/node_modules/fsevents/LICENSE @@ -0,0 +1,22 @@ +MIT License +----------- + +Copyright (C) 2010-2014 Philipp Dunkel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/fsevents/Readme.md b/node_modules/fsevents/Readme.md new file mode 100644 index 00000000..03ddfa94 --- /dev/null +++ b/node_modules/fsevents/Readme.md @@ -0,0 +1,78 @@ +# fsevents [![NPM](https://nodei.co/npm/fsevents.png)](https://nodei.co/npm/fsevents/) + +Native access to OS X FSEvents in [Node.js](http://nodejs.org/) + +The FSEvents API in OS X allows applications to register for notifications of +changes to a given directory tree. It is a very fast and lightweight alternative +to kqueue. + +This is a low-level library. For a cross-compatible file watching module that +uses fsevents, check out [Chokidar](https://www.npmjs.com/package/chokidar). + +* [Module Site & GitHub](https://github.com/strongloop/fsevents) +* [NPM Page](https://npmjs.org/package/fsevents) + +## Installation + + $ npm install fsevents + +## Usage + +```js +var fsevents = require('fsevents'); +var watcher = fsevents(__dirname); +watcher.on('fsevent', function(path, flags, id) { }); // RAW Event as emitted by OS-X +watcher.on('change', function(path, info) { }); // Common Event for all changes +watcher.start() // To start observation +watcher.stop() // To end observation +``` + +### Events + + * *fsevent* - RAW Event as emitted by OS-X + * *change* - Common Event for all changes + * *created* - A File-System-Item has been created + * *deleted* - A File-System-Item has been deleted + * *modified* - A File-System-Item has been modified + * *moved-out* - A File-System-Item has been moved away from this location + * *moved-in* - A File-System-Item has been moved into this location + +All events except *fsevent* take an *info* object as the second parameter of the callback. The structure of this object is: + +```js +{ + "event": "", + "id": , + "path": "", + "type": "", + "changes": { + "inode": true, // Has the iNode Meta-Information changed + "finder": false, // Has the Finder Meta-Data changed + "access": false, // Have the access permissions changed + "xattrs": false // Have the xAttributes changed + }, + "flags": +} +``` + +## MIT License + +Copyright (C) 2010-2014 Philipp Dunkel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/fsevents/binding.gyp b/node_modules/fsevents/binding.gyp new file mode 100644 index 00000000..7a5e5f6d --- /dev/null +++ b/node_modules/fsevents/binding.gyp @@ -0,0 +1,21 @@ +{ + "targets": [ + { "target_name": "" } + ], + "conditions": [ + ['OS=="mac"', { + "targets": [{ + "target_name": "fse", + "sources": ["fsevents.cc"], + "xcode_settings": { + "OTHER_LDFLAGS": [ + "-framework CoreFoundation -framework CoreServices" + ] + }, + "include_dirs": [ + "> $(depfile) +# Add extra rules as in (2). +# We remove slashes and replace spaces with new lines; +# remove blank lines; +# delete the first line and append a colon to the remaining lines. +sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ + grep -v '^$$' |\ + sed -e 1d -e 's|$$|:|' \ + >> $(depfile) +rm $(depfile).raw +endef + +# Command definitions: +# - cmd_foo is the actual command to run; +# - quiet_cmd_foo is the brief-output summary of the command. + +quiet_cmd_cc = CC($(TOOLSET)) $@ +cmd_cc = $(CC.$(TOOLSET)) -o $@ $< $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c + +quiet_cmd_cxx = CXX($(TOOLSET)) $@ +cmd_cxx = $(CXX.$(TOOLSET)) -o $@ $< $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c + +quiet_cmd_objc = CXX($(TOOLSET)) $@ +cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< + +quiet_cmd_objcxx = CXX($(TOOLSET)) $@ +cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# Commands for precompiled header files. +quiet_cmd_pch_c = CXX($(TOOLSET)) $@ +cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ +cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_m = CXX($(TOOLSET)) $@ +cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< +quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ +cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# gyp-mac-tool is written next to the root Makefile by gyp. +# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd +# already. +quiet_cmd_mac_tool = MACTOOL $(4) $< +cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" + +quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ +cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) + +quiet_cmd_infoplist = INFOPLIST $@ +cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" + +quiet_cmd_touch = TOUCH $@ +cmd_touch = touch $@ + +quiet_cmd_copy = COPY $@ +# send stderr to /dev/null to ignore messages when linking directories. +cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") + +quiet_cmd_symlink = SYMLINK $@ +cmd_symlink = ln -sf "$<" "$@" + +quiet_cmd_alink = LIBTOOL-STATIC $@ +cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %.o,$^) + +quiet_cmd_link = LINK($(TOOLSET)) $@ +cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink = SOLINK($(TOOLSET)) $@ +cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ +cmd_solink_module = $(LINK.$(TOOLSET)) -bundle $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) + + +# Define an escape_quotes function to escape single quotes. +# This allows us to handle quotes properly as long as we always use +# use single quotes and escape_quotes. +escape_quotes = $(subst ','\'',$(1)) +# This comment is here just to include a ' to unconfuse syntax highlighting. +# Define an escape_vars function to escape '$' variable syntax. +# This allows us to read/write command lines with shell variables (e.g. +# $LD_LIBRARY_PATH), without triggering make substitution. +escape_vars = $(subst $$,$$$$,$(1)) +# Helper that expands to a shell command to echo a string exactly as it is in +# make. This uses printf instead of echo because printf's behaviour with respect +# to escape sequences is more portable than echo's across different shells +# (e.g., dash, bash). +exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' + +# Helper to compare the command we're about to run against the command +# we logged the last time we ran the command. Produces an empty +# string (false) when the commands match. +# Tricky point: Make has no string-equality test function. +# The kernel uses the following, but it seems like it would have false +# positives, where one string reordered its arguments. +# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ +# $(filter-out $(cmd_$@), $(cmd_$(1)))) +# We instead substitute each for the empty string into the other, and +# say they're equal if both substitutions produce the empty string. +# .d files contain ? instead of spaces, take that into account. +command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ + $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) + +# Helper that is non-empty when a prerequisite changes. +# Normally make does this implicitly, but we force rules to always run +# so we can check their command lines. +# $? -- new prerequisites +# $| -- order-only dependencies +prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) + +# Helper that executes all postbuilds until one fails. +define do_postbuilds + @E=0;\ + for p in $(POSTBUILDS); do\ + eval $$p;\ + E=$$?;\ + if [ $$E -ne 0 ]; then\ + break;\ + fi;\ + done;\ + if [ $$E -ne 0 ]; then\ + rm -rf "$@";\ + exit $$E;\ + fi +endef + +# do_cmd: run a command via the above cmd_foo names, if necessary. +# Should always run for a given target to handle command-line changes. +# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. +# Third argument, if non-zero, makes it do POSTBUILDS processing. +# Note: We intentionally do NOT call dirx for depfile, since it contains ? for +# spaces already and dirx strips the ? characters. +define do_cmd +$(if $(or $(command_changed),$(prereq_changed)), + @$(call exact_echo, $($(quiet)cmd_$(1))) + @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" + $(if $(findstring flock,$(word 2,$(cmd_$1))), + @$(cmd_$(1)) + @echo " $(quiet_cmd_$(1)): Finished", + @$(cmd_$(1)) + ) + @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) + @$(if $(2),$(fixup_dep)) + $(if $(and $(3), $(POSTBUILDS)), + $(call do_postbuilds) + ) +) +endef + +# Declare the "all" target first so it is the default, +# even though we don't have the deps yet. +.PHONY: all +all: + +# make looks for ways to re-generate included makefiles, but in our case, we +# don't have a direct way. Explicitly telling make that it has nothing to do +# for them makes it go faster. +%.d: ; + +# Use FORCE_DO_CMD to force a target to run. Should be coupled with +# do_cmd. +.PHONY: FORCE_DO_CMD +FORCE_DO_CMD: + +TOOLSET := target +# Suffix rules, putting all outputs into $(obj). +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# Try building from generated source, too. +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + +$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + + +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,.target.mk)))),) + include .target.mk +endif +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,fse.target.mk)))),) + include fse.target.mk +endif + +quiet_cmd_regen_makefile = ACTION Regenerating $@ +cmd_regen_makefile = cd $(srcdir); /usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/spw/Library/Caches/node-gyp/20.6.1" "-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/spw/Library/Caches/node-gyp/20.6.1/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/spw/Documents/GitHub/sunpeiwen/node_modules/fsevents" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/Users/spw/Documents/GitHub/sunpeiwen/node_modules/fsevents/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/common.gypi "--toplevel-dir=." binding.gyp +Makefile: $(srcdir)/build/config.gypi $(srcdir)/../../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../Library/Caches/node-gyp/20.6.1/include/node/common.gypi + $(call do_cmd,regen_makefile) + +# "all" is a concatenation of the "all" targets from all the included +# sub-makefiles. This is just here to clarify. +all: + +# Add in dependency-tracking rules. $(all_deps) is the list of every single +# target in our tree. Only consider the ones with .d (dependency) info: +d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) +ifneq ($(d_files),) + include $(d_files) +endif diff --git a/node_modules/fsevents/build/Release/.deps/Release/.node.d b/node_modules/fsevents/build/Release/.deps/Release/.node.d new file mode 100644 index 00000000..abcdc89a --- /dev/null +++ b/node_modules/fsevents/build/Release/.deps/Release/.node.d @@ -0,0 +1 @@ +cmd_Release/.node := c++ -bundle -undefined dynamic_lookup -Wl,-search_paths_first -mmacosx-version-min=10.15 -arch x86_64 -L./Release -stdlib=libc++ -o Release/.node diff --git a/node_modules/fsevents/build/Release/.deps/Release/fse.node.d b/node_modules/fsevents/build/Release/.deps/Release/fse.node.d new file mode 100644 index 00000000..ee632bdf --- /dev/null +++ b/node_modules/fsevents/build/Release/.deps/Release/fse.node.d @@ -0,0 +1 @@ +cmd_Release/fse.node := c++ -bundle -framework CoreFoundation -framework CoreServices -undefined dynamic_lookup -Wl,-search_paths_first -mmacosx-version-min=10.15 -arch x86_64 -L./Release -stdlib=libc++ -o Release/fse.node Release/obj.target/fse/fsevents.o diff --git a/node_modules/fsevents/build/Release/.deps/Release/obj.target/fse/fsevents.o.d b/node_modules/fsevents/build/Release/.deps/Release/obj.target/fse/fsevents.o.d new file mode 100644 index 00000000..1ec5159a --- /dev/null +++ b/node_modules/fsevents/build/Release/.deps/Release/obj.target/fse/fsevents.o.d @@ -0,0 +1,156 @@ +cmd_Release/obj.target/fse/fsevents.o := c++ -o Release/obj.target/fse/fsevents.o ../fsevents.cc '-DNODE_GYP_MODULE_NAME=fse' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node -I/Users/spw/Library/Caches/node-gyp/20.6.1/src -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include -I../../nan -O3 -gdwarf-2 -flto -mmacosx-version-min=10.15 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -std=gnu++17 -stdlib=libc++ -fno-rtti -fno-exceptions -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/fse/fsevents.o.d.raw -c +Release/obj.target/fse/fsevents.o: ../fsevents.cc ../../nan/nan.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_version.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/errno.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/version.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/unix.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/threadpool.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/darwin.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/cppgc/common.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8config.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-array-buffer.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-local-handle.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-internal.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-version.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-object.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-maybe.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-persistent-handle.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-weak-callback-info.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-primitive.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-data.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-value.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-traced-handle.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-container.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-context.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-snapshot.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-date.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-debug.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-script.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-callbacks.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-promise.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-message.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-exception.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-extension.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-external.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-function.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-function-callback.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-template.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-memory-span.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-initialization.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-isolate.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-embedder-heap.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-microtask.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-statistics.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-unwinder.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-embedder-state-scope.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-platform.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-json.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-locker.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-microtask-queue.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-primitive-object.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-proxy.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-regexp.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-typed-array.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-value-serializer.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-wasm.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_api.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/js_native_api.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/js_native_api_types.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_api_types.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_buffer.h \ + /Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_object_wrap.h \ + ../../nan/nan_callbacks.h ../../nan/nan_callbacks_12_inl.h \ + ../../nan/nan_maybe_43_inl.h ../../nan/nan_converters.h \ + ../../nan/nan_converters_43_inl.h ../../nan/nan_new.h \ + ../../nan/nan_implementation_12_inl.h \ + ../../nan/nan_persistent_12_inl.h ../../nan/nan_weak.h \ + ../../nan/nan_object_wrap.h ../../nan/nan_private.h \ + ../../nan/nan_typedarray_contents.h ../../nan/nan_json.h \ + ../../nan/nan_scriptorigin.h ../src/storage.cc ../src/async.cc \ + ../src/thread.cc ../src/constants.cc ../src/methods.cc +../fsevents.cc: +../../nan/nan.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_version.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/errno.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/version.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/unix.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/threadpool.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/uv/darwin.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/cppgc/common.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8config.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-array-buffer.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-local-handle.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-internal.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-version.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-object.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-maybe.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-persistent-handle.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-weak-callback-info.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-primitive.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-data.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-value.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-traced-handle.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-container.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-context.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-snapshot.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-date.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-debug.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-script.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-callbacks.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-promise.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-message.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-exception.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-extension.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-external.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-function.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-function-callback.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-template.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-memory-span.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-initialization.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-isolate.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-embedder-heap.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-microtask.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-statistics.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-unwinder.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-embedder-state-scope.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-platform.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-json.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-locker.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-microtask-queue.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-primitive-object.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-proxy.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-regexp.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-typed-array.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-value-serializer.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/v8-wasm.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_api.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/js_native_api.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/js_native_api_types.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_api_types.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_buffer.h: +/Users/spw/Library/Caches/node-gyp/20.6.1/include/node/node_object_wrap.h: +../../nan/nan_callbacks.h: +../../nan/nan_callbacks_12_inl.h: +../../nan/nan_maybe_43_inl.h: +../../nan/nan_converters.h: +../../nan/nan_converters_43_inl.h: +../../nan/nan_new.h: +../../nan/nan_implementation_12_inl.h: +../../nan/nan_persistent_12_inl.h: +../../nan/nan_weak.h: +../../nan/nan_object_wrap.h: +../../nan/nan_private.h: +../../nan/nan_typedarray_contents.h: +../../nan/nan_json.h: +../../nan/nan_scriptorigin.h: +../src/storage.cc: +../src/async.cc: +../src/thread.cc: +../src/constants.cc: +../src/methods.cc: diff --git a/node_modules/fsevents/build/Release/.node b/node_modules/fsevents/build/Release/.node new file mode 100755 index 0000000000000000000000000000000000000000..7176e59f080af6935f904fbecbf4796cf7318285 GIT binary patch literal 16440 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≫}#UpL`W{)ISA(>j71oSP=GKV z;lHR1SSCjT9))log5}$9#<%3y0tx5#wxgfd6UPZ0*?;|;XH0|sJRYySj^`YH5IMua z{2+9363>pNQ|YFY`cww<$$bjPS3bB;(eTyJ@l#Zsz_EUcj&l7Wek#>`sGrJVIOI>ixjM`M%P{ zz(G}f6E^|}RcyQpC|FMH4qzJT^q2qA2&CR!!Htc?>sH)@6jvU^1r~bADRiX}kMp`; zdimqK=a*i7unT_axd*-3mzF)%RsZ*0>Enez=3Ty{@}(Q;N4dSn^@&R<#%p^f;_=_t zGYY1?sApt5&Kr6rq2s@rXA;CBk@n7xxYCul4JAen_fu+*GBc#y78Cd3*ab1ujX%1D zCrYQSU?*_>jw=v$lK1We;V2jG5-i$Xbkj{cGj-4_cAP13wv5Rnq9PI-meko474VUIqCUHB?-KJfO z8~i?;=^|VbWjEjm)vmq~WVrK28OFgYoiS9;X_<#)8(+6Y$=~m zkxR{APffuG9^&c3bl0qOzCW0jnAnP%6^cg~mu*Vo+MpYcz5EFVHl}#n+Ao{sp-c50 zPPSuB+3DEr+RVhi7fE+F3^(c$lRuUTU@rP1##uj&UF)x+OSC1%d;M&7qcW2LX8kg8 zH`GfPZ{3E{&2!t!f-*h{@VgcJykczum|d?-al37(pL;1j00;!#jrhdNSyzr)x^Xqw zuRu*XyIbi2)rlftJt--6Q+oxLxqa-Ks9O#O@il?w7EPlo4Uc$){JMq%VZ|M2aR)vA z#WFWMn_N*Q?kATL;7+;1YZHE@6_*cw)QB!5PbC+FF21dxucmBMD(SNETsag72l1s% z(&cD)SIHEy=M`4zBR*Wi=3nlmZEKyCghpF2U8mJ1nyM1>WyVCQbo|;KYce^NBC|-c zb|gcO)}}#0wP6FRJ?LFZ-@Jj%bs4`WD;3Sh#oSO)sC`*cb)YHShQ1Igy4tHa!i`0t zu)kgQE|dL5x|_A3A{rWutugHNH5U~Y7D*zju&GHZQrg;!d`h4&pj862#5GYi1|gv5 zXJg#JlsHl_)r60H$m74?gJOC7?g0C&(!C6>DQwkO$K`DddV(EARUUj*7h+Yoba6*} zQAu&(v_e~v*Wcs|H_I%)XldD{XwMMc81^fdwz5y`plz_}Co#w9Jogn%iA_Zs3t#Q? z&=W7lGJNEADJCEG73!s4d~qrYWM~a~P%jcStVYxO=o5sZsz6&C{N(cb<#~aCFH}@t zJv&rX<7t{x-%uE8UQ!ee1rttgy7=OvrM4n%^7*E;`Q>Gjp)ZKyo4U=3PW*Z=9OucW zp*U_75JfWPVM6iAG|D{m>73hEg3lv;;5zYU#A565CHw4&D^mDZhgz9K!KNa7p@BR4 zm=S1P8|%^L>1dSQQ>XCarwn4Y8h(}g%TP}y+hnCR&^(Ai(NRO+gwI;|r;Ca1uj@L7 z<@CR2vDf#!6F4(I@h+fErpXS#&YF4SQ|oBkH_Aw9@Dn^9$5=hFeT}g@qNm~uCw%V_ zGW5w~yjkIWE`&XgXR$nJwaU%MhZOwjg(kUOVZ-U`)?|>) zvf&$@a`U^PbVEoR|DcLJR&sBYoP3$@{|D{G^>Z>d?&1l@yxTsGJ-YGBsdO*gY{kcT kXL`(6o=1OEXglUR)naYxW1lajdvBNai9`2@LGQW$4>_SMoB#j- literal 0 HcmV?d00001 diff --git a/node_modules/fsevents/build/Release/obj.target/fse/fsevents.o b/node_modules/fsevents/build/Release/obj.target/fse/fsevents.o new file mode 100644 index 0000000000000000000000000000000000000000..758cb3ddfcfca30b02b4e8846054d3a583d2e43a GIT binary patch literal 489632 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

F+RUUNuIHdI)vXN?WmCsm~)G5BdM;JXR1 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

}xj5B{nVf4sZ;twBO> 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 Z`lF5y%lBVJt?@&^IBbnYT^j!Te*l@zDDeOQ literal 0 HcmV?d00001 diff --git a/node_modules/fsevents/build/binding.Makefile b/node_modules/fsevents/build/binding.Makefile new file mode 100644 index 00000000..94f59b01 --- /dev/null +++ b/node_modules/fsevents/build/binding.Makefile @@ -0,0 +1,6 @@ +# This file is generated by gyp; do not edit. + +export builddir_name ?= ./build/. +.PHONY: all +all: + $(MAKE) fse diff --git a/node_modules/fsevents/build/config.gypi b/node_modules/fsevents/build/config.gypi new file mode 100644 index 00000000..ccb95f49 --- /dev/null +++ b/node_modules/fsevents/build/config.gypi @@ -0,0 +1,418 @@ +# Do not edit. File was generated by node-gyp's "configure" step +{ + "target_defaults": { + "cflags": [], + "default_configuration": "Release", + "defines": [], + "include_dirs": [], + "libraries": [] + }, + "variables": { + "asan": 0, + "coverage": "false", + "dcheck_always_on": 0, + "debug_nghttp2": "false", + "debug_node": "false", + "enable_lto": "true", + "enable_pgo_generate": "false", + "enable_pgo_use": "false", + "error_on_warn": "false", + "force_dynamic_crt": 0, + "host_arch": "x64", + "icu_gyp_path": "tools/icu/icu-system.gyp", + "icu_small": "false", + "icu_ver_major": "73", + "is_debug": 0, + "libdir": "lib", + "llvm_version": "14.0", + "napi_build_version": "9", + "node_builtin_shareable_builtins": [ + "deps/cjs-module-lexer/lexer.js", + "deps/cjs-module-lexer/dist/lexer.js", + "deps/undici/undici.js" + ], + "node_byteorder": "little", + "node_debug_lib": "false", + "node_enable_d8": "false", + "node_enable_v8_vtunejit": "false", + "node_fipsinstall": "false", + "node_install_corepack": "false", + "node_install_npm": "false", + "node_library_files": [ + "lib/_http_agent.js", + "lib/_http_client.js", + "lib/_http_common.js", + "lib/_http_incoming.js", + "lib/_http_outgoing.js", + "lib/_http_server.js", + "lib/_stream_duplex.js", + "lib/_stream_passthrough.js", + "lib/_stream_readable.js", + "lib/_stream_transform.js", + "lib/_stream_wrap.js", + "lib/_stream_writable.js", + "lib/_tls_common.js", + "lib/_tls_wrap.js", + "lib/assert.js", + "lib/assert/strict.js", + "lib/async_hooks.js", + "lib/buffer.js", + "lib/child_process.js", + "lib/cluster.js", + "lib/console.js", + "lib/constants.js", + "lib/crypto.js", + "lib/dgram.js", + "lib/diagnostics_channel.js", + "lib/dns.js", + "lib/dns/promises.js", + "lib/domain.js", + "lib/events.js", + "lib/fs.js", + "lib/fs/promises.js", + "lib/http.js", + "lib/http2.js", + "lib/https.js", + "lib/inspector.js", + "lib/inspector/promises.js", + "lib/internal/abort_controller.js", + "lib/internal/assert.js", + "lib/internal/assert/assertion_error.js", + "lib/internal/assert/calltracker.js", + "lib/internal/async_hooks.js", + "lib/internal/blob.js", + "lib/internal/blocklist.js", + "lib/internal/bootstrap/node.js", + "lib/internal/bootstrap/realm.js", + "lib/internal/bootstrap/switches/does_not_own_process_state.js", + "lib/internal/bootstrap/switches/does_own_process_state.js", + "lib/internal/bootstrap/switches/is_main_thread.js", + "lib/internal/bootstrap/switches/is_not_main_thread.js", + "lib/internal/bootstrap/web/exposed-wildcard.js", + "lib/internal/bootstrap/web/exposed-window-or-worker.js", + "lib/internal/buffer.js", + "lib/internal/child_process.js", + "lib/internal/child_process/serialization.js", + "lib/internal/cli_table.js", + "lib/internal/cluster/child.js", + "lib/internal/cluster/primary.js", + "lib/internal/cluster/round_robin_handle.js", + "lib/internal/cluster/shared_handle.js", + "lib/internal/cluster/utils.js", + "lib/internal/cluster/worker.js", + "lib/internal/console/constructor.js", + "lib/internal/console/global.js", + "lib/internal/constants.js", + "lib/internal/crypto/aes.js", + "lib/internal/crypto/certificate.js", + "lib/internal/crypto/cfrg.js", + "lib/internal/crypto/cipher.js", + "lib/internal/crypto/diffiehellman.js", + "lib/internal/crypto/ec.js", + "lib/internal/crypto/hash.js", + "lib/internal/crypto/hashnames.js", + "lib/internal/crypto/hkdf.js", + "lib/internal/crypto/keygen.js", + "lib/internal/crypto/keys.js", + "lib/internal/crypto/mac.js", + "lib/internal/crypto/pbkdf2.js", + "lib/internal/crypto/random.js", + "lib/internal/crypto/rsa.js", + "lib/internal/crypto/scrypt.js", + "lib/internal/crypto/sig.js", + "lib/internal/crypto/util.js", + "lib/internal/crypto/webcrypto.js", + "lib/internal/crypto/webidl.js", + "lib/internal/crypto/x509.js", + "lib/internal/debugger/inspect.js", + "lib/internal/debugger/inspect_client.js", + "lib/internal/debugger/inspect_repl.js", + "lib/internal/dgram.js", + "lib/internal/dns/callback_resolver.js", + "lib/internal/dns/promises.js", + "lib/internal/dns/utils.js", + "lib/internal/encoding.js", + "lib/internal/error_serdes.js", + "lib/internal/errors.js", + "lib/internal/event_target.js", + "lib/internal/events/symbols.js", + "lib/internal/file.js", + "lib/internal/fixed_queue.js", + "lib/internal/freelist.js", + "lib/internal/freeze_intrinsics.js", + "lib/internal/fs/cp/cp-sync.js", + "lib/internal/fs/cp/cp.js", + "lib/internal/fs/dir.js", + "lib/internal/fs/promises.js", + "lib/internal/fs/read/context.js", + "lib/internal/fs/read/utf8.js", + "lib/internal/fs/recursive_watch.js", + "lib/internal/fs/rimraf.js", + "lib/internal/fs/streams.js", + "lib/internal/fs/sync_write_stream.js", + "lib/internal/fs/utils.js", + "lib/internal/fs/watchers.js", + "lib/internal/heap_utils.js", + "lib/internal/histogram.js", + "lib/internal/http.js", + "lib/internal/http2/compat.js", + "lib/internal/http2/core.js", + "lib/internal/http2/util.js", + "lib/internal/idna.js", + "lib/internal/inspector_async_hook.js", + "lib/internal/js_stream_socket.js", + "lib/internal/legacy/processbinding.js", + "lib/internal/linkedlist.js", + "lib/internal/main/check_syntax.js", + "lib/internal/main/embedding.js", + "lib/internal/main/eval_stdin.js", + "lib/internal/main/eval_string.js", + "lib/internal/main/inspect.js", + "lib/internal/main/mksnapshot.js", + "lib/internal/main/print_help.js", + "lib/internal/main/prof_process.js", + "lib/internal/main/repl.js", + "lib/internal/main/run_main_module.js", + "lib/internal/main/test_runner.js", + "lib/internal/main/watch_mode.js", + "lib/internal/main/worker_thread.js", + "lib/internal/mime.js", + "lib/internal/modules/cjs/loader.js", + "lib/internal/modules/esm/assert.js", + "lib/internal/modules/esm/create_dynamic_module.js", + "lib/internal/modules/esm/fetch_module.js", + "lib/internal/modules/esm/formats.js", + "lib/internal/modules/esm/get_format.js", + "lib/internal/modules/esm/handle_process_exit.js", + "lib/internal/modules/esm/hooks.js", + "lib/internal/modules/esm/initialize_import_meta.js", + "lib/internal/modules/esm/load.js", + "lib/internal/modules/esm/loader.js", + "lib/internal/modules/esm/module_job.js", + "lib/internal/modules/esm/module_map.js", + "lib/internal/modules/esm/package_config.js", + "lib/internal/modules/esm/resolve.js", + "lib/internal/modules/esm/shared_constants.js", + "lib/internal/modules/esm/translators.js", + "lib/internal/modules/esm/utils.js", + "lib/internal/modules/esm/worker.js", + "lib/internal/modules/helpers.js", + "lib/internal/modules/package_json_reader.js", + "lib/internal/modules/run_main.js", + "lib/internal/net.js", + "lib/internal/options.js", + "lib/internal/per_context/domexception.js", + "lib/internal/per_context/messageport.js", + "lib/internal/per_context/primordials.js", + "lib/internal/perf/event_loop_delay.js", + "lib/internal/perf/event_loop_utilization.js", + "lib/internal/perf/nodetiming.js", + "lib/internal/perf/observe.js", + "lib/internal/perf/performance.js", + "lib/internal/perf/performance_entry.js", + "lib/internal/perf/resource_timing.js", + "lib/internal/perf/timerify.js", + "lib/internal/perf/usertiming.js", + "lib/internal/perf/utils.js", + "lib/internal/policy/manifest.js", + "lib/internal/policy/sri.js", + "lib/internal/priority_queue.js", + "lib/internal/process/esm_loader.js", + "lib/internal/process/execution.js", + "lib/internal/process/per_thread.js", + "lib/internal/process/permission.js", + "lib/internal/process/policy.js", + "lib/internal/process/pre_execution.js", + "lib/internal/process/promises.js", + "lib/internal/process/report.js", + "lib/internal/process/signal.js", + "lib/internal/process/task_queues.js", + "lib/internal/process/warning.js", + "lib/internal/process/worker_thread_only.js", + "lib/internal/promise_hooks.js", + "lib/internal/querystring.js", + "lib/internal/readline/callbacks.js", + "lib/internal/readline/emitKeypressEvents.js", + "lib/internal/readline/interface.js", + "lib/internal/readline/promises.js", + "lib/internal/readline/utils.js", + "lib/internal/repl.js", + "lib/internal/repl/await.js", + "lib/internal/repl/history.js", + "lib/internal/repl/utils.js", + "lib/internal/socket_list.js", + "lib/internal/socketaddress.js", + "lib/internal/source_map/prepare_stack_trace.js", + "lib/internal/source_map/source_map.js", + "lib/internal/source_map/source_map_cache.js", + "lib/internal/stream_base_commons.js", + "lib/internal/streams/add-abort-signal.js", + "lib/internal/streams/buffer_list.js", + "lib/internal/streams/compose.js", + "lib/internal/streams/destroy.js", + "lib/internal/streams/duplex.js", + "lib/internal/streams/duplexify.js", + "lib/internal/streams/end-of-stream.js", + "lib/internal/streams/from.js", + "lib/internal/streams/lazy_transform.js", + "lib/internal/streams/legacy.js", + "lib/internal/streams/operators.js", + "lib/internal/streams/passthrough.js", + "lib/internal/streams/pipeline.js", + "lib/internal/streams/readable.js", + "lib/internal/streams/state.js", + "lib/internal/streams/transform.js", + "lib/internal/streams/utils.js", + "lib/internal/streams/writable.js", + "lib/internal/structured_clone.js", + "lib/internal/test/binding.js", + "lib/internal/test/transfer.js", + "lib/internal/test_runner/coverage.js", + "lib/internal/test_runner/harness.js", + "lib/internal/test_runner/mock/mock.js", + "lib/internal/test_runner/mock/mock_timers.js", + "lib/internal/test_runner/reporter/dot.js", + "lib/internal/test_runner/reporter/spec.js", + "lib/internal/test_runner/reporter/tap.js", + "lib/internal/test_runner/reporter/v8-serializer.js", + "lib/internal/test_runner/runner.js", + "lib/internal/test_runner/test.js", + "lib/internal/test_runner/tests_stream.js", + "lib/internal/test_runner/utils.js", + "lib/internal/timers.js", + "lib/internal/tls/secure-context.js", + "lib/internal/tls/secure-pair.js", + "lib/internal/trace_events_async_hooks.js", + "lib/internal/tty.js", + "lib/internal/url.js", + "lib/internal/util.js", + "lib/internal/util/colors.js", + "lib/internal/util/comparisons.js", + "lib/internal/util/debuglog.js", + "lib/internal/util/embedding.js", + "lib/internal/util/inspect.js", + "lib/internal/util/inspector.js", + "lib/internal/util/iterable_weak_map.js", + "lib/internal/util/parse_args/parse_args.js", + "lib/internal/util/parse_args/utils.js", + "lib/internal/util/types.js", + "lib/internal/v8/startup_snapshot.js", + "lib/internal/v8_prof_polyfill.js", + "lib/internal/v8_prof_processor.js", + "lib/internal/validators.js", + "lib/internal/vm.js", + "lib/internal/vm/module.js", + "lib/internal/wasm_web_api.js", + "lib/internal/watch_mode/files_watcher.js", + "lib/internal/watchdog.js", + "lib/internal/webidl.js", + "lib/internal/webstreams/adapters.js", + "lib/internal/webstreams/compression.js", + "lib/internal/webstreams/encoding.js", + "lib/internal/webstreams/queuingstrategies.js", + "lib/internal/webstreams/readablestream.js", + "lib/internal/webstreams/transfer.js", + "lib/internal/webstreams/transformstream.js", + "lib/internal/webstreams/util.js", + "lib/internal/webstreams/writablestream.js", + "lib/internal/worker.js", + "lib/internal/worker/io.js", + "lib/internal/worker/js_transferable.js", + "lib/module.js", + "lib/net.js", + "lib/os.js", + "lib/path.js", + "lib/path/posix.js", + "lib/path/win32.js", + "lib/perf_hooks.js", + "lib/process.js", + "lib/punycode.js", + "lib/querystring.js", + "lib/readline.js", + "lib/readline/promises.js", + "lib/repl.js", + "lib/stream.js", + "lib/stream/consumers.js", + "lib/stream/promises.js", + "lib/stream/web.js", + "lib/string_decoder.js", + "lib/sys.js", + "lib/test.js", + "lib/test/reporters.js", + "lib/timers.js", + "lib/timers/promises.js", + "lib/tls.js", + "lib/trace_events.js", + "lib/tty.js", + "lib/url.js", + "lib/util.js", + "lib/util/types.js", + "lib/v8.js", + "lib/vm.js", + "lib/wasi.js", + "lib/worker_threads.js", + "lib/zlib.js" + ], + "node_module_version": 115, + "node_no_browser_globals": "false", + "node_prefix": "/usr/local/Cellar/node/20.6.1", + "node_release_urlbase": "", + "node_shared": "false", + "node_shared_brotli": "true", + "node_shared_cares": "true", + "node_shared_http_parser": "false", + "node_shared_libuv": "true", + "node_shared_nghttp2": "true", + "node_shared_nghttp3": "false", + "node_shared_ngtcp2": "false", + "node_shared_openssl": "true", + "node_shared_zlib": "true", + "node_tag": "", + "node_target_type": "executable", + "node_use_bundled_v8": "true", + "node_use_node_code_cache": "true", + "node_use_node_snapshot": "true", + "node_use_openssl": "true", + "node_use_v8_platform": "true", + "node_with_ltcg": "false", + "node_without_node_options": "false", + "openssl_is_fips": "false", + "openssl_quic": "false", + "ossfuzz": "false", + "shlib_suffix": "115.dylib", + "single_executable_application": "true", + "target_arch": "x64", + "v8_enable_31bit_smis_on_64bit_arch": 0, + "v8_enable_gdbjit": 0, + "v8_enable_hugepage": 0, + "v8_enable_i18n_support": 1, + "v8_enable_inspector": 1, + "v8_enable_javascript_promise_hooks": 1, + "v8_enable_lite_mode": 0, + "v8_enable_object_print": 1, + "v8_enable_pointer_compression": 0, + "v8_enable_shared_ro_heap": 1, + "v8_enable_short_builtin_calls": 1, + "v8_enable_webassembly": 1, + "v8_no_strict_aliasing": 1, + "v8_optimized_debug": 1, + "v8_promise_internal_field_count": 1, + "v8_random_seed": 0, + "v8_trace_maps": 0, + "v8_use_siphash": 1, + "want_separate_host_toolset": 0, + "nodedir": "/Users/spw/Library/Caches/node-gyp/20.6.1", + "standalone_static_library": 1, + "metrics_registry": "https://registry.npmjs.org/", + "global_prefix": "/usr/local", + "local_prefix": "/Users/spw/Documents/GitHub/sunpeiwen", + "globalconfig": "/usr/local/etc/npmrc", + "init_module": "/Users/spw/.npm-init.js", + "userconfig": "/Users/spw/.npmrc", + "npm_version": "9.8.1", + "node_gyp": "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js", + "cache": "/Users/spw/.npm", + "user_agent": "npm/9.8.1 node/v20.6.1 darwin x64 workspaces/false", + "prefix": "/usr/local" + } +} diff --git a/node_modules/fsevents/build/fse.target.mk b/node_modules/fsevents/build/fse.target.mk new file mode 100644 index 00000000..b87d9aae --- /dev/null +++ b/node_modules/fsevents/build/fse.target.mk @@ -0,0 +1,191 @@ +# This file is generated by gyp; do not edit. + +TOOLSET := target +TARGET := fse +DEFS_Debug := \ + '-DNODE_GYP_MODULE_NAME=fse' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-DV8_DEPRECATION_WARNINGS' \ + '-DV8_IMMINENT_DEPRECATION_WARNINGS' \ + '-D_GLIBCXX_USE_CXX11_ABI=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DBUILDING_NODE_EXTENSION' \ + '-DDEBUG' \ + '-D_DEBUG' \ + '-DV8_ENABLE_CHECKS' + +# Flags passed to all source files. +CFLAGS_Debug := \ + -O0 \ + -gdwarf-2 \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Debug := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Debug := \ + -std=gnu++17 \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Debug := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Debug := + +INCS_Debug := \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/src \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include \ + -I$(srcdir)/../nan + +DEFS_Release := \ + '-DNODE_GYP_MODULE_NAME=fse' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-DV8_DEPRECATION_WARNINGS' \ + '-DV8_IMMINENT_DEPRECATION_WARNINGS' \ + '-D_GLIBCXX_USE_CXX11_ABI=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DBUILDING_NODE_EXTENSION' + +# Flags passed to all source files. +CFLAGS_Release := \ + -O3 \ + -gdwarf-2 \ + -flto \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Release := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Release := \ + -std=gnu++17 \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Release := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Release := + +INCS_Release := \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/include/node \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/src \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/config \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/openssl/openssl/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/uv/include \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/zlib \ + -I/Users/spw/Library/Caches/node-gyp/20.6.1/deps/v8/include \ + -I$(srcdir)/../nan + +OBJS := \ + $(obj).target/$(TARGET)/fsevents.o + +# Add to the list of files we specially track dependencies for. +all_deps += $(OBJS) + +# CFLAGS et al overrides must be target-local. +# See "Target-specific Variable Values" in the GNU Make manual. +$(OBJS): TOOLSET := $(TOOLSET) +$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) +$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) + +# Suffix rules, putting all outputs into $(obj). + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# Try building from generated source, too. + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# End of this set of suffix rules +### Rules for final target. +LDFLAGS_Debug := \ + -framework CoreFoundation -framework CoreServices \ + -undefined dynamic_lookup \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Debug := \ + -framework CoreFoundation -framework CoreServices \ + -undefined dynamic_lookup \ + -Wl,-search_paths_first + +LDFLAGS_Release := \ + -framework CoreFoundation -framework CoreServices \ + -undefined dynamic_lookup \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.15 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Release := \ + -framework CoreFoundation -framework CoreServices \ + -undefined dynamic_lookup \ + -Wl,-search_paths_first + +LIBS := + +$(builddir)/fse.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) +$(builddir)/fse.node: LIBS := $(LIBS) +$(builddir)/fse.node: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE)) +$(builddir)/fse.node: TOOLSET := $(TOOLSET) +$(builddir)/fse.node: $(OBJS) FORCE_DO_CMD + $(call do_cmd,solink_module) + +all_deps += $(builddir)/fse.node +# Add target alias +.PHONY: fse +fse: $(builddir)/fse.node + +# Short alias for building this executable. +.PHONY: fse.node +fse.node: $(builddir)/fse.node + +# Add executable to "all" target. +.PHONY: all +all: $(builddir)/fse.node + diff --git a/node_modules/fsevents/build/gyp-mac-tool b/node_modules/fsevents/build/gyp-mac-tool new file mode 100755 index 00000000..ffef860c --- /dev/null +++ b/node_modules/fsevents/build/gyp-mac-tool @@ -0,0 +1,772 @@ +#!/usr/bin/env python3 +# Generated by gyp. Do not edit. +# Copyright (c) 2012 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Utility functions to perform Xcode-style build steps. + +These functions are executed via gyp-mac-tool when using the Makefile generator. +""" + + +import fcntl +import fnmatch +import glob +import json +import os +import plistlib +import re +import shutil +import struct +import subprocess +import sys +import tempfile + + +def main(args): + executor = MacTool() + exit_code = executor.Dispatch(args) + if exit_code is not None: + sys.exit(exit_code) + + +class MacTool: + """This class performs all the Mac tooling steps. The methods can either be + executed directly, or dispatched from an argument list.""" + + def Dispatch(self, args): + """Dispatches a string command to a method.""" + if len(args) < 1: + raise Exception("Not enough arguments") + + method = "Exec%s" % self._CommandifyName(args[0]) + return getattr(self, method)(*args[1:]) + + def _CommandifyName(self, name_string): + """Transforms a tool name like copy-info-plist to CopyInfoPlist""" + return name_string.title().replace("-", "") + + def ExecCopyBundleResource(self, source, dest, convert_to_binary): + """Copies a resource file to the bundle/Resources directory, performing any + necessary compilation on each resource.""" + convert_to_binary = convert_to_binary == "True" + extension = os.path.splitext(source)[1].lower() + if os.path.isdir(source): + # Copy tree. + # TODO(thakis): This copies file attributes like mtime, while the + # single-file branch below doesn't. This should probably be changed to + # be consistent with the single-file branch. + if os.path.exists(dest): + shutil.rmtree(dest) + shutil.copytree(source, dest) + elif extension == ".xib": + return self._CopyXIBFile(source, dest) + elif extension == ".storyboard": + return self._CopyXIBFile(source, dest) + elif extension == ".strings" and not convert_to_binary: + self._CopyStringsFile(source, dest) + else: + if os.path.exists(dest): + os.unlink(dest) + shutil.copy(source, dest) + + if convert_to_binary and extension in (".plist", ".strings"): + self._ConvertToBinary(dest) + + def _CopyXIBFile(self, source, dest): + """Compiles a XIB file with ibtool into a binary plist in the bundle.""" + + # ibtool sometimes crashes with relative paths. See crbug.com/314728. + base = os.path.dirname(os.path.realpath(__file__)) + if os.path.relpath(source): + source = os.path.join(base, source) + if os.path.relpath(dest): + dest = os.path.join(base, dest) + + args = ["xcrun", "ibtool", "--errors", "--warnings", "--notices"] + + if os.environ["XCODE_VERSION_ACTUAL"] > "0700": + args.extend(["--auto-activate-custom-fonts"]) + if "IPHONEOS_DEPLOYMENT_TARGET" in os.environ: + args.extend( + [ + "--target-device", + "iphone", + "--target-device", + "ipad", + "--minimum-deployment-target", + os.environ["IPHONEOS_DEPLOYMENT_TARGET"], + ] + ) + else: + args.extend( + [ + "--target-device", + "mac", + "--minimum-deployment-target", + os.environ["MACOSX_DEPLOYMENT_TARGET"], + ] + ) + + args.extend( + ["--output-format", "human-readable-text", "--compile", dest, source] + ) + + ibtool_section_re = re.compile(r"/\*.*\*/") + ibtool_re = re.compile(r".*note:.*is clipping its content") + try: + stdout = subprocess.check_output(args) + except subprocess.CalledProcessError as e: + print(e.output) + raise + current_section_header = None + for line in stdout.splitlines(): + if ibtool_section_re.match(line): + current_section_header = line + elif not ibtool_re.match(line): + if current_section_header: + print(current_section_header) + current_section_header = None + print(line) + return 0 + + def _ConvertToBinary(self, dest): + subprocess.check_call( + ["xcrun", "plutil", "-convert", "binary1", "-o", dest, dest] + ) + + def _CopyStringsFile(self, source, dest): + """Copies a .strings file using iconv to reconvert the input into UTF-16.""" + input_code = self._DetectInputEncoding(source) or "UTF-8" + + # Xcode's CpyCopyStringsFile / builtin-copyStrings seems to call + # CFPropertyListCreateFromXMLData() behind the scenes; at least it prints + # CFPropertyListCreateFromXMLData(): Old-style plist parser: missing + # semicolon in dictionary. + # on invalid files. Do the same kind of validation. + import CoreFoundation + + with open(source, "rb") as in_file: + s = in_file.read() + d = CoreFoundation.CFDataCreate(None, s, len(s)) + _, error = CoreFoundation.CFPropertyListCreateFromXMLData(None, d, 0, None) + if error: + return + + with open(dest, "wb") as fp: + fp.write(s.decode(input_code).encode("UTF-16")) + + def _DetectInputEncoding(self, file_name): + """Reads the first few bytes from file_name and tries to guess the text + encoding. Returns None as a guess if it can't detect it.""" + with open(file_name, "rb") as fp: + try: + header = fp.read(3) + except Exception: + return None + if header.startswith(b"\xFE\xFF"): + return "UTF-16" + elif header.startswith(b"\xFF\xFE"): + return "UTF-16" + elif header.startswith(b"\xEF\xBB\xBF"): + return "UTF-8" + else: + return None + + def ExecCopyInfoPlist(self, source, dest, convert_to_binary, *keys): + """Copies the |source| Info.plist to the destination directory |dest|.""" + # Read the source Info.plist into memory. + with open(source) as fd: + lines = fd.read() + + # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild). + plist = plistlib.readPlistFromString(lines) + if keys: + plist.update(json.loads(keys[0])) + lines = plistlib.writePlistToString(plist) + + # Go through all the environment variables and replace them as variables in + # the file. + IDENT_RE = re.compile(r"[_/\s]") + for key in os.environ: + if key.startswith("_"): + continue + evar = "${%s}" % key + evalue = os.environ[key] + lines = lines.replace(lines, evar, evalue) + + # Xcode supports various suffices on environment variables, which are + # all undocumented. :rfc1034identifier is used in the standard project + # template these days, and :identifier was used earlier. They are used to + # convert non-url characters into things that look like valid urls -- + # except that the replacement character for :identifier, '_' isn't valid + # in a URL either -- oops, hence :rfc1034identifier was born. + evar = "${%s:identifier}" % key + evalue = IDENT_RE.sub("_", os.environ[key]) + lines = lines.replace(lines, evar, evalue) + + evar = "${%s:rfc1034identifier}" % key + evalue = IDENT_RE.sub("-", os.environ[key]) + lines = lines.replace(lines, evar, evalue) + + # Remove any keys with values that haven't been replaced. + lines = lines.splitlines() + for i in range(len(lines)): + if lines[i].strip().startswith("${"): + lines[i] = None + lines[i - 1] = None + lines = "\n".join(line for line in lines if line is not None) + + # Write out the file with variables replaced. + with open(dest, "w") as fd: + fd.write(lines) + + # Now write out PkgInfo file now that the Info.plist file has been + # "compiled". + self._WritePkgInfo(dest) + + if convert_to_binary == "True": + self._ConvertToBinary(dest) + + def _WritePkgInfo(self, info_plist): + """This writes the PkgInfo file from the data stored in Info.plist.""" + plist = plistlib.readPlist(info_plist) + if not plist: + return + + # Only create PkgInfo for executable types. + package_type = plist["CFBundlePackageType"] + if package_type != "APPL": + return + + # The format of PkgInfo is eight characters, representing the bundle type + # and bundle signature, each four characters. If that is missing, four + # '?' characters are used instead. + signature_code = plist.get("CFBundleSignature", "????") + if len(signature_code) != 4: # Wrong length resets everything, too. + signature_code = "?" * 4 + + dest = os.path.join(os.path.dirname(info_plist), "PkgInfo") + with open(dest, "w") as fp: + fp.write(f"{package_type}{signature_code}") + + def ExecFlock(self, lockfile, *cmd_list): + """Emulates the most basic behavior of Linux's flock(1).""" + # Rely on exception handling to report errors. + fd = os.open(lockfile, os.O_RDONLY | os.O_NOCTTY | os.O_CREAT, 0o666) + fcntl.flock(fd, fcntl.LOCK_EX) + return subprocess.call(cmd_list) + + def ExecFilterLibtool(self, *cmd_list): + """Calls libtool and filters out '/path/to/libtool: file: foo.o has no + symbols'.""" + libtool_re = re.compile( + r"^.*libtool: (?:for architecture: \S* )?" r"file: .* has no symbols$" + ) + libtool_re5 = re.compile( + r"^.*libtool: warning for library: " + + r".* the table of contents is empty " + + r"\(no object file members in the library define global symbols\)$" + ) + env = os.environ.copy() + # Ref: + # http://www.opensource.apple.com/source/cctools/cctools-809/misc/libtool.c + # The problem with this flag is that it resets the file mtime on the file to + # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone. + env["ZERO_AR_DATE"] = "1" + libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env) + err = libtoolout.communicate()[1].decode("utf-8") + for line in err.splitlines(): + if not libtool_re.match(line) and not libtool_re5.match(line): + print(line, file=sys.stderr) + # Unconditionally touch the output .a file on the command line if present + # and the command succeeded. A bit hacky. + if not libtoolout.returncode: + for i in range(len(cmd_list) - 1): + if cmd_list[i] == "-o" and cmd_list[i + 1].endswith(".a"): + os.utime(cmd_list[i + 1], None) + break + return libtoolout.returncode + + def ExecPackageIosFramework(self, framework): + # Find the name of the binary based on the part before the ".framework". + binary = os.path.basename(framework).split(".")[0] + module_path = os.path.join(framework, "Modules") + if not os.path.exists(module_path): + os.mkdir(module_path) + module_template = ( + "framework module %s {\n" + ' umbrella header "%s.h"\n' + "\n" + " export *\n" + " module * { export * }\n" + "}\n" % (binary, binary) + ) + + with open(os.path.join(module_path, "module.modulemap"), "w") as module_file: + module_file.write(module_template) + + def ExecPackageFramework(self, framework, version): + """Takes a path to Something.framework and the Current version of that and + sets up all the symlinks.""" + # Find the name of the binary based on the part before the ".framework". + binary = os.path.basename(framework).split(".")[0] + + CURRENT = "Current" + RESOURCES = "Resources" + VERSIONS = "Versions" + + if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): + # Binary-less frameworks don't seem to contain symlinks (see e.g. + # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). + return + + # Move into the framework directory to set the symlinks correctly. + pwd = os.getcwd() + os.chdir(framework) + + # Set up the Current version. + self._Relink(version, os.path.join(VERSIONS, CURRENT)) + + # Set up the root symlinks. + self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) + self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) + + # Back to where we were before! + os.chdir(pwd) + + def _Relink(self, dest, link): + """Creates a symlink to |dest| named |link|. If |link| already exists, + it is overwritten.""" + if os.path.lexists(link): + os.remove(link) + os.symlink(dest, link) + + def ExecCompileIosFrameworkHeaderMap(self, out, framework, *all_headers): + framework_name = os.path.basename(framework).split(".")[0] + all_headers = [os.path.abspath(header) for header in all_headers] + filelist = {} + for header in all_headers: + filename = os.path.basename(header) + filelist[filename] = header + filelist[os.path.join(framework_name, filename)] = header + WriteHmap(out, filelist) + + def ExecCopyIosFrameworkHeaders(self, framework, *copy_headers): + header_path = os.path.join(framework, "Headers") + if not os.path.exists(header_path): + os.makedirs(header_path) + for header in copy_headers: + shutil.copy(header, os.path.join(header_path, os.path.basename(header))) + + def ExecCompileXcassets(self, keys, *inputs): + """Compiles multiple .xcassets files into a single .car file. + + This invokes 'actool' to compile all the inputs .xcassets files. The + |keys| arguments is a json-encoded dictionary of extra arguments to + pass to 'actool' when the asset catalogs contains an application icon + or a launch image. + + Note that 'actool' does not create the Assets.car file if the asset + catalogs does not contains imageset. + """ + command_line = [ + "xcrun", + "actool", + "--output-format", + "human-readable-text", + "--compress-pngs", + "--notices", + "--warnings", + "--errors", + ] + is_iphone_target = "IPHONEOS_DEPLOYMENT_TARGET" in os.environ + if is_iphone_target: + platform = os.environ["CONFIGURATION"].split("-")[-1] + if platform not in ("iphoneos", "iphonesimulator"): + platform = "iphonesimulator" + command_line.extend( + [ + "--platform", + platform, + "--target-device", + "iphone", + "--target-device", + "ipad", + "--minimum-deployment-target", + os.environ["IPHONEOS_DEPLOYMENT_TARGET"], + "--compile", + os.path.abspath(os.environ["CONTENTS_FOLDER_PATH"]), + ] + ) + else: + command_line.extend( + [ + "--platform", + "macosx", + "--target-device", + "mac", + "--minimum-deployment-target", + os.environ["MACOSX_DEPLOYMENT_TARGET"], + "--compile", + os.path.abspath(os.environ["UNLOCALIZED_RESOURCES_FOLDER_PATH"]), + ] + ) + if keys: + keys = json.loads(keys) + for key, value in keys.items(): + arg_name = "--" + key + if isinstance(value, bool): + if value: + command_line.append(arg_name) + elif isinstance(value, list): + for v in value: + command_line.append(arg_name) + command_line.append(str(v)) + else: + command_line.append(arg_name) + command_line.append(str(value)) + # Note: actool crashes if inputs path are relative, so use os.path.abspath + # to get absolute path name for inputs. + command_line.extend(map(os.path.abspath, inputs)) + subprocess.check_call(command_line) + + def ExecMergeInfoPlist(self, output, *inputs): + """Merge multiple .plist files into a single .plist file.""" + merged_plist = {} + for path in inputs: + plist = self._LoadPlistMaybeBinary(path) + self._MergePlist(merged_plist, plist) + plistlib.writePlist(merged_plist, output) + + def ExecCodeSignBundle(self, key, entitlements, provisioning, path, preserve): + """Code sign a bundle. + + This function tries to code sign an iOS bundle, following the same + algorithm as Xcode: + 1. pick the provisioning profile that best match the bundle identifier, + and copy it into the bundle as embedded.mobileprovision, + 2. copy Entitlements.plist from user or SDK next to the bundle, + 3. code sign the bundle. + """ + substitutions, overrides = self._InstallProvisioningProfile( + provisioning, self._GetCFBundleIdentifier() + ) + entitlements_path = self._InstallEntitlements( + entitlements, substitutions, overrides + ) + + args = ["codesign", "--force", "--sign", key] + if preserve == "True": + args.extend(["--deep", "--preserve-metadata=identifier,entitlements"]) + else: + args.extend(["--entitlements", entitlements_path]) + args.extend(["--timestamp=none", path]) + subprocess.check_call(args) + + def _InstallProvisioningProfile(self, profile, bundle_identifier): + """Installs embedded.mobileprovision into the bundle. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple containing two dictionary: variables substitutions and values + to overrides when generating the entitlements file. + """ + source_path, provisioning_data, team_id = self._FindProvisioningProfile( + profile, bundle_identifier + ) + target_path = os.path.join( + os.environ["BUILT_PRODUCTS_DIR"], + os.environ["CONTENTS_FOLDER_PATH"], + "embedded.mobileprovision", + ) + shutil.copy2(source_path, target_path) + substitutions = self._GetSubstitutions(bundle_identifier, team_id + ".") + return substitutions, provisioning_data["Entitlements"] + + def _FindProvisioningProfile(self, profile, bundle_identifier): + """Finds the .mobileprovision file to use for signing the bundle. + + Checks all the installed provisioning profiles (or if the user specified + the PROVISIONING_PROFILE variable, only consult it) and select the most + specific that correspond to the bundle identifier. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple of the path to the selected provisioning profile, the data of + the embedded plist in the provisioning profile and the team identifier + to use for code signing. + + Raises: + SystemExit: if no .mobileprovision can be used to sign the bundle. + """ + profiles_dir = os.path.join( + os.environ["HOME"], "Library", "MobileDevice", "Provisioning Profiles" + ) + if not os.path.isdir(profiles_dir): + print( + "cannot find mobile provisioning for %s" % (bundle_identifier), + file=sys.stderr, + ) + sys.exit(1) + provisioning_profiles = None + if profile: + profile_path = os.path.join(profiles_dir, profile + ".mobileprovision") + if os.path.exists(profile_path): + provisioning_profiles = [profile_path] + if not provisioning_profiles: + provisioning_profiles = glob.glob( + os.path.join(profiles_dir, "*.mobileprovision") + ) + valid_provisioning_profiles = {} + for profile_path in provisioning_profiles: + profile_data = self._LoadProvisioningProfile(profile_path) + app_id_pattern = profile_data.get("Entitlements", {}).get( + "application-identifier", "" + ) + for team_identifier in profile_data.get("TeamIdentifier", []): + app_id = f"{team_identifier}.{bundle_identifier}" + if fnmatch.fnmatch(app_id, app_id_pattern): + valid_provisioning_profiles[app_id_pattern] = ( + profile_path, + profile_data, + team_identifier, + ) + if not valid_provisioning_profiles: + print( + "cannot find mobile provisioning for %s" % (bundle_identifier), + file=sys.stderr, + ) + sys.exit(1) + # If the user has multiple provisioning profiles installed that can be + # used for ${bundle_identifier}, pick the most specific one (ie. the + # provisioning profile whose pattern is the longest). + selected_key = max(valid_provisioning_profiles, key=lambda v: len(v)) + return valid_provisioning_profiles[selected_key] + + def _LoadProvisioningProfile(self, profile_path): + """Extracts the plist embedded in a provisioning profile. + + Args: + profile_path: string, path to the .mobileprovision file + + Returns: + Content of the plist embedded in the provisioning profile as a dictionary. + """ + with tempfile.NamedTemporaryFile() as temp: + subprocess.check_call( + ["security", "cms", "-D", "-i", profile_path, "-o", temp.name] + ) + return self._LoadPlistMaybeBinary(temp.name) + + def _MergePlist(self, merged_plist, plist): + """Merge |plist| into |merged_plist|.""" + for key, value in plist.items(): + if isinstance(value, dict): + merged_value = merged_plist.get(key, {}) + if isinstance(merged_value, dict): + self._MergePlist(merged_value, value) + merged_plist[key] = merged_value + else: + merged_plist[key] = value + else: + merged_plist[key] = value + + def _LoadPlistMaybeBinary(self, plist_path): + """Loads into a memory a plist possibly encoded in binary format. + + This is a wrapper around plistlib.readPlist that tries to convert the + plist to the XML format if it can't be parsed (assuming that it is in + the binary format). + + Args: + plist_path: string, path to a plist file, in XML or binary format + + Returns: + Content of the plist as a dictionary. + """ + try: + # First, try to read the file using plistlib that only supports XML, + # and if an exception is raised, convert a temporary copy to XML and + # load that copy. + return plistlib.readPlist(plist_path) + except Exception: + pass + with tempfile.NamedTemporaryFile() as temp: + shutil.copy2(plist_path, temp.name) + subprocess.check_call(["plutil", "-convert", "xml1", temp.name]) + return plistlib.readPlist(temp.name) + + def _GetSubstitutions(self, bundle_identifier, app_identifier_prefix): + """Constructs a dictionary of variable substitutions for Entitlements.plist. + + Args: + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + app_identifier_prefix: string, value for AppIdentifierPrefix + + Returns: + Dictionary of substitutions to apply when generating Entitlements.plist. + """ + return { + "CFBundleIdentifier": bundle_identifier, + "AppIdentifierPrefix": app_identifier_prefix, + } + + def _GetCFBundleIdentifier(self): + """Extracts CFBundleIdentifier value from Info.plist in the bundle. + + Returns: + Value of CFBundleIdentifier in the Info.plist located in the bundle. + """ + info_plist_path = os.path.join( + os.environ["TARGET_BUILD_DIR"], os.environ["INFOPLIST_PATH"] + ) + info_plist_data = self._LoadPlistMaybeBinary(info_plist_path) + return info_plist_data["CFBundleIdentifier"] + + def _InstallEntitlements(self, entitlements, substitutions, overrides): + """Generates and install the ${BundleName}.xcent entitlements file. + + Expands variables "$(variable)" pattern in the source entitlements file, + add extra entitlements defined in the .mobileprovision file and the copy + the generated plist to "${BundlePath}.xcent". + + Args: + entitlements: string, optional, path to the Entitlements.plist template + to use, defaults to "${SDKROOT}/Entitlements.plist" + substitutions: dictionary, variable substitutions + overrides: dictionary, values to add to the entitlements + + Returns: + Path to the generated entitlements file. + """ + source_path = entitlements + target_path = os.path.join( + os.environ["BUILT_PRODUCTS_DIR"], os.environ["PRODUCT_NAME"] + ".xcent" + ) + if not source_path: + source_path = os.path.join(os.environ["SDKROOT"], "Entitlements.plist") + shutil.copy2(source_path, target_path) + data = self._LoadPlistMaybeBinary(target_path) + data = self._ExpandVariables(data, substitutions) + if overrides: + for key in overrides: + if key not in data: + data[key] = overrides[key] + plistlib.writePlist(data, target_path) + return target_path + + def _ExpandVariables(self, data, substitutions): + """Expands variables "$(variable)" in data. + + Args: + data: object, can be either string, list or dictionary + substitutions: dictionary, variable substitutions to perform + + Returns: + Copy of data where each references to "$(variable)" has been replaced + by the corresponding value found in substitutions, or left intact if + the key was not found. + """ + if isinstance(data, str): + for key, value in substitutions.items(): + data = data.replace("$(%s)" % key, value) + return data + if isinstance(data, list): + return [self._ExpandVariables(v, substitutions) for v in data] + if isinstance(data, dict): + return {k: self._ExpandVariables(data[k], substitutions) for k in data} + return data + + +def NextGreaterPowerOf2(x): + return 2 ** (x).bit_length() + + +def WriteHmap(output_name, filelist): + """Generates a header map based on |filelist|. + + Per Mark Mentovai: + A header map is structured essentially as a hash table, keyed by names used + in #includes, and providing pathnames to the actual files. + + The implementation below and the comment above comes from inspecting: + http://www.opensource.apple.com/source/distcc/distcc-2503/distcc_dist/include_server/headermap.py?txt + while also looking at the implementation in clang in: + https://llvm.org/svn/llvm-project/cfe/trunk/lib/Lex/HeaderMap.cpp + """ + magic = 1751998832 + version = 1 + _reserved = 0 + count = len(filelist) + capacity = NextGreaterPowerOf2(count) + strings_offset = 24 + (12 * capacity) + max_value_length = max(len(value) for value in filelist.values()) + + out = open(output_name, "wb") + out.write( + struct.pack( + " +** Licensed under MIT License. +*/ + +#include "nan.h" +#include "uv.h" +#include "v8.h" +#include "CoreFoundation/CoreFoundation.h" +#include "CoreServices/CoreServices.h" +#include +#include + +#include "src/storage.cc" +namespace fse { + class FSEvents : public Nan::ObjectWrap { + public: + explicit FSEvents(const char *path); + ~FSEvents(); + + uv_mutex_t mutex; + + // async.cc + uv_async_t async; + void asyncStart(); + void asyncTrigger(); + void asyncStop(); + + // thread.cc + uv_thread_t thread; + CFRunLoopRef threadloop; + void threadStart(); + static void threadRun(void *ctx); + void threadStop(); + + // methods.cc - internal + Nan::AsyncResource async_resource; + void emitEvent(const char *path, UInt32 flags, UInt64 id); + + // Common + CFArrayRef paths; + std::vector events; + static void Initialize(v8::Local exports); + + // methods.cc - exposed + static NAN_METHOD(New); + static NAN_METHOD(Stop); + static NAN_METHOD(Start); + + }; +} + +using namespace fse; + +FSEvents::FSEvents(const char *path) + : async_resource("fsevents:FSEvents") { + CFStringRef dirs[] = { CFStringCreateWithCString(NULL, path, kCFStringEncodingUTF8) }; + paths = CFArrayCreate(NULL, (const void **)&dirs, 1, NULL); + threadloop = NULL; + if (uv_mutex_init(&mutex)) abort(); +} +FSEvents::~FSEvents() { + CFRelease(paths); + uv_mutex_destroy(&mutex); +} + +#ifndef kFSEventStreamEventFlagItemCreated +#define kFSEventStreamEventFlagItemCreated 0x00000010 +#endif + +#include "src/async.cc" +#include "src/thread.cc" +#include "src/constants.cc" +#include "src/methods.cc" + +void FSEvents::Initialize(v8::Local exports) { + v8::Isolate* isolate = exports->GetIsolate(); + v8::Local context = isolate->GetCurrentContext(); + v8::Local tpl = Nan::New(FSEvents::New); + tpl->SetClassName(Nan::New("FSEvents").ToLocalChecked()); + tpl->InstanceTemplate()->SetInternalFieldCount(1); + Nan::SetPrototypeTemplate(tpl, "start", Nan::New(FSEvents::Start)); + Nan::SetPrototypeTemplate(tpl, "stop", Nan::New(FSEvents::Stop)); + Nan::Set(exports, Nan::New("Constants").ToLocalChecked(), Constants()); + Nan::Set(exports, Nan::New("FSEvents").ToLocalChecked(), tpl->GetFunction(context).ToLocalChecked()); +} + +NODE_MODULE(fse, FSEvents::Initialize) diff --git a/node_modules/fsevents/fsevents.js b/node_modules/fsevents/fsevents.js new file mode 100644 index 00000000..939cc7e3 --- /dev/null +++ b/node_modules/fsevents/fsevents.js @@ -0,0 +1,106 @@ +/* + ** © 2014 by Philipp Dunkel + ** Licensed under MIT License. + */ + +/* jshint node:true */ +'use strict'; + +if (process.platform !== 'darwin') + throw new Error('Module \'fsevents\' is not compatible with platform \'' + process.platform + '\''); + +var Native = require("bindings")("fse"); + +var EventEmitter = require('events').EventEmitter; +var fs = require('fs'); +var inherits = require('util').inherits; + +function FSEvents(path, handler) { + EventEmitter.call(this); + + Object.defineProperty(this, '_impl', { + value: new Native.FSEvents(String(path || ''), handler), + enumerable: false, + writable: false + }); +} + +inherits(FSEvents, EventEmitter); +proxies(FSEvents, Native.FSEvents); + +module.exports = watch; +module.exports.getInfo = getInfo; +module.exports.FSEvents = Native.FSEvents; +module.exports.Constants = Native.Constants; + +var defer = global.setImmediate || process.nextTick; + +function watch(path) { + var fse = new FSEvents(String(path || ''), handler); + EventEmitter.call(fse); + return fse; + + function handler(path, flags, id) { + defer(function() { + fse.emit('fsevent', path, flags, id); + var info = getInfo(path, flags); + info.id = id; + if (info.event === 'moved') { + fs.stat(info.path, function(err, stat) { + info.event = (err || !stat) ? 'moved-out' : 'moved-in'; + fse.emit('change', path, info); + fse.emit(info.event, path, info); + }); + } else { + fse.emit('change', path, info); + fse.emit(info.event, path, info); + } + }); + } +} + +function proxies(ctor, target) { + Object.keys(target.prototype).filter(function(key) { + return typeof target.prototype[key] === 'function'; + }).forEach(function(key) { + ctor.prototype[key] = function() { + this._impl[key].apply(this._impl, arguments); + return this; + } + }); +} + +function getFileType(flags) { + if (Native.Constants.kFSEventStreamEventFlagItemIsFile & flags) return 'file'; + if (Native.Constants.kFSEventStreamEventFlagItemIsDir & flags) return 'directory'; + if (Native.Constants.kFSEventStreamEventFlagItemIsSymlink & flags) return 'symlink'; +} + +function getEventType(flags) { + if (Native.Constants.kFSEventStreamEventFlagItemRemoved & flags) return 'deleted'; + if (Native.Constants.kFSEventStreamEventFlagItemRenamed & flags) return 'moved'; + if (Native.Constants.kFSEventStreamEventFlagItemCreated & flags) return 'created'; + if (Native.Constants.kFSEventStreamEventFlagItemModified & flags) return 'modified'; + if (Native.Constants.kFSEventStreamEventFlagRootChanged & flags) return 'root-changed'; + + return 'unknown'; +} + +function getFileChanges(flags) { + return { + inode: !! (Native.Constants.kFSEventStreamEventFlagItemInodeMetaMod & flags), + finder: !! (Native.Constants.kFSEventStreamEventFlagItemFinderInfoMod & flags), + access: !! (Native.Constants.kFSEventStreamEventFlagItemChangeOwner & flags), + xattrs: !! (Native.Constants.kFSEventStreamEventFlagItemXattrMod & flags) + }; +} + +function getInfo(path, flags) { + return { + path: path, + event: getEventType(flags), + type: getFileType(flags), + changes: getFileChanges(flags), + flags: flags + }; +} diff --git a/node_modules/fsevents/install.js b/node_modules/fsevents/install.js new file mode 100644 index 00000000..9d81e6b4 --- /dev/null +++ b/node_modules/fsevents/install.js @@ -0,0 +1,13 @@ +const { spawn } = require('child_process'); + +const rebuildIfDarwin = () => { + if (process.platform !== 'darwin') { + console.log(); + console.log(`Skipping 'fsevents' build as platform ${process.platform} is not supported`); + process.exit(0); + } else { + spawn('node-gyp', ['rebuild'], { stdio: 'inherit' }); + } +}; + +rebuildIfDarwin(); diff --git a/node_modules/fsevents/package.json b/node_modules/fsevents/package.json new file mode 100644 index 00000000..5ae195de --- /dev/null +++ b/node_modules/fsevents/package.json @@ -0,0 +1,34 @@ +{ + "name": "fsevents", + "version": "1.2.13", + "description": "Native Access to Mac OS-X FSEvents", + "main": "fsevents.js", + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 4.0" + }, + "scripts": { + "test": "node ./test/fsevents.js && node ./test/function.js 2> /dev/null", + "install": "node install.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/strongloop/fsevents.git" + }, + "keywords": [ + "fsevents", + "mac" + ], + "author": "Philipp Dunkel ", + "license": "MIT", + "bugs": { + "url": "https://github.com/strongloop/fsevents/issues" + }, + "homepage": "https://github.com/strongloop/fsevents" +} diff --git a/node_modules/fsevents/src/async.cc b/node_modules/fsevents/src/async.cc new file mode 100644 index 00000000..9f370e14 --- /dev/null +++ b/node_modules/fsevents/src/async.cc @@ -0,0 +1,43 @@ +/* +** © 2014 by Philipp Dunkel +** Licensed under MIT License. +*/ + + +void async_propagate(uv_async_t *async) { + if (!async->data) return; + FSEvents *fse = (FSEvents *)async->data; + CFIndex idx, cnt; + fse_event *event; + char pathbuf[1024]; + const char *pathptr = NULL; + uv_mutex_lock(&fse->mutex); + cnt = fse->events.size(); + for (idx=0; idxevents.at(idx); + if (event == NULL) continue; + pathptr = CFStringGetCStringPtr(event->path, kCFStringEncodingUTF8); + if (!pathptr) CFStringGetCString(event->path, pathbuf, 1024, kCFStringEncodingUTF8); + fse->emitEvent(pathptr ? pathptr : pathbuf, event->flags, event->id); + delete event; + } + if (cnt>0) fse->events.clear(); + uv_mutex_unlock(&fse->mutex); +} + +void FSEvents::asyncStart() { + if (async.data == this) return; + async.data = this; + uv_async_init(uv_default_loop(), &async, (uv_async_cb) async_propagate); +} + +void FSEvents::asyncTrigger() { + if (async.data != this) return; + uv_async_send(&async); +} + +void FSEvents::asyncStop() { + if (async.data != this) return; + async.data = NULL; + uv_close((uv_handle_t *) &async, NULL); +} diff --git a/node_modules/fsevents/src/constants.cc b/node_modules/fsevents/src/constants.cc new file mode 100644 index 00000000..caccfadc --- /dev/null +++ b/node_modules/fsevents/src/constants.cc @@ -0,0 +1,110 @@ +/* +** © 2014 by Philipp Dunkel +** Licensed under MIT License. +*/ + +// constants from https://developer.apple.com/library/mac/documentation/Darwin/Reference/FSEvents_Ref/index.html#//apple_ref/doc/constant_group/FSEventStreamEventFlags +#ifndef kFSEventStreamEventFlagNone +#define kFSEventStreamEventFlagNone 0x00000000 +#endif + +#ifndef kFSEventStreamEventFlagMustScanSubDirs +#define kFSEventStreamEventFlagMustScanSubDirs 0x00000001 +#endif + +#ifndef kFSEventStreamEventFlagUserDropped +#define kFSEventStreamEventFlagUserDropped 0x00000002 +#endif + +#ifndef kFSEventStreamEventFlagKernelDropped +#define kFSEventStreamEventFlagKernelDropped 0x00000004 +#endif + +#ifndef kFSEventStreamEventFlagEventIdsWrapped +#define kFSEventStreamEventFlagEventIdsWrapped 0x00000008 +#endif + +#ifndef kFSEventStreamEventFlagHistoryDone +#define kFSEventStreamEventFlagHistoryDone 0x00000010 +#endif + +#ifndef kFSEventStreamEventFlagRootChanged +#define kFSEventStreamEventFlagRootChanged 0x00000020 +#endif + +#ifndef kFSEventStreamEventFlagMount +#define kFSEventStreamEventFlagMount 0x00000040 +#endif + +#ifndef kFSEventStreamEventFlagUnmount +#define kFSEventStreamEventFlagUnmount 0x00000080 +#endif + +#ifndef kFSEventStreamEventFlagItemCreated +#define kFSEventStreamEventFlagItemCreated 0x00000100 +#endif + +#ifndef kFSEventStreamEventFlagItemRemoved +#define kFSEventStreamEventFlagItemRemoved 0x00000200 +#endif + +#ifndef kFSEventStreamEventFlagItemInodeMetaMod +#define kFSEventStreamEventFlagItemInodeMetaMod 0x00000400 +#endif + +#ifndef kFSEventStreamEventFlagItemRenamed +#define kFSEventStreamEventFlagItemRenamed 0x00000800 +#endif + +#ifndef kFSEventStreamEventFlagItemModified +#define kFSEventStreamEventFlagItemModified 0x00001000 +#endif + +#ifndef kFSEventStreamEventFlagItemFinderInfoMod +#define kFSEventStreamEventFlagItemFinderInfoMod 0x00002000 +#endif + +#ifndef kFSEventStreamEventFlagItemChangeOwner +#define kFSEventStreamEventFlagItemChangeOwner 0x00004000 +#endif + +#ifndef kFSEventStreamEventFlagItemXattrMod +#define kFSEventStreamEventFlagItemXattrMod 0x00008000 +#endif + +#ifndef kFSEventStreamEventFlagItemIsFile +#define kFSEventStreamEventFlagItemIsFile 0x00010000 +#endif + +#ifndef kFSEventStreamEventFlagItemIsDir +#define kFSEventStreamEventFlagItemIsDir 0x00020000 +#endif + +#ifndef kFSEventStreamEventFlagItemIsSymlink +#define kFSEventStreamEventFlagItemIsSymlink 0x00040000 +#endif + +static v8::Local Constants() { + v8::Local object = Nan::New(); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagNone").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagNone)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagMustScanSubDirs").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagMustScanSubDirs)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagUserDropped").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagUserDropped)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagKernelDropped").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagKernelDropped)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagEventIdsWrapped").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagEventIdsWrapped)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagHistoryDone").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagHistoryDone)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagRootChanged").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagRootChanged)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagMount").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagMount)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagUnmount").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagUnmount)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemCreated").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemCreated)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemRemoved").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemRemoved)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemInodeMetaMod").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemInodeMetaMod)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemRenamed").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemRenamed)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemModified").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemModified)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemFinderInfoMod").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemFinderInfoMod)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemChangeOwner").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemChangeOwner)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemXattrMod").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemXattrMod)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemIsFile").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemIsFile)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemIsDir").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemIsDir)); + Nan::Set(object, Nan::New("kFSEventStreamEventFlagItemIsSymlink").ToLocalChecked(), Nan::New(kFSEventStreamEventFlagItemIsSymlink)); + return object; +} diff --git a/node_modules/fsevents/src/methods.cc b/node_modules/fsevents/src/methods.cc new file mode 100644 index 00000000..a6d14888 --- /dev/null +++ b/node_modules/fsevents/src/methods.cc @@ -0,0 +1,44 @@ +/* +** © 2014 by Philipp Dunkel +** Licensed under MIT License. +*/ + +void FSEvents::emitEvent(const char *path, UInt32 flags, UInt64 id) { + Nan::HandleScope handle_scope; + v8::Local object = handle(); + v8::Local key = Nan::New("handler").ToLocalChecked(); + Nan::Callback handler(Nan::To(Nan::Get(object, key).ToLocalChecked()).ToLocalChecked()); + v8::Local argv[] = { + Nan::New(path).ToLocalChecked(), + Nan::New(flags), + Nan::New(id) + }; + handler.Call(3, argv, &async_resource); +} + +NAN_METHOD(FSEvents::New) { + Nan::Utf8String path(info[0]); + + FSEvents *fse = new FSEvents(*path); + fse->Wrap(info.This()); + Nan::Set(info.This(), Nan::New("handler").ToLocalChecked(), info[1]); + + info.GetReturnValue().Set(info.This()); +} + +NAN_METHOD(FSEvents::Stop) { + FSEvents* fse = Nan::ObjectWrap::Unwrap(info.This()); + + fse->threadStop(); + fse->asyncStop(); + + info.GetReturnValue().Set(info.This()); +} + +NAN_METHOD(FSEvents::Start) { + FSEvents* fse = Nan::ObjectWrap::Unwrap(info.This()); + fse->asyncStart(); + fse->threadStart(); + + info.GetReturnValue().Set(info.This()); +} diff --git a/node_modules/fsevents/src/storage.cc b/node_modules/fsevents/src/storage.cc new file mode 100644 index 00000000..9dc55881 --- /dev/null +++ b/node_modules/fsevents/src/storage.cc @@ -0,0 +1,27 @@ +/* + ** © 2014 by Philipp Dunkel + ** Licensed under MIT License. + */ + +struct fse_event { + UInt64 id; + UInt32 flags; + CFStringRef path; + + fse_event(CFStringRef eventPath, UInt32 eventFlag, UInt64 eventId) { + this->path = eventPath; + this->flags = eventFlag; + this->id = eventId; + if (this->path != NULL) + CFRetain(this->path); + } + + ~fse_event() { + if (this->path != NULL) + CFRelease(this->path); + } + +private: + fse_event(const fse_event&); + void operator=(const fse_event&); +}; diff --git a/node_modules/fsevents/src/thread.cc b/node_modules/fsevents/src/thread.cc new file mode 100644 index 00000000..7d9f32f0 --- /dev/null +++ b/node_modules/fsevents/src/thread.cc @@ -0,0 +1,71 @@ +/* +** © 2014 by Philipp Dunkel +** Licensed under MIT License. +*/ + +// constants from https://developer.apple.com/library/mac/documentation/Darwin/Reference/FSEvents_Ref/index.html#//apple_ref/doc/constant_group/FSEventStreamCreateFlags +#ifndef kFSEventStreamCreateFlagNone +#define kFSEventStreamCreateFlagNone 0x00000000 +#endif + +#ifndef kFSEventStreamCreateFlagUseCFTypes +#define kFSEventStreamCreateFlagUseCFTypes 0x00000001 +#endif + +#ifndef kFSEventStreamCreateFlagNoDefer +#define kFSEventStreamCreateFlagNoDefer 0x00000002 +#endif + +#ifndef kFSEventStreamCreateFlagWatchRoot +#define kFSEventStreamCreateFlagWatchRoot 0x00000004 +#endif + +#ifndef kFSEventStreamCreateFlagIgnoreSelf +#define kFSEventStreamCreateFlagIgnoreSelf 0x00000008 +#endif + +#ifndef kFSEventStreamCreateFlagFileEvents +#define kFSEventStreamCreateFlagFileEvents 0x00000010 +#endif + +void FSEvents::threadStart() { + if (threadloop) return; + if (uv_thread_create(&thread, &FSEvents::threadRun, this)) abort(); +} + +void HandleStreamEvents(ConstFSEventStreamRef stream, void *ctx, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) { + FSEvents * fse = (FSEvents *)ctx; + size_t idx; + uv_mutex_lock(&fse->mutex); + for (idx=0; idx < numEvents; idx++) { + fse_event *event = new fse_event( + (CFStringRef)CFArrayGetValueAtIndex((CFArrayRef)eventPaths, idx), + eventFlags[idx], + eventIds[idx] + ); + fse->events.push_back(event); + } + fse->asyncTrigger(); + uv_mutex_unlock(&fse->mutex); +} + +void FSEvents::threadRun(void *ctx) { + FSEvents *fse = (FSEvents*)ctx; + FSEventStreamContext context = { 0, ctx, NULL, NULL, NULL }; + fse->threadloop = CFRunLoopGetCurrent(); + FSEventStreamRef stream = FSEventStreamCreate(NULL, &HandleStreamEvents, &context, fse->paths, kFSEventStreamEventIdSinceNow, (CFAbsoluteTime) 0.1, kFSEventStreamCreateFlagNone | kFSEventStreamCreateFlagWatchRoot | kFSEventStreamCreateFlagFileEvents | kFSEventStreamCreateFlagUseCFTypes); + FSEventStreamScheduleWithRunLoop(stream, fse->threadloop, kCFRunLoopDefaultMode); + FSEventStreamStart(stream); + CFRunLoopRun(); + FSEventStreamStop(stream); + FSEventStreamUnscheduleFromRunLoop(stream, fse->threadloop, kCFRunLoopDefaultMode); + FSEventStreamInvalidate(stream); + FSEventStreamRelease(stream); + fse->threadloop = NULL; +} + +void FSEvents::threadStop() { + if (!threadloop) return; + CFRunLoopStop(threadloop); + if (uv_thread_join(&thread)) abort(); +} diff --git a/node_modules/rollup/node_modules/fsevents/LICENSE b/node_modules/rollup/node_modules/fsevents/LICENSE new file mode 100644 index 00000000..5d70441c --- /dev/null +++ b/node_modules/rollup/node_modules/fsevents/LICENSE @@ -0,0 +1,22 @@ +MIT License +----------- + +Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/rollup/node_modules/fsevents/README.md b/node_modules/rollup/node_modules/fsevents/README.md new file mode 100644 index 00000000..50373a03 --- /dev/null +++ b/node_modules/rollup/node_modules/fsevents/README.md @@ -0,0 +1,89 @@ +# fsevents + +Native access to MacOS FSEvents in [Node.js](https://nodejs.org/) + +The FSEvents API in MacOS allows applications to register for notifications of +changes to a given directory tree. It is a very fast and lightweight alternative +to kqueue. + +This is a low-level library. For a cross-platform file watching module that +uses fsevents, check out [Chokidar](https://github.com/paulmillr/chokidar). + +## Usage + +```sh +npm install fsevents +``` + +Supports only **Node.js v8.16 and higher**. + +```js +const fsevents = require('fsevents'); + +// To start observation +const stop = fsevents.watch(__dirname, (path, flags, id) => { + const info = fsevents.getInfo(path, flags); +}); + +// To end observation +stop(); +``` + +> **Important note:** The API behaviour is slightly different from typical JS APIs. The `stop` function **must** be +> retrieved and stored somewhere, even if you don't plan to stop the watcher. If you forget it, the garbage collector +> will eventually kick in, the watcher will be unregistered, and your callbacks won't be called anymore. + +The callback passed as the second parameter to `.watch` get's called whenever the operating system detects a +a change in the file system. It takes three arguments: + +###### `fsevents.watch(dirname: string, (path: string, flags: number, id: string) => void): () => Promise` + + * `path: string` - the item in the filesystem that have been changed + * `flags: number` - a numeric value describing what the change was + * `id: string` - an unique-id identifying this specific event + + Returns closer callback which when called returns a Promise resolving when the watcher process has been shut down. + +###### `fsevents.getInfo(path: string, flags: number, id: string): FsEventInfo` + +The `getInfo` function takes the `path`, `flags` and `id` arguments and converts those parameters into a structure +that is easier to digest to determine what the change was. + +The `FsEventsInfo` has the following shape: + +```js +/** + * @typedef {'created'|'modified'|'deleted'|'moved'|'root-changed'|'cloned'|'unknown'} FsEventsEvent + * @typedef {'file'|'directory'|'symlink'} FsEventsType + */ +{ + "event": "created", // {FsEventsEvent} + "path": "file.txt", + "type": "file", // {FsEventsType} + "changes": { + "inode": true, // Had iNode Meta-Information changed + "finder": false, // Had Finder Meta-Data changed + "access": false, // Had access permissions changed + "xattrs": false // Had xAttributes changed + }, + "flags": 0x100000000 +} +``` + +## Changelog + +- v2.3 supports Apple Silicon ARM CPUs +- v2 supports node 8.16+ and reduces package size massively +- v1.2.8 supports node 6+ +- v1.2.7 supports node 4+ + +## Troubleshooting + +- I'm getting `EBADPLATFORM` `Unsupported platform for fsevents` error. +- It's fine, nothing is broken. fsevents is macos-only. Other platforms are skipped. If you want to hide this warning, report a bug to NPM bugtracker asking them to hide ebadplatform warnings by default. + +## License + +The MIT License Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller — see LICENSE file. + +Visit our [GitHub page](https://github.com/fsevents/fsevents) and [NPM Page](https://npmjs.org/package/fsevents) diff --git a/node_modules/rollup/node_modules/fsevents/fsevents.d.ts b/node_modules/rollup/node_modules/fsevents/fsevents.d.ts new file mode 100644 index 00000000..2723c048 --- /dev/null +++ b/node_modules/rollup/node_modules/fsevents/fsevents.d.ts @@ -0,0 +1,46 @@ +declare type Event = "created" | "cloned" | "modified" | "deleted" | "moved" | "root-changed" | "unknown"; +declare type Type = "file" | "directory" | "symlink"; +declare type FileChanges = { + inode: boolean; + finder: boolean; + access: boolean; + xattrs: boolean; +}; +declare type Info = { + event: Event; + path: string; + type: Type; + changes: FileChanges; + flags: number; +}; +declare type WatchHandler = (path: string, flags: number, id: string) => void; +export declare function watch(path: string, handler: WatchHandler): () => Promise; +export declare function watch(path: string, since: number, handler: WatchHandler): () => Promise; +export declare function getInfo(path: string, flags: number): Info; +export declare const constants: { + None: 0x00000000; + MustScanSubDirs: 0x00000001; + UserDropped: 0x00000002; + KernelDropped: 0x00000004; + EventIdsWrapped: 0x00000008; + HistoryDone: 0x00000010; + RootChanged: 0x00000020; + Mount: 0x00000040; + Unmount: 0x00000080; + ItemCreated: 0x00000100; + ItemRemoved: 0x00000200; + ItemInodeMetaMod: 0x00000400; + ItemRenamed: 0x00000800; + ItemModified: 0x00001000; + ItemFinderInfoMod: 0x00002000; + ItemChangeOwner: 0x00004000; + ItemXattrMod: 0x00008000; + ItemIsFile: 0x00010000; + ItemIsDir: 0x00020000; + ItemIsSymlink: 0x00040000; + ItemIsHardlink: 0x00100000; + ItemIsLastHardlink: 0x00200000; + OwnEvent: 0x00080000; + ItemCloned: 0x00400000; +}; +export {}; diff --git a/node_modules/rollup/node_modules/fsevents/fsevents.js b/node_modules/rollup/node_modules/fsevents/fsevents.js new file mode 100644 index 00000000..198da98e --- /dev/null +++ b/node_modules/rollup/node_modules/fsevents/fsevents.js @@ -0,0 +1,83 @@ +/* + ** © 2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller + ** Licensed under MIT License. + */ + +/* jshint node:true */ +"use strict"; + +if (process.platform !== "darwin") { + throw new Error(`Module 'fsevents' is not compatible with platform '${process.platform}'`); +} + +const Native = require("./fsevents.node"); +const events = Native.constants; + +function watch(path, since, handler) { + if (typeof path !== "string") { + throw new TypeError(`fsevents argument 1 must be a string and not a ${typeof path}`); + } + if ("function" === typeof since && "undefined" === typeof handler) { + handler = since; + since = Native.flags.SinceNow; + } + if (typeof since !== "number") { + throw new TypeError(`fsevents argument 2 must be a number and not a ${typeof since}`); + } + if (typeof handler !== "function") { + throw new TypeError(`fsevents argument 3 must be a function and not a ${typeof handler}`); + } + + let instance = Native.start(Native.global, path, since, handler); + if (!instance) throw new Error(`could not watch: ${path}`); + return () => { + const result = instance ? Promise.resolve(instance).then(Native.stop) : Promise.resolve(undefined); + instance = undefined; + return result; + }; +} + +function getInfo(path, flags) { + return { + path, + flags, + event: getEventType(flags), + type: getFileType(flags), + changes: getFileChanges(flags), + }; +} + +function getFileType(flags) { + if (events.ItemIsFile & flags) return "file"; + if (events.ItemIsDir & flags) return "directory"; + if (events.MustScanSubDirs & flags) return "directory"; + if (events.ItemIsSymlink & flags) return "symlink"; +} +function anyIsTrue(obj) { + for (let key in obj) { + if (obj[key]) return true; + } + return false; +} +function getEventType(flags) { + if (events.ItemRemoved & flags) return "deleted"; + if (events.ItemRenamed & flags) return "moved"; + if (events.ItemCreated & flags) return "created"; + if (events.ItemModified & flags) return "modified"; + if (events.RootChanged & flags) return "root-changed"; + if (events.ItemCloned & flags) return "cloned"; + if (anyIsTrue(flags)) return "modified"; + return "unknown"; +} +function getFileChanges(flags) { + return { + inode: !!(events.ItemInodeMetaMod & flags), + finder: !!(events.ItemFinderInfoMod & flags), + access: !!(events.ItemChangeOwner & flags), + xattrs: !!(events.ItemXattrMod & flags), + }; +} + +exports.watch = watch; +exports.getInfo = getInfo; +exports.constants = events; diff --git a/node_modules/rollup/node_modules/fsevents/fsevents.node b/node_modules/rollup/node_modules/fsevents/fsevents.node new file mode 100755 index 0000000000000000000000000000000000000000..1cc3345ead403e72439746aee6b40645893c322b GIT binary patch literal 163626 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 Is-vs_AMzay6aWAK literal 0 HcmV?d00001 diff --git a/node_modules/rollup/node_modules/fsevents/package.json b/node_modules/rollup/node_modules/fsevents/package.json new file mode 100644 index 00000000..5d0ee15e --- /dev/null +++ b/node_modules/rollup/node_modules/fsevents/package.json @@ -0,0 +1,62 @@ +{ + "name": "fsevents", + "version": "2.3.3", + "description": "Native Access to MacOS FSEvents", + "main": "fsevents.js", + "types": "fsevents.d.ts", + "os": [ + "darwin" + ], + "files": [ + "fsevents.d.ts", + "fsevents.js", + "fsevents.node" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + }, + "scripts": { + "clean": "node-gyp clean && rm -f fsevents.node", + "build": "node-gyp clean && rm -f fsevents.node && node-gyp rebuild && node-gyp clean", + "test": "/bin/bash ./test.sh 2>/dev/null", + "prepublishOnly": "npm run build" + }, + "repository": { + "type": "git", + "url": "https://github.com/fsevents/fsevents.git" + }, + "keywords": [ + "fsevents", + "mac" + ], + "contributors": [ + { + "name": "Philipp Dunkel", + "email": "pip@pipobscure.com" + }, + { + "name": "Ben Noordhuis", + "email": "info@bnoordhuis.nl" + }, + { + "name": "Elan Shankar", + "email": "elan.shanker@gmail.com" + }, + { + "name": "Miroslav Bajtoš", + "email": "mbajtoss@gmail.com" + }, + { + "name": "Paul Miller", + "url": "https://paulmillr.com" + } + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/fsevents/fsevents/issues" + }, + "homepage": "https://github.com/fsevents/fsevents", + "devDependencies": { + "node-gyp": "^9.4.0" + } +}