Compare commits
10 Commits
081d7bc137
...
0d51bdb007
Author | SHA1 | Date | |
---|---|---|---|
0d51bdb007 | |||
6fc99506e9 | |||
d55b50ce34 | |||
6f82976175 | |||
343d454230 | |||
743a13ca54 | |||
62d788af6c | |||
db3772b5d3 | |||
b6f3bc3421 | |||
00c24b1238 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -27,6 +27,3 @@ pnpm-debug.log*
|
||||
|
||||
# Hide the SQL session
|
||||
*.session.sql
|
||||
|
||||
# Blog Tools
|
||||
./tools
|
||||
|
24
README.md
24
README.md
@ -28,7 +28,6 @@ the [Astro branch](https://github.com/syhily/yufan.me/tree/astro).
|
||||
|
||||
## Local Development
|
||||
|
||||
This weblog is still under [development](#todo-checklist). Many ideas and thoughts are in my checklists.
|
||||
You can fork and clone this project for your own use. But do so at your own risk.
|
||||
|
||||
The project uses npm for development. Run it locally with these commands:
|
||||
@ -107,6 +106,11 @@ This weblog uses artalk as its backend comment service. But since artalk didn't
|
||||
We decide to query it directly from the Postgres database. So the comments and fav clicks are living in the same
|
||||
database.
|
||||
|
||||
### S3 Compatible Storage Integration
|
||||
|
||||
This blog will upload all the built resources at build stage. You can remove this feature by removing the
|
||||
`uploader` integration in `astro.config.ts`.
|
||||
|
||||
## Writing
|
||||
|
||||
All the posts should be placed in `src/content/posts` directory with MDX format.
|
||||
@ -176,19 +180,18 @@ Or you can host on your own machine. Use [Dockerfile](./Dockerfile) to build an
|
||||
The comment system is leverage the [Artalk](https://artalk.js.org), a self-hosted comment system.
|
||||
You should host it on your own machine.
|
||||
|
||||
## TODO Checklist
|
||||
## Short-Term TODO Checklist
|
||||
|
||||
- [ ] Move comments into the new Astro content layer.
|
||||
- [ ] Check article grammar errors by using ChatGPT. Remain **54** posts.
|
||||
- [ ] Add music to the articles. Remain **54** posts.
|
||||
|
||||
## Long-Term TODO Checklist
|
||||
|
||||
- [ ] Use self-developed comment solution.
|
||||
- [ ] Support modification after commenting in 60 minutes even if you have refreshed the page.
|
||||
- [ ] Support login into the blog for managing the comments.
|
||||
- [ ] Slide share components integration.
|
||||
|
||||
### Comments TODO Checklist
|
||||
|
||||
- [ ] Support modification after commenting in 60 minutes even if you have refreshed the page.
|
||||
- [ ] Use self-developed duoshuo as the comment's solution.
|
||||
|
||||
### Long-Term Goals
|
||||
|
||||
- [ ] Add han.js support for better typography.
|
||||
- [ ] Drop bootstrap, in favor of tailwind css.
|
||||
|
||||
@ -228,6 +231,7 @@ The source codes used from third party projects are:
|
||||
from [yuaanlin/yual.in](https://github.com/yuaanlin/yual.in/blob/main/pages/og_image/%5Bslug%5D.tsx)
|
||||
with [permission](licenses/LICENSE.yuaanlin.jpg)
|
||||
- [images.ts](src/helpers/images.ts)
|
||||
and [config.ts](src/content/config.ts)
|
||||
from [zce/velite](https://github.com/zce/velite/blob/main/src/assets.ts)
|
||||
with [license](licenses/LICENSE.zce.txt)
|
||||
- [images.ts](src/helpers/images.ts)
|
||||
|
@ -1,10 +1,10 @@
|
||||
import mdx from '@astrojs/mdx';
|
||||
import node from '@astrojs/node';
|
||||
import { uploader } from 'astro-uploader';
|
||||
import { defineConfig, envField } from 'astro/config';
|
||||
import rehypeExternalLinks from 'rehype-external-links';
|
||||
import options from './options';
|
||||
import { astroImage } from './plugins/images';
|
||||
import { uploader } from './plugins/uploader';
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"$schema": "https://biomejs.dev/schemas/1.8.2/schema.json",
|
||||
"$schema": "https://biomejs.dev/schemas/1.8.3/schema.json",
|
||||
"formatter": {
|
||||
"enabled": false
|
||||
},
|
||||
|
16
options.ts
16
options.ts
@ -30,8 +30,11 @@ const Options = z
|
||||
}),
|
||||
),
|
||||
settings: z.object({
|
||||
initialYear: z.number().max(2024),
|
||||
icpNo: z.string().optional(),
|
||||
footer: z.object({
|
||||
initialYear: z.number().max(2024),
|
||||
icpNo: z.string().optional(),
|
||||
astroBadge: z.boolean().default(true),
|
||||
}),
|
||||
locale: z.string().optional().default('zh-CN'),
|
||||
timeZone: z.string().optional().default('Asia/Shanghai'),
|
||||
timeFormat: z.string().optional().default('yyyy-MM-dd HH:mm:ss'),
|
||||
@ -64,7 +67,6 @@ const Options = z
|
||||
}),
|
||||
comments: z.object({
|
||||
server: z.string().url().readonly(),
|
||||
admins: z.array(z.number()),
|
||||
size: z.number().default(10).readonly(),
|
||||
avatar: z.object({
|
||||
mirror: z.string().url().readonly(),
|
||||
@ -149,8 +151,11 @@ const options: z.input<typeof Options> = {
|
||||
},
|
||||
],
|
||||
settings: {
|
||||
initialYear: 2011,
|
||||
icpNo: '皖ICP备2021002315号-2',
|
||||
footer: {
|
||||
initialYear: 2011,
|
||||
icpNo: '皖ICP备2021002315号-2',
|
||||
astroBadge: true,
|
||||
},
|
||||
locale: 'zh-CN',
|
||||
timeZone: 'Asia/Shanghai',
|
||||
timeFormat: 'yyyy-MM-dd',
|
||||
@ -179,7 +184,6 @@ const options: z.input<typeof Options> = {
|
||||
},
|
||||
comments: {
|
||||
server: 'https://comment.yufan.me',
|
||||
admins: [3],
|
||||
size: 10,
|
||||
avatar: {
|
||||
mirror: 'https://weavatar.com/avatar',
|
||||
|
713
package-lock.json
generated
713
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
13
package.json
13
package.json
@ -44,7 +44,7 @@
|
||||
"@astrojs/mdx": "^3.1.2",
|
||||
"@astrojs/node": "^8.3.2",
|
||||
"@astrojs/rss": "^4.0.7",
|
||||
"astro": "^4.11.1",
|
||||
"astro": "^4.11.3",
|
||||
"drizzle-orm": "^0.31.2",
|
||||
"fuse.js": "^7.0.0",
|
||||
"lodash": "^4.17.21",
|
||||
@ -56,27 +56,26 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@astrojs/check": "^0.7.0",
|
||||
"@aws-sdk/client-s3": "^3.600.0",
|
||||
"@biomejs/biome": "^1.8.2",
|
||||
"@biomejs/biome": "^1.8.3",
|
||||
"@napi-rs/canvas": "^0.1.53",
|
||||
"@types/lodash": "^4.17.5",
|
||||
"@types/lodash": "^4.17.6",
|
||||
"@types/luxon": "^3.4.2",
|
||||
"@types/node": "^20.14.9",
|
||||
"@types/pg": "^8.11.6",
|
||||
"@types/qrcode-svg": "^1.1.4",
|
||||
"@types/unist": "^3.0.2",
|
||||
"aplayer": "^1.10.1",
|
||||
"astro-uploader": "^1.0.3",
|
||||
"bootstrap": "^5.3.3",
|
||||
"mime": "^4.0.3",
|
||||
"prettier": "^3.3.2",
|
||||
"prettier-plugin-astro": "^0.14.0",
|
||||
"prettier-plugin-astro-organize-imports": "^0.4.9",
|
||||
"prettier-plugin-organize-imports": "^3.2.4",
|
||||
"prettier-plugin-organize-imports": "^4.0.0",
|
||||
"rehype-external-links": "^3.0.0",
|
||||
"resize-sensor": "^0.0.6",
|
||||
"rimraf": "^5.0.7",
|
||||
"sharp": "^0.33.4",
|
||||
"typescript": "^5.5.2",
|
||||
"typescript": "^5.5.3",
|
||||
"unist-util-select": "^5.1.0"
|
||||
}
|
||||
}
|
||||
|
@ -1,165 +0,0 @@
|
||||
import {
|
||||
HeadBucketCommand,
|
||||
HeadObjectCommand,
|
||||
NoSuchBucket,
|
||||
NotFound,
|
||||
PutObjectCommand,
|
||||
S3Client,
|
||||
} from '@aws-sdk/client-s3';
|
||||
import type { AstroIntegration, AstroIntegrationLogger } from 'astro';
|
||||
import { z } from 'astro/zod';
|
||||
import mime from 'mime';
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { rimrafSync } from 'rimraf';
|
||||
|
||||
const S3Options = z
|
||||
.object({
|
||||
// The directories that you want to upload to S3.
|
||||
paths: z.array(z.string()).min(1),
|
||||
// Whether to keep the original files after uploading.
|
||||
keep: z.boolean().default(false),
|
||||
// The S3 region, set it if you use AWS S3 service.
|
||||
region: z.string().min(1).default('auto'),
|
||||
// The endpoint, set it if you use 3rd-party S3 service.
|
||||
endpoint: z.string().url().optional(),
|
||||
// The name of the bucket.
|
||||
bucket: z.string().min(1),
|
||||
// The root directory you want to upload files.
|
||||
root: z.string().default('/'),
|
||||
// The access key id.
|
||||
accessKey: z.string().min(1),
|
||||
// The secret access key.
|
||||
secretAccessKey: z.string().min(1),
|
||||
})
|
||||
.strict()
|
||||
.superRefine((opts, { addIssue }) => {
|
||||
if (opts.region === 'auto' && opts.endpoint === undefined) {
|
||||
addIssue({ fatal: true, code: 'custom', message: 'either the region or the endpoint should be provided' });
|
||||
}
|
||||
});
|
||||
|
||||
const parseOptions = (opts: z.input<typeof S3Options>, logger: AstroIntegrationLogger): z.infer<typeof S3Options> => {
|
||||
try {
|
||||
return S3Options.parse(opts);
|
||||
} catch (err) {
|
||||
if (err instanceof z.ZodError) {
|
||||
logger.error(`Uploader options validation error, there are ${err.issues.length} errors:`);
|
||||
for (const issue of err.issues) {
|
||||
logger.error(issue.message);
|
||||
}
|
||||
}
|
||||
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
class Context {
|
||||
private client: S3Client;
|
||||
private bucket: string;
|
||||
private root: string;
|
||||
|
||||
constructor(client: S3Client, bucket: string, root: string) {
|
||||
this.client = client;
|
||||
this.bucket = bucket;
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
async isExist(key: string): Promise<boolean> {
|
||||
const headCmd = new HeadObjectCommand({ Bucket: this.bucket, Key: path.posix.join(this.root, key) });
|
||||
try {
|
||||
await this.client.send(headCmd);
|
||||
return true;
|
||||
} catch (error) {
|
||||
if (error instanceof NotFound) {
|
||||
return false;
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async write(key: string, body: Buffer) {
|
||||
const contentType = mime.getType(key);
|
||||
const putCmd = new PutObjectCommand({
|
||||
Bucket: this.bucket,
|
||||
Key: path.posix.join(this.root, key),
|
||||
Body: body,
|
||||
ContentType: contentType === null ? undefined : contentType,
|
||||
});
|
||||
|
||||
await this.client.send(putCmd);
|
||||
}
|
||||
}
|
||||
|
||||
export const uploader = (opts: z.input<typeof S3Options>): AstroIntegration => ({
|
||||
name: 'S3 Uploader',
|
||||
hooks: {
|
||||
'astro:build:done': async ({ dir, logger }: { dir: URL; logger: AstroIntegrationLogger }) => {
|
||||
const { paths, keep, region, endpoint, bucket, root, accessKey, secretAccessKey } = parseOptions(opts, logger);
|
||||
const client = new S3Client({
|
||||
region: region,
|
||||
endpoint: endpoint,
|
||||
credentials: { accessKeyId: accessKey, secretAccessKey: secretAccessKey },
|
||||
useGlobalEndpoint: endpoint !== undefined && endpoint !== '',
|
||||
});
|
||||
|
||||
logger.info('Try to verify the S3 credentials.');
|
||||
|
||||
try {
|
||||
await client.send(new HeadBucketCommand({ Bucket: bucket }));
|
||||
} catch (err) {
|
||||
// If the bucket is not existed.
|
||||
if (err instanceof NoSuchBucket) {
|
||||
logger.error(`The bucket ${bucket} isn't existed on the region: ${region} endpoint: ${endpoint}`);
|
||||
} else {
|
||||
logger.error(JSON.stringify(err));
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
|
||||
logger.info(`Start to upload static files in dir ${paths} to S3 compatible backend.`);
|
||||
|
||||
const context = new Context(client, bucket, root);
|
||||
for (const current of paths) {
|
||||
await uploadFile(context, logger, current, dir.pathname);
|
||||
if (!keep) {
|
||||
rimrafSync(path.join(dir.pathname, current));
|
||||
}
|
||||
}
|
||||
|
||||
logger.info('Upload all the files successfully.');
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// Change the windows path into the unix path.
|
||||
const normalizePath = (current: string): string => {
|
||||
return current.includes(path.win32.sep) ? current.split(path.win32.sep).join(path.posix.sep) : current;
|
||||
};
|
||||
|
||||
const uploadFile = async (context: Context, logger: AstroIntegrationLogger, current: string, root: string) => {
|
||||
const filePath = path.join(root, current);
|
||||
const isFile = !fs.statSync(filePath).isDirectory();
|
||||
const uploadAction = async (key: string) => {
|
||||
logger.info(`Start to upload file: ${key}`);
|
||||
const body = fs.readFileSync(filePath);
|
||||
await context.write(key, body);
|
||||
};
|
||||
|
||||
if (isFile) {
|
||||
const key = normalizePath(current);
|
||||
if (await context.isExist(key)) {
|
||||
logger.info(`${key} exists on backend, skip.`);
|
||||
} else {
|
||||
await uploadAction(key);
|
||||
}
|
||||
} else {
|
||||
// Reclusive upload files.
|
||||
for (const next of fs.readdirSync(filePath)) {
|
||||
if (next.startsWith('.')) {
|
||||
continue;
|
||||
}
|
||||
await uploadFile(context, logger, path.join(current, next), root);
|
||||
}
|
||||
}
|
||||
};
|
Binary file not shown.
Before Width: | Height: | Size: 225 KiB |
BIN
public/images/2023/12/2023120901275200.jpg
Normal file
BIN
public/images/2023/12/2023120901275200.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 323 KiB |
BIN
public/images/2024/06/2024063015135000.jpg
Normal file
BIN
public/images/2024/06/2024063015135000.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 241 KiB |
BIN
public/images/2024/06/2024063015140300.jpg
Normal file
BIN
public/images/2024/06/2024063015140300.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 424 KiB |
BIN
public/images/2024/06/2024063015145800.jpg
Normal file
BIN
public/images/2024/06/2024063015145800.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 281 KiB |
@ -1,5 +1,5 @@
|
||||
---
|
||||
import { loadComments } from '@/components/comment/artalk';
|
||||
import { increaseViews, loadComments } from '@/components/comment/artalk';
|
||||
import Comment from '@/components/comment/Comment.astro';
|
||||
import { urlJoin } from '@/helpers/tools';
|
||||
import options from '@/options';
|
||||
@ -12,6 +12,9 @@ interface Props {
|
||||
|
||||
const { commentKey, title } = Astro.props;
|
||||
const comments = await loadComments(commentKey, title, 0);
|
||||
|
||||
// Increase the PV.
|
||||
await increaseViews(commentKey, title);
|
||||
---
|
||||
|
||||
<div id="comments" class="comments py-5">
|
||||
|
@ -1,5 +1,4 @@
|
||||
import type { Comment, CommentItem, CommentReq, CommentResp, Comments, ErrorResp } from '@/components/comment/types';
|
||||
import { increaseViews } from '@/helpers/db/query';
|
||||
import { urlJoin } from '@/helpers/tools';
|
||||
import options from '@/options';
|
||||
import { ARTALK_HOST } from 'astro:env/server';
|
||||
@ -30,12 +29,23 @@ export const loadComments = async (key: string, title: string | null, offset: nu
|
||||
return null;
|
||||
});
|
||||
|
||||
// Increase the PV.
|
||||
await increaseViews(key);
|
||||
|
||||
return data != null ? (data as Comments) : data;
|
||||
};
|
||||
|
||||
export const increaseViews = async (key: string, title: string) => {
|
||||
await fetch(urlJoin(server, '/api/v2/pages/pv'), {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-type': 'application/json; charset=UTF-8',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
page_key: key,
|
||||
page_title: title,
|
||||
site_name: options.title,
|
||||
}),
|
||||
});
|
||||
};
|
||||
|
||||
export const createComment = async (req: CommentReq): Promise<ErrorResp | CommentResp> => {
|
||||
const response = await fetch(urlJoin(server, '/api/v2/comments'), {
|
||||
method: 'POST',
|
||||
|
@ -5,38 +5,44 @@ import { DateTime } from 'luxon';
|
||||
|
||||
<footer class="footer border-top border-light text-xs text-center py-4 py-xl-5">
|
||||
<div class="line">
|
||||
<span>Copyright © {options.settings.initialYear}-{DateTime.now().setZone(options.settings.timeZone).year}</span>
|
||||
<span>
|
||||
Copyright © {options.settings.footer.initialYear}-{DateTime.now().setZone(options.settings.timeZone).year}
|
||||
</span>
|
||||
<a href={import.meta.env.SITE} title={options.title} rel="home">
|
||||
{options.title}
|
||||
</a>
|
||||
</div>
|
||||
{
|
||||
options.settings.icpNo && (
|
||||
options.settings.footer.icpNo && (
|
||||
<div class="line">
|
||||
<a href="https://beian.miit.gov.cn" rel="nofollow" target="_blank" title="ICP 备案">
|
||||
{options.settings.icpNo}
|
||||
{options.settings.footer.icpNo}
|
||||
</a>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
{
|
||||
options.settings.footer.astroBadge && (
|
||||
<div class="line">
|
||||
<a href="https://astro.build" target="_blank" rel="nofollow">
|
||||
<svg class="astro-badge" fill="none" width="120" height="20" viewBox="0 0 120 20">
|
||||
<title>Astro Badge</title>
|
||||
<rect width="119" height="19" x=".5" y=".5" fill="#404b69" rx="3.5" />
|
||||
<rect width="119" height="19" x=".5" y=".5" fill="url(#a)" fill-opacity=".5" rx="3.5" />
|
||||
<path
|
||||
fill="#fff"
|
||||
d="M9.07 13V6.79h1.86c1.44 0 2.14.54 2.14 1.63 0 .52-.16.98-.76 1.22v.25c.74.21.96.76.96 1.4 0 1.14-.72 1.71-2.15 1.71H9.07Zm.91-.8h1.14c.85 0 1.2-.29 1.2-1 0-.7-.36-.98-1.2-.98H9.98v1.98Zm0-2.75h.97c.84 0 1.2-.27 1.2-.93 0-.67-.35-.94-1.2-.94h-.97v1.87Zm6.69 3.7c-1.4 0-2.06-.8-2.06-2.45V6.8h.9v3.83c0 1.16.35 1.64 1.16 1.64.8 0 1.15-.48 1.15-1.64V6.79h.9v3.92c0 1.64-.66 2.43-2.05 2.43ZM20.2 13v-.83h1.58V7.62H20.2v-.83h4.09v.83H22.7v4.55h1.59V13H20.2Zm5.96 0V6.79h.9v5.38h2.86V13h-3.76Zm6.78 0V7.62h-1.77v-.83h4.45v.83h-1.76V13h-.92Zm9.57 0-.59-6.21h.88l.4 5.23.23.03L44 8.5h1.1l.57 3.55.25-.03.38-5.23h.88L46.59 13h-1.43l-.48-3.37h-.27L43.93 13H42.5Zm5.57 0v-.83h1.59V7.62h-1.59v-.83h4.09v.83h-1.58v4.55h1.58V13h-4.09Zm7.16 0V7.62h-1.76v-.83h4.45v.83h-1.77V13h-.92Zm7.2 0v-2.77h-2.32V13h-.91V6.79h.9V9.4h2.33V6.79h.9V13h-.9Zm10.38.87c-.5-.46-.64-1.4-.44-2.1.36.44.86.57 1.38.65.8.12 1.58.08 2.32-.29l.25-.15c.07.2.1.4.07.61-.06.5-.31.9-.71 1.19-.16.12-.33.22-.5.33-.5.34-.64.74-.45 1.33l.02.06a1.33 1.33 0 0 1-.6-.5c-.14-.24-.22-.5-.22-.78 0-.13 0-.27-.02-.4-.04-.33-.2-.48-.49-.48a.57.57 0 0 0-.6.46l-.01.07Zm-2.84-2.22s1.47-.71 2.95-.71l1.12-3.45c.04-.16.16-.28.3-.28.13 0 .26.12.3.28l1.11 3.45a6.3 6.3 0 0 1 2.96.71L76.2 4.83c-.07-.2-.2-.33-.36-.33h-3c-.17 0-.29.13-.36.33l-2.51 6.82Zm15.55-.99c0 .6-.75.97-1.8.97-.67 0-.91-.17-.91-.52 0-.37.3-.55.97-.55.61 0 1.14.01 1.74.09v.01Zm0-.74a7.85 7.85 0 0 0-1.6-.14c-1.95 0-2.87.46-2.87 1.54 0 1.11.63 1.54 2.09 1.54 1.23 0 2.06-.31 2.37-1.07h.05l-.02.5c0 .4.07.43.4.43h1.51c-.08-.23-.13-.9-.13-1.46 0-.61.03-1.08.03-1.7 0-1.26-.76-2.07-3.15-2.07-1.02 0-2.16.18-3.03.44.08.34.2 1.04.26 1.5a6.64 6.64 0 0 1 2.64-.51c1.14 0 1.46.26 1.46.79v.2Zm4.18 1.09c-.2.03-.49.03-.78.03-.3 0-.58 0-.77-.03l-.01.2c0 1.05.69 1.66 3.1 1.66 2.27 0 3-.6 3-1.66 0-1-.48-1.5-2.64-1.61-1.68-.08-1.82-.26-1.82-.47 0-.24.21-.37 1.34-.37 1.16 0 1.48.16 1.48.5v.07a16.91 16.91 0 0 1 1.55 0v-.2c0-1.23-1.02-1.63-3-1.63-2.23 0-2.99.55-2.99 1.61 0 .96.6 1.55 2.75 1.64 1.58.05 1.75.23 1.75.47 0 .26-.25.38-1.36.38-1.28 0-1.6-.18-1.6-.54v-.05Zm7.28-4.41a6.43 6.43 0 0 1-2.3 1.27c.02.31.02.88.02 1.2h.55l-.02 1.8c0 1.1.59 1.95 2.42 1.95a8.4 8.4 0 0 0 1.92-.22 16.4 16.4 0 0 1-.17-1.52c-.38.13-.86.2-1.39.2-.73 0-1.03-.2-1.03-.79V9.1c.95 0 1.9.02 2.45.04a18 18 0 0 1 .03-1.48l-2.45.02c0-.37.02-.72.03-1.07h-.06Zm4.94 2.21.02-1.16h-1.66a102.96 102.96 0 0 1 0 5.08h1.9a41.9 41.9 0 0 1-.04-2.08c0-1.14.46-1.46 1.51-1.46.49 0 .84.06 1.14.16.01-.42.1-1.25.14-1.62-.31-.1-.66-.15-1.08-.15-.9-.01-1.56.36-1.87 1.24l-.06-.01Zm8.27 1.34c0 .91-.66 1.34-1.7 1.34-1.03 0-1.7-.4-1.7-1.34 0-.94.68-1.29 1.7-1.29 1.03 0 1.7.38 1.7 1.3Zm1.73-.04c0-1.82-1.42-2.63-3.43-2.63-2.02 0-3.39.81-3.39 2.63 0 1.8 1.28 2.78 3.38 2.78 2.12 0 3.44-.97 3.44-2.78Z"
|
||||
/>
|
||||
<rect width="119" height="19" x=".5" y=".5" stroke="url(#b)" rx="3.5" />
|
||||
<defs>
|
||||
<linearGradient id="a" x1="0" x2="88.9" y1="20" y2="-43.52" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#404b69" />
|
||||
<stop offset="1" stop-color="#404b69" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
<div class="line">
|
||||
<a href="https://astro.build" target="_blank" rel="nofollow"
|
||||
><svg class="astro-badge" fill="none" width="120" height="20" viewBox="0 0 120 20">
|
||||
<title>Astro Badge</title>
|
||||
<rect width="119" height="19" x=".5" y=".5" fill="#404b69" rx="3.5"></rect>
|
||||
<rect width="119" height="19" x=".5" y=".5" fill="url(#a)" fill-opacity=".5" rx="3.5"></rect>
|
||||
<path
|
||||
fill="#fff"
|
||||
d="M9.07 13V6.79h1.86c1.44 0 2.14.54 2.14 1.63 0 .52-.16.98-.76 1.22v.25c.74.21.96.76.96 1.4 0 1.14-.72 1.71-2.15 1.71H9.07Zm.91-.8h1.14c.85 0 1.2-.29 1.2-1 0-.7-.36-.98-1.2-.98H9.98v1.98Zm0-2.75h.97c.84 0 1.2-.27 1.2-.93 0-.67-.35-.94-1.2-.94h-.97v1.87Zm6.69 3.7c-1.4 0-2.06-.8-2.06-2.45V6.8h.9v3.83c0 1.16.35 1.64 1.16 1.64.8 0 1.15-.48 1.15-1.64V6.79h.9v3.92c0 1.64-.66 2.43-2.05 2.43ZM20.2 13v-.83h1.58V7.62H20.2v-.83h4.09v.83H22.7v4.55h1.59V13H20.2Zm5.96 0V6.79h.9v5.38h2.86V13h-3.76Zm6.78 0V7.62h-1.77v-.83h4.45v.83h-1.76V13h-.92Zm9.57 0-.59-6.21h.88l.4 5.23.23.03L44 8.5h1.1l.57 3.55.25-.03.38-5.23h.88L46.59 13h-1.43l-.48-3.37h-.27L43.93 13H42.5Zm5.57 0v-.83h1.59V7.62h-1.59v-.83h4.09v.83h-1.58v4.55h1.58V13h-4.09Zm7.16 0V7.62h-1.76v-.83h4.45v.83h-1.77V13h-.92Zm7.2 0v-2.77h-2.32V13h-.91V6.79h.9V9.4h2.33V6.79h.9V13h-.9Zm10.38.87c-.5-.46-.64-1.4-.44-2.1.36.44.86.57 1.38.65.8.12 1.58.08 2.32-.29l.25-.15c.07.2.1.4.07.61-.06.5-.31.9-.71 1.19-.16.12-.33.22-.5.33-.5.34-.64.74-.45 1.33l.02.06a1.33 1.33 0 0 1-.6-.5c-.14-.24-.22-.5-.22-.78 0-.13 0-.27-.02-.4-.04-.33-.2-.48-.49-.48a.57.57 0 0 0-.6.46l-.01.07Zm-2.84-2.22s1.47-.71 2.95-.71l1.12-3.45c.04-.16.16-.28.3-.28.13 0 .26.12.3.28l1.11 3.45a6.3 6.3 0 0 1 2.96.71L76.2 4.83c-.07-.2-.2-.33-.36-.33h-3c-.17 0-.29.13-.36.33l-2.51 6.82Zm15.55-.99c0 .6-.75.97-1.8.97-.67 0-.91-.17-.91-.52 0-.37.3-.55.97-.55.61 0 1.14.01 1.74.09v.01Zm0-.74a7.85 7.85 0 0 0-1.6-.14c-1.95 0-2.87.46-2.87 1.54 0 1.11.63 1.54 2.09 1.54 1.23 0 2.06-.31 2.37-1.07h.05l-.02.5c0 .4.07.43.4.43h1.51c-.08-.23-.13-.9-.13-1.46 0-.61.03-1.08.03-1.7 0-1.26-.76-2.07-3.15-2.07-1.02 0-2.16.18-3.03.44.08.34.2 1.04.26 1.5a6.64 6.64 0 0 1 2.64-.51c1.14 0 1.46.26 1.46.79v.2Zm4.18 1.09c-.2.03-.49.03-.78.03-.3 0-.58 0-.77-.03l-.01.2c0 1.05.69 1.66 3.1 1.66 2.27 0 3-.6 3-1.66 0-1-.48-1.5-2.64-1.61-1.68-.08-1.82-.26-1.82-.47 0-.24.21-.37 1.34-.37 1.16 0 1.48.16 1.48.5v.07a16.91 16.91 0 0 1 1.55 0v-.2c0-1.23-1.02-1.63-3-1.63-2.23 0-2.99.55-2.99 1.61 0 .96.6 1.55 2.75 1.64 1.58.05 1.75.23 1.75.47 0 .26-.25.38-1.36.38-1.28 0-1.6-.18-1.6-.54v-.05Zm7.28-4.41a6.43 6.43 0 0 1-2.3 1.27c.02.31.02.88.02 1.2h.55l-.02 1.8c0 1.1.59 1.95 2.42 1.95a8.4 8.4 0 0 0 1.92-.22 16.4 16.4 0 0 1-.17-1.52c-.38.13-.86.2-1.39.2-.73 0-1.03-.2-1.03-.79V9.1c.95 0 1.9.02 2.45.04a18 18 0 0 1 .03-1.48l-2.45.02c0-.37.02-.72.03-1.07h-.06Zm4.94 2.21.02-1.16h-1.66a102.96 102.96 0 0 1 0 5.08h1.9a41.9 41.9 0 0 1-.04-2.08c0-1.14.46-1.46 1.51-1.46.49 0 .84.06 1.14.16.01-.42.1-1.25.14-1.62-.31-.1-.66-.15-1.08-.15-.9-.01-1.56.36-1.87 1.24l-.06-.01Zm8.27 1.34c0 .91-.66 1.34-1.7 1.34-1.03 0-1.7-.4-1.7-1.34 0-.94.68-1.29 1.7-1.29 1.03 0 1.7.38 1.7 1.3Zm1.73-.04c0-1.82-1.42-2.63-3.43-2.63-2.02 0-3.39.81-3.39 2.63 0 1.8 1.28 2.78 3.38 2.78 2.12 0 3.44-.97 3.44-2.78Z"
|
||||
></path>
|
||||
<rect width="119" height="19" x=".5" y=".5" stroke="url(#b)" rx="3.5"></rect>
|
||||
<defs>
|
||||
<linearGradient id="a" x1="0" x2="88.9" y1="20" y2="-43.52" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#404b69"></stop>
|
||||
<stop offset="1" stop-color="#404b69"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
@ -13,14 +13,14 @@ const { post } = Astro.props;
|
||||
const postURL = urlJoin(options.website, post.permalink);
|
||||
const qq = querystring.stringify({
|
||||
url: postURL,
|
||||
pics: urlJoin(options.website, post.cover.src),
|
||||
pics: post.cover.src,
|
||||
summary: post.summary,
|
||||
});
|
||||
const weibo = querystring.stringify({
|
||||
url: postURL,
|
||||
type: 'button',
|
||||
language: 'zh_cn',
|
||||
pic: urlJoin(options.website, post.cover.src),
|
||||
pic: post.cover.src,
|
||||
searchPic: true,
|
||||
title: `【${post.title}】${post.summary}`,
|
||||
});
|
||||
|
@ -6,6 +6,7 @@ updated: 2024-04-08 19:27:27
|
||||
cover: /images/2019/05/2019051406433394.jpg
|
||||
published: true
|
||||
---
|
||||
|
||||
![いつまでも変わらずに by ふーらい](/images/2019/05/2019051406433394.jpg)
|
||||
|
||||
<MusicPlayer netease={22705492} />
|
||||
|
@ -6,6 +6,7 @@ updated: 2024-04-08 12:27:27
|
||||
cover: /images/2019/05/2019051406592297.jpg
|
||||
published: true
|
||||
---
|
||||
|
||||
![ホンノムシ by La-na](/images/2019/05/2019051406592297.jpg)
|
||||
|
||||
<MusicPlayer netease={2109088527} />
|
||||
|
@ -12,6 +12,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051817144382.jpg
|
||||
summary: 凤凰木,被誉为厦门的市树。当你漫步于厦门街头时,除了亚热带常见的棕榈,看得最多的树,怕就是它了。人行道上,放眼望去,一行行的都是凤凰树。
|
||||
---
|
||||
|
||||
![凤凰花1](/images/2019/05/2019051817144382.jpg)
|
||||
|
||||
<MusicPlayer netease={109734} />
|
||||
|
@ -12,6 +12,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051819264475.jpg
|
||||
summary: 天行健君子以自强不息。而对于思想,我则将它比做天鹅。不为其它,只因这思想太轻盈,有着一种如同天鹅翱翔般柔美。
|
||||
---
|
||||
|
||||
![新時代へ by ★cheese](/images/2019/05/2019051819264475.jpg)
|
||||
|
||||
<MusicPlayer netease={268154} />
|
||||
|
@ -15,6 +15,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051819204032.jpg
|
||||
summary: 三月,该是樱花开放的季节。而三月之际开放的鲜花,却不止樱花一种。但凭心而论,真正能触动心弦的词,该是樱花。
|
||||
---
|
||||
|
||||
![春の魔法 by のら](/images/2019/05/2019051819205590.jpg)
|
||||
|
||||
<MusicPlayer netease={1331313370} />
|
||||
|
@ -13,6 +13,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051819045868.jpg
|
||||
summary: 夏日傍晚的太阳已收敛了它一天的炎热,仅洒下点点余辉,投射在路面上。在这个略觉清爽的午后,我沿着屋后早已废弃的铁轨开始了随意的散步。
|
||||
---
|
||||
|
||||
![甘い甘い by nineo](/images/2019/05/2019051819045635.jpg)
|
||||
|
||||
<MusicPlayer netease={287035} />
|
||||
|
@ -14,6 +14,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051819385367.jpg
|
||||
summary: 这样的雨,实在是让人烦恼,接连数日,没有停的时候。这样的雨里,想做的事情实在很少。天空灰蒙蒙的,心情也仿佛蒙了灰尘,让人感觉整个世界变得忧郁而烦闷。
|
||||
---
|
||||
|
||||
![雨宿り by ハトリ](/images/2019/05/2019051819372187.jpg)
|
||||
|
||||
<MusicPlayer netease={114852} />
|
||||
|
@ -13,6 +13,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051819444155.jpg
|
||||
summary: 今天下午的厦门下起了雨,闷热而又纷乱,似乎与闷热的午后不相协调。一切显得是那么的突兀,就像那杂乱不堪的思绪纷纷扰扰洒落。
|
||||
---
|
||||
|
||||
![大人って by ゆづあ](/images/2019/05/2019051819432258.jpg)
|
||||
|
||||
<MusicPlayer netease={1426112587} />
|
||||
|
@ -13,6 +13,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051820015162.jpg
|
||||
summary: 经历了无数次的选择无数次的徘徊,最终还是选择了独立博客,这亦或是起点亦或是轮回。
|
||||
---
|
||||
|
||||
![Light Snow by Klegs](/images/2019/05/2019051819515850.jpg)
|
||||
|
||||
<MusicPlayer netease={1899950648} />
|
||||
|
@ -16,6 +16,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051820064669.jpg
|
||||
summary: 每本书都有属于自己的思想,亦可称之为灵魂。而这灵魂的载体便是纸张和文字。时间的流逝,可以令书本原本白皙的直面发黄、生霉。就像是少男少女的洁白的双手、粉嫩的面颊,在光阴的长河的洗涤下变得暗淡、起皱。
|
||||
---
|
||||
|
||||
![昼寝 by yohan12](/images/2019/05/2019051820064137.jpg)
|
||||
|
||||
<MusicPlayer netease={4879351} />
|
||||
|
@ -13,6 +13,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051820203620.jpg
|
||||
summary: 午后的时光,阳光明媚,气温尚好。我喜欢于此时在学校教学楼后的树荫下面读书,看天上风云变幻。而今天,却有人先来了。那是一段长达45秒的爱恋。
|
||||
---
|
||||
|
||||
![イルカの雲](/images/2019/05/2019051820203226.jpg)
|
||||
|
||||
<MusicPlayer netease={22705507} />
|
||||
|
@ -12,6 +12,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051820293355.jpg
|
||||
summary: 某个月明风高的深夜,我无意中打开学校的学生论坛。出奇的是,竟有2000多人在线,无聊的话题,纯表情的回复,似乎都在折射出一个词——“寂寞”。
|
||||
---
|
||||
|
||||
![夏の日の昼下がり by K,Kanehira](/images/2019/05/2019051820293355.jpg)
|
||||
|
||||
<MusicPlayer netease={1867107328} />
|
||||
|
@ -14,6 +14,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051820583532.jpg
|
||||
summary: 不知什么时候起,澡堂这个词离我们越来越远了;也不知又是什么时候起,热水器步入大街小巷。而澡堂,只能成为记忆中的点滴碎片,点缀成串,交织成一幅幅似曾相识的画面。
|
||||
---
|
||||
|
||||
![明かりの灯る街 by コーラ](/images/2019/05/2019051820583532.jpg)
|
||||
|
||||
<MusicPlayer netease={4879333} />
|
||||
|
@ -14,6 +14,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051821092623.jpg
|
||||
summary: 记得当时年纪小,你爱谈天我爱笑。有一回我们并肩坐在桃树下,风在林梢鸟在叫。后来不知怎么我们睡着了,梦里花落知多少。
|
||||
---
|
||||
|
||||
![chilling by ふすい@COMITIAね17a](/images/2019/05/2019051821154097.jpg)
|
||||
|
||||
<MusicPlayer netease={454182} />
|
||||
|
@ -13,6 +13,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051821195094.jpg
|
||||
summary: 儿时最喜欢做的事,就是傍晚同老妈的散步。漫步于夏日的傍晚,走过田野、小河,嗅着扑鼻的油菜花香,感受着迎面而来的略带凉爽的风。
|
||||
---
|
||||
|
||||
![告白 by アシマ](/images/2019/05/2019051821225466.jpg)
|
||||
|
||||
<MusicPlayer netease={420693} />
|
||||
|
@ -15,6 +15,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051821474615.png
|
||||
summary: 对于今年的7月7日来说,是个值得纪念的日子,伴随着我们童年长大的《哈利波特》系列终于落下了帷幕。那些美好,柔柔消散,竟让人忍不住落笔想念。
|
||||
---
|
||||
|
||||
![ただいま、おかえり by C](/images/2019/05/2019051821474615.png)
|
||||
|
||||
<MusicPlayer netease={379785} />
|
||||
|
@ -12,6 +12,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019052708550328.jpg
|
||||
summary: 夜 11:30,宿舍熄灯的瞬间,床头漆黑的夜色像某刻恬静的安详,心绪中无边无际的想念不觉纠缠。此刻,我想你了,好像此刻的孤单能有你相陪。将你们搂入怀中,轻嗅发丝间薰衣草的清香,心玄跟着挥舞懵懂。
|
||||
---
|
||||
|
||||
![echo blue by なつ](/images/2019/05/2019052708543516.jpg)
|
||||
|
||||
<MusicPlayer netease={527799} />
|
||||
|
@ -12,6 +12,7 @@ category: 文章
|
||||
cover: /images/2019/06/2019060512093940.jpg
|
||||
summary: 如果海会说话/如果风爱上沙/如果有些想念/遗忘在漫长的长假/我会聆听浪花/任记忆里的爱情/在时间潮汐里喧哗,我会试着把那一年的故事/再接下去说完。
|
||||
---
|
||||
|
||||
![遗失的美好](/images/2019/06/2019060512012051.jpg)
|
||||
|
||||
<MusicPlayer netease={1866489121} />
|
||||
|
@ -13,6 +13,7 @@ category: 文章
|
||||
cover: /images/2019/06/2019060512164612.jpg
|
||||
summary: 也许这个世界上本身真的存在一条逆流河。起源于大海、终于巨峰之顶。传说中,如果有人能够达到它的尽头,便会获得幸福。而你我便是用一生来追寻幸福的青鸟。
|
||||
---
|
||||
|
||||
![奈落の楽園 by ミア・スノーウィー](/images/2019/06/2019060512135888.jpg)
|
||||
|
||||
<MusicPlayer netease={1295704234} />
|
||||
|
@ -15,6 +15,7 @@ category: 文章
|
||||
cover: /images/2019/06/2019060607035266.jpg
|
||||
summary: “流水它带走光阴的故事,改变了两个人……”,耳机里一直重复地放着罗大佑的“光阴的故事”。沙哑的嗓音配上那忧伤歌词令人不觉心萌伤感。
|
||||
---
|
||||
|
||||
![orion by Nengoro(ネんごろぅ)](/images/2019/06/2019060607083452.jpg)
|
||||
|
||||
<MusicPlayer netease={26361010} />
|
||||
|
@ -12,6 +12,7 @@ category: 文章
|
||||
cover: /images/2019/06/2019060607210889.jpg
|
||||
summary: 又一次整理桌上散乱的纸张,无意中竟发现昔日尝试写的第一本同人小说的草稿,不禁有些淡淡的感触。那些文字,那些情感原来一直都存在着,只是我们未曾去发掘,便一次次地错失某些回忆。
|
||||
---
|
||||
|
||||
![](/images/2019/06/2019060607161615.jpg)
|
||||
|
||||
<MusicPlayer netease={287319} />
|
||||
|
@ -14,6 +14,7 @@ category: 文章
|
||||
cover: /images/2019/06/2019060607290148.jpg
|
||||
summary: 喜欢一个人默默地伫立在窗口任清风袭来,带走心底的疲惫,仰望苍穹。闲看庭前花开花落,漫步窗外,静看云卷云舒。
|
||||
---
|
||||
|
||||
![やがてくるすべての春へ by loundraw](/images/2019/06/2019060607242852.jpg)
|
||||
|
||||
<MusicPlayer netease={488388715} />
|
||||
|
@ -13,6 +13,7 @@ category: 杂思
|
||||
cover: /images/2019/07/2019071213470131.jpg
|
||||
summary: 今天是山大的110周年的校庆,作为一个山大人来说,应该是一个高兴的日子。可是,我却没有丝毫的欣喜,一个人坐在依旧空荡荡的自习室,耳机里听着“How to be alone”。
|
||||
---
|
||||
|
||||
![](/images/2019/07/2019071213435191.jpg)
|
||||
|
||||
<MusicPlayer netease={1810227452} />
|
||||
|
@ -12,6 +12,7 @@ category: 文章
|
||||
cover: /images/2019/07/2019071214170923.jpg
|
||||
summary: 傍晚时分,走出昏暗的教室,秋风乍起,阵阵寒风袭来,不禁打了一个寒战。看到路面上随风而起的梧桐叶,一如疲倦了的蝴蝶。
|
||||
---
|
||||
|
||||
![](/images/2019/07/2019071214170923.jpg)
|
||||
|
||||
<MusicPlayer netease={29539350} />
|
||||
|
@ -11,6 +11,7 @@ category: 文章
|
||||
summary: 还贪恋着,你的风情,诱惑着,你的神秘。埋葬了,我的爱情,忧郁蓝色土耳其。紧跟随着,我的稚气;逃避着,我的宿命。徘徊在,你的淡淡哀愁灰色眼眸里。
|
||||
cover: /images/2012/03/2012031120464600.jpg
|
||||
---
|
||||
|
||||
![両手に夏](/images/2012/04/2012042820514100.jpg)
|
||||
|
||||
<MusicPlayer netease={1389742858} />
|
||||
|
@ -13,6 +13,7 @@ category: 文章
|
||||
summary: 也许很少有人还记得1998年由法国电影导演帕特里斯 · 夏洛尔拍摄的电影《爱我就请去搭火车》。这部充溢着罗曼蒂克气息的电影故事取材自导演和他身边朋友的经历。
|
||||
cover: /images/2012/02/2012020821400300.jpg
|
||||
---
|
||||
|
||||
![習作 ぽっぽ猫](/images/2012/02/2012020821442400.jpg)
|
||||
|
||||
<MusicPlayer netease={408328757} />
|
||||
|
@ -12,6 +12,8 @@ cover: /images/2013/06/2013062023165500.jpg
|
||||
|
||||
![在你心里我也许只是你欣赏的风景 - 邦乔彦](/images/2013/06/2013062023222900.jpg)
|
||||
|
||||
<MusicPlayer netease={477931} />
|
||||
|
||||
闲了两个月后,我又把原本打算停笔不写的博客重新搭建起来,这算不算是个人的又一次纠结呢?掐指一算,写博已经有两年之久,这期间建博的来来去去,有些人走了,有些人还在继续。后台留言板内早些年的留言链接全是 404,只留下还存活着的头像,孤零零地像一座座坟墓。
|
||||
|
||||
记得刚开始写博的那段日子,总有那么一个夜晚,伴着舍友的呼吸声,从一个博客逛到另一个博客。看着大家的故事,品味着彷徨的心事,然后留下自己的链接,奢求能有同样认真阅读的人。而看多了安静凄美的文字,写多了哀而不伤的故事,挖掘透了刻骨铭心的恋情,心也就累了。有时想想,博客不是一种快乐,爱情也不是。如果你了解一个人经过怎样的岁月才会老去,你就能仔细品味出某种特异的感觉。就像博客,没有一年半载的坚持,又怎么知道最初的选择是否正确?曾打算不再写博,离开时抓紧双手,默默转身,无数次下定决心去遗忘。而当真的要走远时,却还是放不下名为牵挂的情绪。
|
||||
|
@ -16,10 +16,12 @@ summary: 有人说,记忆就像一首歌,你记不得它的词,却忘不
|
||||
|
||||
这不是一首忘记了的诗,而是一首由忘记组成的诗,它被我选择遗忘了八年。
|
||||
|
||||
<p style={{ textAlign: 'right' }}>——题记</p>
|
||||
——题记
|
||||
|
||||
![孤寂少女02](/images/2024/04/2024041620334700.jpg)
|
||||
|
||||
<MusicPlayer netease={1931996453} />
|
||||
|
||||
## 一、あの日から
|
||||
|
||||
对于小雨而言,04年那年他刚刚小学毕业,唱着羽泉的奔跑,随着父母的脚步,来到离厦门千里之外的济南读书。由于去得晚临近开学,小雨他爸不得不选择了全寄宿私立学校——齐鲁私立学校。时隔6年后,当小雨再次踏上这片陌生的故土,回望这所面目全非的学校的时候,那段尘封已久的记忆如洪水般袭来,心痛。
|
||||
@ -48,18 +50,24 @@ love you more than I can say.
|
||||
|
||||
![孤寂少女03](/images/2024/04/2024041620355700.jpg)
|
||||
|
||||
<MusicPlayer netease={571339572} />
|
||||
|
||||
## 二、好きって気持ち
|
||||
|
||||
(还没写)
|
||||
|
||||
![孤寂少女04](/images/2024/04/2024041620384100.jpg)
|
||||
|
||||
<MusicPlayer netease={22638663} />
|
||||
|
||||
## 三、さよなら
|
||||
|
||||
(还没写)
|
||||
|
||||
![孤寂少女05](/images/2024/04/2024041620373800.jpg)
|
||||
|
||||
<MusicPlayer netease={22711517} />
|
||||
|
||||
## 四、祈りの诗
|
||||
|
||||
那么年轻无虑的岁月究竟是何时被遗忘了,想要琢磨的那些时光却实实在在地模糊不清。那个每一天都饱满地像是一生岁月的年纪,那个想不出也不会想到明天的年纪,那个只喜欢在意一个女生的年纪。就像是漫长的前生,一直在某一个时光的转点之前悄悄地藏着。
|
||||
@ -78,6 +86,8 @@ love you more than I can say.
|
||||
|
||||
![孤寂少女06](/images/2024/04/2024041620364900.jpg)
|
||||
|
||||
<MusicPlayer netease={1958786696} />
|
||||
|
||||
## 后书き~
|
||||
|
||||
有关此故事的草稿初期拟定后将近1年没有动笔,说到底,其实还是自己放不下这段往事。因为年轻时的不懂,我很难想象给那个女孩子造成了多大的伤害。而其实,我的内心一直是丑陋的、黑暗的,自己得不到的东西,总想着去毁坏。那个时候的我,因为自卑,觉得自己肥胖、长得丑,所以与周围的人一直格格不入。不会为人处事,不懂得如何交朋友,说白了就是书呆子。
|
||||
|
@ -13,6 +13,8 @@ summary: 从忙碌的四月大补考到现在准备离校,一晃两个月过
|
||||
|
||||
![?](/images/2023/12/2023120306565488.jpg)
|
||||
|
||||
<MusicPlayer netease={1959716226} />
|
||||
|
||||
## 一、回忆
|
||||
|
||||
从忙碌的四月大补考到现在准备离校,一晃两个月过去了。停更的博客、塞满百封未读邮件的邮箱,似乎暗示的不仅仅是忙碌,还有某些道不出名的情绪。
|
||||
@ -21,15 +23,15 @@ summary: 从忙碌的四月大补考到现在准备离校,一晃两个月过
|
||||
|
||||
我能感觉到那些时间和日子逝去的彷徨,看着宿舍外的柳树从茂盛到枯萎,然后又迎来新的新生,有时候心情就像是那些路过的麻雀飞鸟,惶惶然又飞走……
|
||||
|
||||
但就在这种心情焦虑不安的情况下,回想过去,我也不曾后悔在大学度过的四年时光。虽然我曽一度沉迷于电脑中,翘课、通宵游戏、挂科,如同行尸走肉般活着。那段长达一整个学年的荒诞时光,就像是黎明前最为沉寂的黑暗,我挣扎地活着,想要逃脱那名为“寂寞”的牢笼,却发现自己已经身处围城之中。
|
||||
但就在这种心情焦虑不安的情况下,回想过去,我也不曾后悔在大学度过的四年时光。虽然我曾一度沉迷于电脑中,翘课、通宵游戏、挂科,如同行尸走肉般活着。那段长达一整个学年的荒诞时光,就像是黎明前最为沉寂的黑暗,我挣扎地活着,想要逃脱那名为“寂寞”的牢笼,却发现自己已经身处围城之中。
|
||||
|
||||
但好在还有我的同学,是你们,让我及时悬崖勒马。彬哥的高数辅导、彤姐的考点划题、田妹的自习陪伴、亮仔的通宵答疑、阿峰的细致总结,没有你们的帮助,或许我并不能如期毕业,拿到手上的学位证。
|
||||
|
||||
从大一入学到现在与你们一一道别,也快有四年了吧。四年时间,说长不长,说短不短,也就南非世界杯到巴西世界杯的间隔。但四年前我们一起军训的那个夜晚,我们一起立下的理想,却永远不会更改。
|
||||
|
||||
我们依旧追求着自己的梦想,依旧爱着所爱的人,依旧向着美好人生的理想前进。有时挫折悲伤难过,但仍然前行,仍然走着选择的路。没有迷失在某个岔路口,仍然是我们当初所希望成为的样子。
|
||||
我们依旧追求着自己的梦想,依旧爱着所爱的人,依旧向着美好人生的理想前进。有时挫折、悲伤、难过,但仍然前行,仍然走着选择的路。没有迷失在某个岔路口,仍然是我们当初所希望成为的样子。
|
||||
|
||||
希望再过十年,二十年,我们仍然在路上,不曾走失,不曾忘记年轻时的模样。不曾丢失爱我们和我们爱着的人。
|
||||
希望再过十年、二十年,我们仍然在路上,不曾走失,不曾忘记年轻时的模样。不曾丢失爱我们和我们爱着的人。
|
||||
|
||||
## 二、爱情
|
||||
|
||||
@ -45,15 +47,15 @@ summary: 从忙碌的四月大补考到现在准备离校,一晃两个月过
|
||||
|
||||
那些回不去的少年伤痛时光,现在只能铭刻于心,随时间慢慢抚平。
|
||||
|
||||
爱过,因为青春;痛过,学会成长。我依旧坚信爱情,依旧相信生命中最美好的事物某过于此。炫若花火的激情固然难以忘却,然而一并度过流年何尝不是刻骨铭心?
|
||||
爱过,因为青春;痛过,学会成长。我依旧坚信爱情,依旧相信生命中最美好的事物莫过于此。炫若花火的激情固然难以忘却,然而一并度过流年何尝不是刻骨铭心?
|
||||
|
||||
## 三、未来
|
||||
|
||||
我曾经在博客中写过,毕业,就像是一道窗,我们鼓起勇气撞破穿过它,然后血肉模糊地开始另一个新的开始。
|
||||
|
||||
生命那么长,又那么短。倘若按80年计算,那便是2522880000秒,就是这么漫长的生命轮回,一眨眼便过去了四分之一,让人惶恐无奈。
|
||||
生命那么长,又那么短。倘若按 80 年计算,那便是 2,522,880,000 秒,就是这么漫长的生命轮回,一眨眼便过去了四分之一,让人惶恐无奈。
|
||||
|
||||
年少时曽有过的无数理想,青年时立下的化学研究梦,现如今都被现实扯得支离破碎,徒留着活着这一最底层的需求。也许我们中的大多数人,终年如一日地奔波在住所与公司之间,为着面包、住房、家庭而奋斗着。也许过去的豪言壮语是那么荒唐狗血,但依旧希望你不要将它们忘记,因为,这就是青春。
|
||||
年少时曾有过的无数理想,青年时立下的化学研究梦,现如今都被现实扯得支离破碎,徒留着活着这一最底层的需求。也许我们中的大多数人,终年如一日地奔波在住所与公司之间,为着面包、住房、家庭而奋斗着。也许过去的豪言壮语是那么荒唐狗血,但依旧希望你不要将它们忘记,因为,这就是青春。
|
||||
|
||||
人生还很长,漫长到足够让我们忘记很多年前发生的事情……希望曾经一起并肩学习的朋友,无论你在哪里,你在何种阶段,学业、奋斗中、还是事业有成,都还能记得那些曾经的美好,不言夙伤。
|
||||
|
||||
|
@ -13,29 +13,31 @@ summary: 有时候,伴着6点的闹钟声醒来,大抵会有种回到高中
|
||||
|
||||
![朝露](/images/2023/12/2023120306305570.jpg)
|
||||
|
||||
<MusicPlayer netease={27646205} />
|
||||
|
||||
## 一、适应早起
|
||||
|
||||
有时候,伴着6点的闹钟声醒来,大抵会有种回到高中的感觉。习惯了大学里一觉睡到上午9点的感觉,现在突然要早起,一开始还真有点不适应。
|
||||
有时候,伴着 6 点的闹钟声醒来,大抵会有种回到高中的感觉。习惯了大学里一觉睡到上午 9 点的生活,现在突然要早起,一开始还真有点不适应。
|
||||
|
||||
原先读高中的时候,早上都是靠着爸爸把我叫醒,有的时候还要撒娇要老爸把我抱起来。工作一周后的我闹钟一响便能自动爬起来洗漱上班,想想还真有点不可思议,看来我还是蛮适合工作的。北京的地铁无时无刻不是那么的挤,即使是早上6点半的地铁,如果稍微晚了那么一会,也是人头攒动。因为我工作的地方属于北京CBD,所以我住的地方离公司很远。于是,每天的上班之旅,便是一场艰难的赛跑。
|
||||
读高中的时候,早上都是靠着爸爸把我叫醒,有的时候还要撒娇要老爸把我抱起来。工作一周后的我闹钟一响便能自动爬起来洗漱上班,想想还真有点不可思议,看来我还是蛮适合工作的。北京的地铁无时无刻不是那么的挤,即使是早上 6 点半的地铁,如果稍微晚了那么一会,也是人头攒动。因为我工作的地方属于北京 CBD,所以我住的地方离公司很远。于是,每天的上班之旅,便是一场艰难的赛跑。
|
||||
|
||||
公交205路——地铁13线——地铁10线——步行,每天花在上班路上的时间就有1个多小时。记得以前在厦门科技中学读高中的时候,上学的路程也有将近1个多小时,每天我都是坐在晃悠的公交车的最后一排,一边迷迷糊糊地背着单词,一边色眯眯地瞟着漂亮姑娘。
|
||||
公交 205 路——地铁 13 线——地铁 10 线——步行,每天花在上班路上的时间就有 1 个多小时。记得以前在厦门科技中学读高中的时候,上学的路程也有将近 1 个多小时,每天我都是坐在晃悠的公交车的最后一排,一边迷迷糊糊地背着单词,一边色眯眯地瞟着漂亮姑娘。
|
||||
|
||||
记忆这玩意真的很奇怪,很多过去的事情,本来以为早已忘记,却又在遇到类似情境的时候回忆起来,让人捉摸不定。只是现在的我早已没有了看姑娘的心境,站在拥挤闷热的地铁车厢里,被人挤得连扶手都找不到。窗外是一成不变的黑暗,呼啸的风声让人恐惧,如同迷茫的未来……
|
||||
|
||||
## 二、消费水平
|
||||
|
||||
才来北京前同学间流传着各种关于北京的版本,无非不是什么北京消费高,环境差7788的。真正来到北京,开始工作才发现,很多东西,还是眼见为实的好。
|
||||
才来北京前同学间流传着各种关于北京的版本,无非不是什么北京消费高、环境差 7788 的。真正来到北京,开始工作才发现,很多东西,还是眼见为实的好。
|
||||
|
||||
北京的地铁和公交便宜到令人惊讶,2年前去上海玩,上海的地铁是按距离收费的,稍微远一点的地方,可能就要10元,北京的地铁是2元通票,无论你到哪个地方,无论你换乘几次,都是2元。而厦门的公交车就算优惠,也要0.85元,济南的空调车就算刷卡也要1.6元,而北京的公交都是4角,而且都有空调。
|
||||
北京的地铁和公交便宜到令人惊讶。2 年前去上海玩,上海的地铁是按距离收费的,稍微远一点的地方,可能就要 10 元,北京的地铁是 2 元通票,无论你到哪个地方,无论你换乘几次,都是 2 元。而厦门的公交车就算优惠,也要 0.85 元,济南的空调车就算刷卡也要 1.6 元,而北京的公交都是 4 角,而且都有空调。
|
||||
|
||||
才工作的那几天的午餐倒是被坑了好几次,后面和前辈一起吃饭,才找到了物廉价美的地方。北京的生活消费水平没有想象中的那么贵,倒是房租,真的让人无力吐槽。
|
||||
才工作的那几天的午餐倒是被坑了好几次,后面和前辈一起吃饭,才找到了物美价廉的地方。北京的生活消费水平没有想象中的那么贵,倒是房租,真的让人无力吐槽。
|
||||
|
||||
## 三、工作感受
|
||||
|
||||
不知道是因为才入职还是特例,我就职的公司易宝支付的工作没有想象中那么忙碌,好几个去了华为的小伙伴现在就开始天天加班。而我这里上班不需要刷卡考勤,工牌只有门禁的作用。工作的时间也可以自由调整申请,比如可以在OA上申请10点上班,7点下班。工作时间也讲究诚信自觉,比如饭点是12点,我们往往会提前20分钟就在部门群里面募集小伙伴吃饭,但是会早于1点自觉开始工作。比起大三暑假项目实训的各种准时准点的指纹考勤,没有考勤的正式工作让人更加轻松愉快。
|
||||
不知道是因为才入职还是特例,我就职的公司易宝支付的工作没有想象中那么忙碌,好几个去了华为的小伙伴现在就开始天天加班。而我这里上班不需要刷卡考勤,工牌只有门禁的作用。工作的时间也可以自由调整申请,比如可以在 OA 上申请 10 点上班,7 点下班。工作时间也讲究诚信自觉,比如饭点是 12 点,我们往往会提前 20 分钟就在部门群里面募集小伙伴吃饭,但是会早于 1 点自觉开始工作。比起大三暑假项目实训的各种准时准点的指纹考勤,没有考勤的正式工作让人更加轻松愉快。
|
||||
|
||||
公司的同事大都很年轻,即使是我的部门主管李均柠,也才32岁。大家的脾气都很好,相处起来也十分容易。就算是比较严肃的公司技术中心季度大会上也会直接拿主管开玩笑:“均柠你什么时候结婚啊?”更有甚者,在我们这群新员工集体介绍的时候会在下面吼道:“台上的妹子你们单身么?”(不要无视还在自我介绍的我啊!)
|
||||
公司的同事大都很年轻,即使是我的部门主管李均柠,也才 32 岁。大家的脾气都很好,相处起来也十分容易。就算是比较严肃的公司技术中心季度大会上也会直接拿主管开玩笑:“均柠你什么时候结婚啊?”更有甚者,在我们这群新员工集体介绍的时候会在下面吼道:“台上的妹子你们单身么?”(不要无视还在自我介绍的我啊!)
|
||||
|
||||
---
|
||||
|
||||
|
@ -15,52 +15,54 @@ summary: 来北京工作已经一个多月,大都市的生活比起读大学
|
||||
|
||||
来北京工作已经一个多月,大都市的生活比起读大学要忙碌得多,尤其是出行,基本以小时为计时单位。有时茫然看着窗外车水马龙,会有些迷茫自己选择的是对还是错。
|
||||
|
||||
题外话不多说,回归这次的主题,扒一扒我看过的那些Linux相关的书籍。
|
||||
题外话不多说,回归这次的主题,扒一扒我看过的那些 Linux 相关的书籍。
|
||||
|
||||
对于Linux的了解和接触,缘起自大一时候的Linux限选课,老师说这门课可选可不选,但是选修后考试挂了的话需要补考。当时的我还比较爱学习,于是兴冲冲地选修了这门课,用的是清华大学出版社出版的《Ubuntu Linux应用技术教程》。这本书写的并不是很好,里面对于图形界面的叫法还是最原始的XWindows,此书一大半都是基于图形界面说什么安装啊、应用软件使用啊、7788的。但也简单讲了`bash`的使用和常见的命令,比如`ls -all`然后用管道`|`将输入导入至`wc -l`来计算文件数,还有一些简单的vi编辑器的使用,Shell脚本的写法。
|
||||
对于 Linux 的了解和接触,缘起自大一时候的 Linux 限选课,老师说这门课可选可不选,但是选修后考试挂了的话需要补考。当时的我还比较爱学习,于是兴冲冲地选修了这门课,用的是清华大学出版社出版的《Ubuntu Linux 应用技术教程》。这本书写的并不是很好,里面对于图形界面的叫法还是最原始的 XWindows,此书一大半都是基于图形界面说什么安装啊、应用软件使用啊、七七八八的。但也简单讲了 `bash` 的使用和常见的命令,比如 `ls -all` 然后用管道 `|` 将输入导入至 `wc -l` 来计算文件数,还有一些简单的 vi 编辑器的使用,Shell 脚本的写法。
|
||||
|
||||
当时因为才开始学的原因,什么都不懂,渐渐地,也就失去兴趣没怎么好好学。课程对应的实验都是和老师卖萌才过的,考试的时候也就是背了一下往年的考题,考完就忘得一干二净。现在想起来,还有点小后悔。
|
||||
|
||||
本以为噩梦就此结束,我与Linux应该是老死不相往来,作为一名从小学四年级就开始学习使用Windows的用户,我真的很难适应和使用Linux。可是大二学习操作系统原理的时候再一次无奈了,我们的一切实验的环境都是在Linux下面,使用那些基本`fork()` `pipe()` 等Linux下面的C函数进行操作系统的实验。当时在极其痛苦的情况下重拾课本,花了整整一周时间去学习使用Shell,学习简单的C语言(**妈的,看的是谭浩强的书**),会用vi来编辑,会手动写Makefile使用gcc编译。
|
||||
本以为噩梦就此结束,我与 Linux 应该是老死不相往来,作为一名从小学四年级就开始学习使用 Windows 的用户,我真的很难适应和使用 Linux。可是大二学习操作系统原理的时候再一次无奈了,我们的一切实验的环境都是在 Linux 下面,使用那些基本 `fork()`、`pipe()` 等 Linux 下面的 C 函数进行操作系统的实验。当时在极其痛苦的情况下重拾课本,花了整整一周时间去学习使用 Shell,学习简单的 C 语言(**妈的,看的是谭浩强的书**),会用 vi 来编辑,会手动写 Makefile 使用 gcc 编译。
|
||||
|
||||
这期间通过学长的介绍知道鸟哥这位Linux大牛,开始阅读他的《鸟哥的Linux私房菜》。很遗憾的是,鸟哥的教程是基于CentOS来介绍的,看完开头极其冗余复杂的安装部分,我就“阵亡了”。“妈妈啊,快来救我,Linux怎么这么复杂,什么Ubuntu、什么CentOS,还完全不怎么一样。”
|
||||
这期间通过学长的介绍知道鸟哥这位 Linux 大牛,开始阅读他的《鸟哥的 Linux 私房菜》。很遗憾的是,鸟哥的教程是基于 CentOS 来介绍的,看完开头极其冗余复杂的安装部分,我就“阵亡了”。“妈妈啊,快来救我,Linux 怎么这么复杂,什么 Ubuntu、什么 CentOS,还完全不怎么一样。”
|
||||
|
||||
真正意义上接触并使用Linux,严格意义上说还得感谢“笨兔兔”这位Linux大牛。当时 Ubuntu 12.04 正好才出,本着不装逼就不会死的精神,我安装了这个系统,准备弄个双系统来装装逼。在研究如何配置 Ubuntu 12.04 的时候正好搜到了笨兔兔在他的博客发表的配置博文,当时也就是按照教程一行一行地复制粘贴命令。稍微知道如何使用 PPA 来安装 Ubuntu Tweak (一个国人写的对Ubuntu进行简单定制和优化的软件,你可以理解为Win里面的360)。这期间阅读他的博客,接触到深度的Linux发行版Deepin Linux。
|
||||
真正意义上接触并使用 Linux,严格意义上说还得感谢“笨兔兔”这位 Linux 大牛。当时 Ubuntu 12.04 正好才出,本着不装逼就不会死的精神,我安装了这个系统,准备弄个双系统来装装逼。在研究如何配置 Ubuntu 12.04 的时候正好搜到了笨兔兔在他的博客发表的配置博文,当时也就是按照教程一行一行地复制粘贴命令。稍微知道如何使用 PPA 来安装 Ubuntu Tweak(一个国人写的对 Ubuntu 进行简单定制和优化的软件,你可以理解为 Win 里面的 360)。这期间阅读他的博客,接触到深度的 Linux 发行版 Deepin Linux。
|
||||
|
||||
什么?专门为国人打造的便于国人使用的Linux?不错,装!
|
||||
什么?专门为国人打造的便于国人使用的 Linux?不错,装!
|
||||
|
||||
在我安装使用后立刻就被它的界面所吸引,坦白说 LinuxDeepin 12.04 真的很优秀,它基于Ubuntu 12.04 的基础上,去掉了那个真的超级丑超级难用的Unity,美化了各种常见的组件。直到现在,我家里上大学前的台式机还装的是此系统。
|
||||
在我安装使用后立刻就被它的界面所吸引,坦白说 LinuxDeepin 12.04 真的很优秀,它基于 Ubuntu 12.04 的基础上,去掉了那个真的超级丑超级难用的 Unity,美化了各种常见的组件。直到现在,我家里上大学前的台式机还装的是此系统。
|
||||
|
||||
当时逛Deepin社区的时候,看到懒蜗牛Gentoo的《Linux入门很简单》出版了,看完电子版前2章后我就被此书深深地吸引了。真的,它一点都不枯燥,语言十分浅显风趣,内容也简单使用。实体版到货后我立刻通宵2天把它看完,虽然最后部分的程序编译有点云里雾里,但是基本的日常使用已经无碍。
|
||||
当时逛 Deepin 社区的时候,看到懒蜗牛 Gentoo 的《Linux 入门很简单》出版了,看完电子版前两章后我就被此书深深地吸引了。真的,它一点都不枯燥,语言十分浅显风趣,内容也简单实用。实体版到货后我立刻通宵两天把它看完,虽然最后部分的程序编译有点云里雾里,但是基本的日常使用已经无碍。
|
||||
|
||||
这个时候Linux已经基本被我用于日常的装逼,每当我在自习室前排用着Linux上网,常常会以一种看土鳖的眼神看着那些 Mac 上装 Windows 的同学,心里暗自发笑。
|
||||
这个时候 Linux 已经基本被我用于日常的装逼,每当我在自习室前排用着 Linux 上网,常常会以一种看土鳖的眼神看着那些 Mac 上装 Windows 的同学,心里暗自发笑。
|
||||
|
||||
故事本该到了这里就结束,反正Deepin日常使用已经无碍,还有什么好学的。可命运就是这么神奇,它往往会在你最得意的时候给你浇盆冷水,让你“压压惊”。
|
||||
故事本该到了这里就结束,反正 Deepin 日常使用已经无碍,还有什么好学的。可命运就是这么神奇,它往往会在你最得意的时候给你浇盆冷水,让你“压压惊”。
|
||||
|
||||
那时已经到了13年,我开始迷恋上写博客,在学校组团参加CCF大会的时候接触到阿里云,和阿里云的销售一聊天,他大手一挥给了我一张半年的代金券,此券也开启了我新的Linux学习之路。
|
||||
那时已经到了 13 年,我开始迷恋上写博客,在学校组团参加 CCF 大会的时候接触到阿里云,和阿里云的销售一聊天,他大手一挥给了我一张半年的代金券,此券也开启了我新的 Linux 学习之路。
|
||||
|
||||
下单安装ECS系统,果断Linux,选择系统的时候果断装逼,Ubuntu和Deepin一样,咱不屑于使用,咱要用CentOS。等云主机资源分配好可以运行时,我就傻眼了。纳呢,没有图形界面!只有一个简陋的Shell界面!这不是坑爹么!
|
||||
下单安装 ECS 系统,果断 Linux,选择系统的时候果断装逼,Ubuntu 和 Deepin 一样,咱不屑于使用,咱要用 CentOS。等云主机资源分配好可以运行时,我就傻眼了。纳呢,没有图形界面!只有一个简陋的 Shell 界面!这不是坑爹么!
|
||||
|
||||
没有熟悉的 apt-get,没有了熟悉的软件包名,我不得不重拾大一的课本继续蛋疼地看那些常见命令,yum 的使用也让我蛋碎一地。等我使用 yum 搭建好 LAMP 环境嘚瑟地在一个主机交流群里面炫耀时,某位大神(**这里他要求不透露姓名**)很是鄙视地说:现在流行LNMP,流行编译源代码。
|
||||
没有熟悉的 apt-get,没有了熟悉的软件包名,我不得不重拾大一的课本继续蛋疼地看那些常见命令,yum 的使用也让我蛋碎一地。等我使用 yum 搭建好 LAMP 环境嘚瑟地在一个主机交流群里面炫耀时,某位大神(**这里他要求不透露姓名**)很是鄙视地说:现在流行 LNMP,流行编译源代码。
|
||||
|
||||
得,你丫瞧不起我是吧,我也给你整出来……
|
||||
|
||||
这期间学会了很多,参考了各种官方文档、手册、教程,一点点学会如何`wget`源码包,如何解包。看着`./configure --help`后面的一大串长到吐的参数一点点配置,看着`make`时候屏幕上滚动的各种debug信息暗自发呆。有时候为了解决一个简单的缺少依赖的问题Google一整个下午。即使是最后的编译完后,`make install`之后的配置也让我头疼万分,Nginx与FastCGI的交互,php-fpm的配置,MySQL的优化等等……
|
||||
这期间学会了很多,参考了各种官方文档、手册、教程,一点点学会如何 `wget` 源码包,如何解包。看着 `./configure --help` 后面的一大串长到吐的参数一点点配置,看着 `make` 时候屏幕上滚动的各种 debug 信息暗自发呆。有时候为了解决一个简单的缺少依赖的问题 Google 一整个下午。即使是最后的编译完后,`make install` 之后的配置也让我头疼万分,Nginx 与 FastCGI 的交互,php-fpm 的配置,MySQL 的优化等等……
|
||||
|
||||
很庆幸有这么一段黑暗的学习经历,因为真正的动手学习配置才对 Linux 有了深入的了解。当然,用前女友云儿的话说:装逼是要付出代价的。因为对 Linux 本身产生了极大的兴趣,这期间也读了很多设计的书籍,比如那本《Linux/Unix设计思想》。我至今依旧记得那个经典的小即是美的设计理念,没有代码层面的讲述,全书薄薄的一册介绍了各种Linux相关的编程理念,十分经典。
|
||||
很庆幸有这么一段黑暗的学习经历,因为真正的动手学习配置才对 Linux 有了深入的了解。当然,用前女友云儿的话说:装逼是要付出代价的。因为对 Linux 本身产生了极大的兴趣,这期间也读了很多设计的书籍,比如那本《Linux/Unix 设计思想》。我至今依旧记得那个经典的小即是美的设计理念,没有代码层面的讲述,全书薄薄的一册介绍了各种 Linux 相关的编程理念,十分经典。
|
||||
|
||||
还有就是那本《Linux内核设计与实现》,当时因为上选修课需要用到此书,在老师的讲授下结合以前学过的操作系统知识,真的能学到很多东西。比如,如何时间调度,如何实现排序,如何中断……
|
||||
还有就是那本《Linux 内核设计与实现》,当时因为上选修课需要用到此书,在老师的讲授下结合以前学过的操作系统知识,真的能学到很多东西。比如,如何时间调度,如何实现排序,如何中断……
|
||||
|
||||
2013年年底买了Kindle,又一次开始了我的新的Linux学习之路,当时国行还没上市。因为学生党,兜里银子少,就买了日货。可是问题由此而来,日版没有中文界面。在研究时发现Kindle官网部分开源了Kindle的源码,于是我便萌发了自己编译Kindle内核来装逼的想法。从基础的交叉编译工具链的搭建,到内核源码的定制配置,BusyBox的编译,UBoot的定制,还有Eink驱动的移植……
|
||||
2013 年年底买了 Kindle,又一次开始了我的新的 Linux 学习之路,当时国行还没上市。因为学生党,兜里银子少,就买了日货。可是问题由此而来,日版没有中文界面。在研究时发现 Kindle 官网部分开源了 Kindle 的源码,于是我便萌发了自己编译 Kindle 内核来装逼的想法。从基础的交叉编译工具链的搭建,到内核源码的定制配置,BusyBox 的编译,UBoot 的定制,还有 Eink 驱动的移植……
|
||||
|
||||
因为涉及的东西很多很杂,在别人的指导下先看完了LFS手册,本着不装逼就不会死的原则先行尝试编译LFS,然后慢慢上手嵌入式系统的编译。因为基础比较薄弱的问题(连Shell脚本都不会写),又买了一本《Unix&Linux大学教程》读完。
|
||||
因为涉及的东西很多很杂,在别人的指导下先看完了 LFS 手册,本着不装逼就不会死的原则先行尝试编译 LFS,然后慢慢上手嵌入式系统的编译。因为基础比较薄弱的问题(连 Shell 脚本都不会写),又买了一本《Unix&Linux 大学教程》读完。
|
||||
|
||||
说了这么多废话,该讲讲今天参加图灵活动赠送的书籍 **《Linux就是这个范儿》**。如果不是图灵市场部的英子姐姐在读者交流群里面公布了这个新书发布会,很有可能我就这的与这本好书擦肩而过。这本书是由阿里巴巴的两位大牛 **赵鑫磊** 和 **张洁** 写的,赵老师一直在淘宝大学里面做Linux的培训,此书的前身就是他的上课讲义。
|
||||
说了这么多废话,该讲讲今天参加图灵活动赠送的书籍 **《Linux 就是这个范儿》**。如果不是图灵市场部的英子姐姐在读者交流群里面公布了这个新书发布会,很有可能我就此与这本好书擦肩而过。这本书是由阿里巴巴的两位大牛 **赵鑫磊** 和 **张洁** 写的,赵老师一直在淘宝大学里面做 Linux 的培训,此书的前身就是他的上课讲义。
|
||||
|
||||
书的内容真的很全很全,但很遗憾的是它不够细,可能是限于篇幅的原因,很多都只是简单介绍,一带而过。但是书籍的编写语言却十分风趣幽默,初看此书的第一眼,就有一种在看《Linux入门很简单的感觉》,十分亲切。
|
||||
书的内容真的很全很全,但很遗憾
|
||||
|
||||
整个图书发布会上,张洁老师的精彩演讲,赵老师的健谈和广泛的知识面都让人印象十分深刻。很多问题,从他们的口中都能得到很好地解答。我曾经一个glibc的依赖问题将整个系统yum仓库弄坏,和赵老师交流时竟然发现他也有相似的经历,当然结果是无解。(╮(╯▽╰)╭)
|
||||
的是它不够细,可能是限于篇幅的原因,很多都只是简单介绍,一带而过。但是书籍的编写语言却十分风趣幽默,初看此书的第一眼,就有一种在看《Linux 入门很简单》的感觉,十分亲切。
|
||||
|
||||
还记得赵老师在《Linux就是这个范儿》一书开头的那个“黄色冷笑话”,简单回顾一下我这短暂的2年Linux学习历程。其实很容易发现,学习,就像爬山一样,没有平坦的大道,需要努力地去攀登,即使途中某段是平面,那是因为后面还有更加陡峭的阶梯等待着你去攀登。
|
||||
整个图书发布会上,张洁老师的精彩演讲,赵老师的健谈和广泛的知识面都让人印象十分深刻。很多问题,从他们的口中都能得到很好地解答。我曾经一个 glibc 的依赖问题将整个系统 yum 仓库弄坏,和赵老师交流时竟然发现他也有相似的经历,当然结果是无解。(╮(╯▽╰)╭)
|
||||
|
||||
还记得赵老师在《Linux 就是这个范儿》一书开头的那个“黄色冷笑话”,简单回顾一下我这短暂的两年 Linux 学习历程。其实很容易发现,学习,就像爬山一样,没有平坦的大道,需要努力地去攀登,即使途中某段是平面,那是因为后面还有更加陡峭的阶梯等待着你去攀登。
|
||||
|
||||
学无止境!
|
||||
|
@ -12,13 +12,13 @@ summary: 写Java一类的面相对象语言的程序员常常会遇到这么一
|
||||
|
||||
![Java](/images/2024/04/2024041520494100.jpg)
|
||||
|
||||
写Java一类的面相对象语言的程序员常常会遇到这么一个冷笑话:我今年都30了,还没找到对象,怎么办?简单啊,new 一个对象就好。
|
||||
写 Java 一类的面相对象语言的程序员常常会遇到这么一个冷笑话:我今年都30了,还没找到对象,怎么办?简单啊,new 一个对象就好。
|
||||
|
||||
当然这只是一个冷笑话,所谓的 new 一个对象,无非不就是调用这个类的构造方法去创建对象。乍一看也没什么问题,写个类ABC,用的时候new ABC()就好了。那么,会想一下,我们读书的时候,老师一定会说一个类的构造方法可以允许传入参数,甚至根据传入参数的不同创建多个构造方法。
|
||||
当然这只是一个冷笑话,所谓的 new 一个对象,无非不就是调用这个类的构造方法去创建对象。乍一看也没什么问题,写个类 ABC,用的时候 `new ABC()` 就好了。那么,会想一下,我们读书的时候,老师一定会说一个类的构造方法可以允许传入参数,甚至根据传入参数的不同创建多个构造方法。
|
||||
|
||||
学过面向对象的你一定会说,没错啊,就是这样,方法重载,签名校验。都是一个方法,Perfect!那么,我们设想下面这么一种情况:
|
||||
|
||||
假如我们有一个DTO类 CredentialsAuthParam 作为对外接口的传入参数,作为一个POJO类,我们一般就是定义一堆属性,然后一堆Getter、Setter,比如,我们可以这么定义:
|
||||
假如我们有一个 DTO 类 CredentialsAuthParam 作为对外接口的传入参数,作为一个 POJO 类,我们一般就是定义一堆属性,然后一堆 Getter、Setter,比如,我们可以这么定义:
|
||||
|
||||
```java
|
||||
package me.yufan.dto;
|
||||
@ -84,7 +84,7 @@ public class CredentialsAuthParam implements Serializable {
|
||||
|
||||
看着很棒,多么简单,用 CredentialsAuthParam 的时候 new 一下,作为传入参数调用接口的方法就好。
|
||||
|
||||
那么,如果我的对象要设置属性怎么办?一个个Setter?为何不能在创建对象时创建呢?比如,构造方法里面指定参数?没错,然后我们就有了下面的一堆构造方法。
|
||||
那么,如果我的对象要设置属性怎么办?一个个 Setter?为何不能在创建对象时创建呢?比如,构造方法里面指定参数?没错,然后我们就有了下面的一堆构造方法。
|
||||
|
||||
```java
|
||||
public CredentialsAuthParam(String source, String validationCode) {
|
||||
@ -107,11 +107,11 @@ public CredentialsAuthParam(String source, String validationCod,
|
||||
}
|
||||
```
|
||||
|
||||
那么问题来了,参数这么多,又都是String,创建一个对象多麻烦。又比如,我只想指定其中3个属性,又都是String,但现在已经有了一个为3个String 参数的构造方法。怎么办?
|
||||
那么问题来了,参数这么多,又都是 String,创建一个对象多麻烦。又比如,我只想指定其中 3 个属性,又都是 String,但现在已经有了一个为 3 个 String 参数的构造方法。怎么办?
|
||||
|
||||
Java对方法重载的判断是按照签名的类型进行校验。所以方法参数顺序需要开发在使用时自己指定,也许我方法参数是:String source, String validationCode。但结果我因为复制粘贴不仔细变成了this.source = validationCode; this.validationCode = source;(别笑,你忙着写垃圾代码的时候就会出错) 或者构造方法使用者弄混了两个参数的顺序。那么就会出事啦。
|
||||
Java 对方法重载的判断是按照签名的类型进行校验。所以方法参数顺序需要开发在使用时自己指定,也许我方法参数是:String source, String validationCode。但结果我因为复制粘贴不仔细变成了 `this.source = validationCode; this.validationCode = source;`(别笑,你忙着写垃圾代码的时候就会出错) 或者构造方法使用者弄混了两个参数的顺序。那么就会出事啦。
|
||||
|
||||
其实如果你看过Java圣经Effective Java的话,一定会注意到里面说过构造器(Builder),多个参数的构造方法一定要考虑使用构造器。比如,我们可以这么写:
|
||||
其实如果你看过 Java 圣经 Effective Java 的话,一定会注意到里面说过构造器(Builder),多个参数的构造方法一定要考虑使用构造器。比如,我们可以这么写:
|
||||
|
||||
```java
|
||||
package me.yufan.dto;
|
||||
@ -149,7 +149,7 @@ public class CredentialsAuthParamBuilder {
|
||||
}
|
||||
```
|
||||
|
||||
然后将原来类的构造方法定义为Protected,然后创建对象的时候只需要:
|
||||
然后将原来类的构造方法定义为 Protected,然后创建对象的时候只需要:
|
||||
|
||||
```java
|
||||
new CredentialsRequestParamBuilder()
|
||||
@ -161,7 +161,7 @@ new CredentialsRequestParamBuilder()
|
||||
|
||||
接下来,我们说说单例模式:
|
||||
|
||||
单例(Singleton),顾名思义,就是只被实例化一次的类。比如,我在MVC的拦截器中需要调用一个公共类,它里面存放的东西是大家共享的,我可以这么写:
|
||||
单例(Singleton),顾名思义,就是只被实例化一次的类。比如,我在 MVC 的拦截器中需要调用一个公共类,它里面存放的东西是大家共享的,我可以这么写:
|
||||
|
||||
```java
|
||||
public class AuthorityInterceptorHelper {
|
||||
@ -186,7 +186,7 @@ public class AuthorityInterceptorHelper {
|
||||
}
|
||||
```
|
||||
|
||||
我首先要在内部定义一个自身的静态对象,然后将构造方法私有,getInstance()会先去看静态对象存在否,不存在,先加锁,也许加锁期间其他方法先调用此方法创建对象,再看看对象是否存在,不存在,创建对象解锁。
|
||||
我首先要在内部定义一个自身的静态对象,然后将构造方法私有,`getInstance()` 会先去看静态对象存在否,不存在,先加锁,也许加锁期间其他方法先调用此方法创建对象,再看看对象是否存在,不存在,创建对象解锁。
|
||||
|
||||
看起来没什么问题,代码严密,十分规范,大家都是这么写的。但是,单例了么?定义为私有的方法一定没法访问了么?反射呢?
|
||||
|
||||
|
@ -11,11 +11,13 @@ cover: /images/2023/12/2023120305291357.jpg
|
||||
summary: 速度与激情7这一阵子很风靡,我却没有赶潮流看零点首映,上周末因为公司机房断电没法加班,便买了张票去看看,也算是我对保罗的致敬。
|
||||
---
|
||||
|
||||
![六月三日](/images/2023/12/2023120306242912.jpg)
|
||||
![ライラックの花かんむり - 成瀬ちさと](/images/2023/12/2023120901275200.jpg)
|
||||
|
||||
速度与激情7这一阵子很风靡,我却没有赶潮流看零点首映,上周末因为公司机房断电没法加班,便买了张票去看看,也算是我对保罗的致敬。
|
||||
<MusicPlayer netease={2007905374} />
|
||||
|
||||
只是不知道为什么看完速7,突然间想写些有的没的。如果你以为我写的是关于速度亦或是激情,那你就错了。今天我们聊聊时下热门的爱情喜剧《咱们结婚吧》。
|
||||
速度与激情 7 这一阵子很风靡,我却没有赶潮流看零点首映。上周末因为公司机房断电没法加班,便买了张票去看看,也算是我对保罗的致敬。
|
||||
|
||||
只是不知道为什么看完速 7,突然间想写些有的没的。如果你以为我写的是关于速度亦或是激情,那你就错了。今天我们聊聊时下热门的爱情喜剧《咱们结婚吧》。
|
||||
|
||||
一座城,四段爱,眼前的一切就是最好的安排。
|
||||
|
||||
@ -25,7 +27,7 @@ summary: 速度与激情7这一阵子很风靡,我却没有赶潮流看零点
|
||||
|
||||
若爱,请珍惜。
|
||||
|
||||
有没有一种女生让你一看就觉得心疼。我不知道陈意涵红起来是不是因为痞子英雄,但我知道每次看到她无辜的大眼睛,我都想替她掉眼泪。虽不是个恨嫁的姑娘,但29岁了想要个婚姻的承诺也是应该的。尤其是在这种男人40还一枝花的社会,对女生来说最重要的就是安全感。
|
||||
有没有一种女生让你一看就觉得心疼。我不知道陈意涵红起来是不是因为痞子英雄,但我知道每次看到她无辜的大眼睛,我都想替她掉眼泪。虽不是个恨嫁的姑娘,但 29 岁了想要个婚姻的承诺也是应该的。尤其是在这种男人 40 还一枝花的社会,对女生来说最重要的就是安全感。
|
||||
|
||||
这种片子一定少不了女强人+贴心男的戏码,以前有时候会认为:女强人是不是要跟男更强人才合适么?但后来渐渐觉得如果两个人是互补,那便再好不过。
|
||||
|
||||
@ -33,7 +35,7 @@ summary: 速度与激情7这一阵子很风靡,我却没有赶潮流看零点
|
||||
|
||||
而片中刘涛顾了前者却忘了后者,还好她是幸运的,因为有人包容。但要是你没那么幸运,那就只能做好自己。
|
||||
|
||||
在一起七年却在结婚当天发现这不是真爱,郭碧婷你特么以为你长得美就可以逗我吗?对于7年的感情输给7天呵呵即可。这段狗血出轨的剧情分分钟拉后腿,如果非要我给取个小标题,那就叫:你们离婚吧。
|
||||
在一起七年却在结婚当天发现这不是真爱,郭碧婷你特么以为你长得美就可以逗我吗?对于 7 年的感情输给 7 天呵呵即可。这段狗血出轨的剧情分分钟拉后腿,如果非要我给取个小标题,那就叫:你们离婚吧。
|
||||
|
||||
算了,荧幕上的爱情,总是具有多元性。而会为了这种无聊事物喜怒哀乐的,估计只有我这种双鱼座。
|
||||
|
||||
@ -41,10 +43,10 @@ summary: 速度与激情7这一阵子很风靡,我却没有赶潮流看零点
|
||||
|
||||
人总是这么矛盾,老想找个平衡点,但在尝试之后发现有点点难。
|
||||
|
||||
不是影评,因为已经懒得去思考。不够深刻,因为没有犀利的视角。只感谢在此时的生活里,没有太多的不愉快。可是我一向不喜欢管人,所以我总在YY能出现一个人。Ta的作为总是与我的厌恶相悖,你说难不难?
|
||||
不是影评,因为已经懒得去思考。不够深刻,因为没有犀利的视角。只感谢在此时的生活里,没有太多的不愉快。可是我一向不喜欢管人,所以我总在 YY 能出现一个人。Ta 的作为总是与我的厌恶相悖,你说难不难?
|
||||
|
||||
> Do not dwell in the past, do not dream of the future, concentrate yourself in the present。
|
||||
> Do not dwell in the past, do not dream of the future, concentrate yourself in the present.
|
||||
|
||||
PS: 速7不错看,歌不错听。
|
||||
PS: 速 7 不错看,歌不错听。
|
||||
|
||||
![眩しくて 嫌いだった](/images/2023/12/2023120306243223.jpg)
|
||||
|
@ -12,13 +12,15 @@ summary: 因为工作的缘故,自己可控的闲暇时间越来越少,每
|
||||
|
||||
![一期一会](/images/2023/12/2023120214271365.jpg)
|
||||
|
||||
因为工作的缘故,自己可控的闲暇时间越来越少,每日的加班,紧张得要死的工期。组长的口号就是:最短的时间,做出更多的事情。自然地,那种大学时的自由阅读时光愈发遥不可及。也就过年时难得有空看看格言,开篇第一句话就是:“时间就像海绵里的水,总是挤,也会没有的。”
|
||||
<MusicPlayer netease={492390949} />
|
||||
|
||||
不由得想起3年前看过的一本书:《放慢·快乐》……
|
||||
因为工作的缘故,自己可控的闲暇时间越来越少。每日的加班,紧张得要死的工期,组长的口号就是:最短的时间,做出更多的事情。自然地,那种大学时的自由阅读时光愈发遥不可及。也就过年时难得有空看看格言,开篇第一句话就是:“时间就像海绵里的水,总是挤,也会没有的。”
|
||||
|
||||
不由得想起 3 年前看过的一本书:《放慢·快乐》。
|
||||
|
||||
我一向对喜欢笑的人很有好感,所以我从来不喜欢动漫里所谓的高贵冷艳型角色。会去看这本书,也只因喜欢封面上朱丹那明媚的笑容。因为我这人有个怪癖,没什么文化却喜欢逛书店,而且一般情况下只要那种封面看得爽的,然后书名取得文艺范儿一些的书我都会不管内容毫不犹豫入手。
|
||||
|
||||
但其实这类书大都没什么实质性的内涵,看了也不长见识,只会不断冲击你的各种人生观、价值观、世界观。还没准还会把原来正的给冲歪了,潜移默化地把我们领到一条没有尽头的不归路……朋友经常吐槽说我写的东西都属于无病呻吟款,估计也就是因为这类书看多了的缘故。23333333
|
||||
但其实这类书大都没什么实质性的内涵,看了也不长见识,只会不断冲击你的各种人生观、价值观、世界观。还没准还会把原来正的给冲歪了,潜移默化地把我们领到一条没有尽头的不归路……朋友经常吐槽说我写的东西都属于无病呻吟款,估计也就是因为这类书看多了的缘故。
|
||||
|
||||
而我们所不知道的是:“太多大家看似光鲜的东西,背后却是无人知晓的付出。”所以对于任何一个敢写自传的人,我都抱着佩服的态度。若没有足够精彩的人生经历,怎敢与众人分享?
|
||||
|
||||
@ -26,7 +28,7 @@ summary: 因为工作的缘故,自己可控的闲暇时间越来越少,每
|
||||
|
||||
书里很多都在写亲情,朱丹说自己是一个恋家的姑娘,所有的努力都是为了家人。对啊!我一直坚信,恋家的孩子都很善良,自己一个人生活惯了,也难怪她内心强大。关于这个问题网上流行这么一个理论:“若内心足够强大,就可以选择你爱的人或事。若内心不够强大,那就选择爱你的。”你说这有理还是无理?
|
||||
|
||||
而仔细想想,很多时候我们需要透过别人的眼睛看世界。我拙劣地认为,欣赏一个人的原因大抵有两种:“一是Ta身上有你的影子,你们有许多相似的地方,所以实际上你只是纯属自恋在自我欣赏。二是你想成为Ta那样的人,但实际上你没办法成为,只不过TA做了很多你想做却没做的事。”
|
||||
而仔细想想,很多时候我们需要透过别人的眼睛看世界。我拙劣地认为,欣赏一个人的原因大抵有两种:“一是 Ta 身上有你的影子,你们有许多相似的地方,所以实际上你只是纯属自恋在自我欣赏。二是你想成为 Ta 那样的人,但实际上你没办法成为,只不过 Ta 做了很多你想做却没做的事。”
|
||||
|
||||
生命中总是有一些人与你不谋而合。
|
||||
|
||||
@ -34,6 +36,6 @@ summary: 因为工作的缘故,自己可控的闲暇时间越来越少,每
|
||||
|
||||
人生不能着急,挤出来的时间,被时间挥霍了。生命蒙上细尘,时间身不由己。慢工养艺,慢餐养胃,慢步养生,慢活养寿。总之,慢下来很养人。
|
||||
|
||||
只是我又在想,在这个什么都飞速的时代,慢生活是不是只能被无限YY?
|
||||
只是我又在想,在这个什么都飞速的时代,慢生活是不是只能被无限 YY?
|
||||
|
||||
![空より大きな悩みなし](/images/2023/12/2023120214292360.jpg)
|
||||
|
@ -11,6 +11,7 @@ category: 杂思
|
||||
cover: /images/2019/05/2019051818392913.jpg
|
||||
summary: “唉,你还真是一个不安分的家伙啊!”电话那头的老妈无可奈何地宠溺道。此时还是八月初,火辣辣的太阳炙烤着大地,北京西小口软件园东边的花坛边开满了月季等鲜花。
|
||||
---
|
||||
|
||||
![东升科技园的鸭子](/images/2019/05/2019050902442970.jpg)
|
||||
|
||||
“唉,你还真是一个不安分的家伙啊!”电话那头的老妈无可奈何地宠溺道。
|
||||
|
@ -10,6 +10,7 @@ category: 杂思
|
||||
cover: /images/2019/05/2019050902332168.jpg
|
||||
summary: 网易云音乐一直是一个值得吐槽的地方,比如,它常常会认为你懂五国语言,动不动给你日推一些稀奇古怪的歌曲。因为我会日语,所以日推的大部分都是日文歌,还可以接受网易云音乐一直是一个值得吐槽的地方,比如,它常常会认为你懂五国语言,动不动给你日推一些稀奇古怪的歌曲。因为我会日语,所以日推的大部分都是日文歌,还可以接受。但最近网易云音乐开始变本加厉,给我日推俄文歌,这实在是不能接受。
|
||||
---
|
||||
|
||||
![黄昏少女](/images/2019/05/2019050902252161.jpg)
|
||||
|
||||
网易云音乐一直是一个值得吐槽的地方,比如,它常常会认为你懂五国语言,动不动给你日推一些稀奇古怪的歌曲。因为我会日语,所以日推的大部分都是日文歌,还可以接受。但最近网易云音乐开始变本加厉,给我日推俄文歌,这实在是不能接受。
|
||||
|
@ -10,6 +10,7 @@ category: 文章
|
||||
cover: /images/2019/05/2019051818094781.jpg
|
||||
summary: 花非花,雾非雾。夜半来,天明去,来如春梦几多时,去似朝云无觅处。最难解的的确是闲愁,才去春花,落红满径,便有月照窗纱,倦理琵琶的愁情。
|
||||
---
|
||||
|
||||
![烟花散](/images/2019/05/2019050901494935.jpg)
|
||||
|
||||
花非花,雾非雾。夜半来,天明去,来如春梦几多时,去似朝云无觅处。
|
||||
|
@ -9,6 +9,7 @@ category: 杂思
|
||||
summary: 现在的我是永远回不到过去了……倘若有机会,我更愿意在这么一个场景中写一封寄给18岁的我的信,告诫那时的我不要荒废青春,好好学习。
|
||||
cover: /images/2022/02/2022022821542418.jpg
|
||||
---
|
||||
|
||||
![静の空 画师JW](/images/2022/02/2022022821353669.jpg)
|
||||
|
||||
现在的我是永远回不到过去了……
|
||||
|
159
src/content/posts/2024/2024-06-30-pre-sale-housing.mdx
Normal file
159
src/content/posts/2024/2024-06-30-pre-sale-housing.mdx
Normal file
@ -0,0 +1,159 @@
|
||||
---
|
||||
title: 金融视角下的期房销售
|
||||
slug: pre-sale-housing
|
||||
date: 2024-06-30 14:42:12
|
||||
updated: 2024-06-30 14:50:12
|
||||
tags:
|
||||
- 金融
|
||||
- 期房
|
||||
category: 杂谈
|
||||
summary: 这篇文章试图从金融视角来期房销售的问题,也希望能回答相关投资理财遇到资损的问题。
|
||||
cover: /images/2024/06/2024063015135000.jpg
|
||||
---
|
||||
|
||||
![金融背景 01](/images/2024/06/2024063015145800.jpg)
|
||||
|
||||
最近所在的微信群的小伙伴为当前的购房问题产生了激烈的讨论,其中核心的问题就两个。
|
||||
|
||||
1. 购买自住期房到底算不算投资?
|
||||
2. 因为房屋预售而导致在交房前的房价下降是否应该获得赔偿?
|
||||
|
||||
这篇文章试图从金融视角来看期房销售的问题,也希望能回答相关投资理财遇到资损的问题。
|
||||
|
||||
## 怎么判定一项开销是否是投资
|
||||
|
||||
投资定义经历过迁移,其最原始的定义就是“购置资产”,而资产这个概念后来发生了扩展。
|
||||
|
||||
原则上来说,资产的定义的核心是:它预期会借助各种方式产生出收益。所以在最原始的定义里,你买了一台机床自然是投资,买了一块地也是投资。但资产因其未来能产出收益为核心,根据金融最底层的原则,未来的收益可以折现到当下。因而资产实际上包括的东西被扩大化了。
|
||||
|
||||
如果你买了一个东西,而这个东西未来可能升值(或贬值)并且其有流动性(可以发生买卖,注意是可以,它可以卖就算,不必你真的是否要卖),那它也是资产。
|
||||
|
||||
实际上资产还经历过多次定义的外扩(包括对价值的认同)。但基本上也能用上述框架解释(要么有产出,要么其定价会波动 + 能卖)。
|
||||
|
||||
储蓄对于上述两条规则都满足,储蓄的利息满足第一条,储蓄也满足第二条。储单是可以交易的,并且储单的现值会随银行风险与利率变化而升值或贬值。购房也都满足,自住可以抵消你的租金开销,租出去可以收入租金。房产可以交易,并且房产的成交价会波动。
|
||||
|
||||
## 投资、资产与风险
|
||||
|
||||
储蓄有利率,利率就是为了补偿平台风险,这里涉及到投资的风险,风险是投资在目标上的属性。
|
||||
|
||||
一个购房者,如果不指望房子作为资产的收益(包括租金、租金机会成本、卖房收益、抵押得到的贷款量等),纯自住,不折腾,不用任何金融工具,那么它“对决策时的时空的决策者而言”没有作为资产的风险。
|
||||
|
||||
它只是普通地产生资产折旧或故障(房屋损坏)然后在定价上贬值,但既然“决策时的时空的决策者”不考虑卖,这个贬值也不会作为风险兑现。如果决策者储蓄,情况则不同,决策者不可避免地面临银行违约的风险。
|
||||
|
||||
在国内,可能大家都安全惯了,早就相信了“银行很安全”的话术。但其实追溯历史,我们会发现银行本身并不可靠。
|
||||
|
||||
实际上很多理财投资渠道都是如此,如果我把钱托付给了这个平台,它会不会跑路?这个叫平台风险。
|
||||
|
||||
## 常见的理财投资渠道
|
||||
|
||||
1. 储蓄
|
||||
|
||||
银行其实是会破产甚至跑路的,如渤海银行。我国对银行管理比较严密,所以这么多年了大家甚至很难意识到这一点。美国人就普遍了解到这一点,因为美国光近 20 年破产的银行就一大把,比如前些年最著名的硅谷银行,**很多美国人已经产生损失了**。
|
||||
|
||||
意林还是读者来着甚至有个鸡汤段子,说美国一个银行破产了,银行的老板不需要偿还储户的存款,但他是个圣人,因而打工十年偿还了储户的存款。
|
||||
|
||||
2. 国债
|
||||
|
||||
政府也是会信用破产的,最典型的就是现在的俄、乌的国债。一旦一方政府在战争中被打垮,持有对应国债的投资人,这项资产瞬间清零变成废纸。
|
||||
|
||||
3. 银行理财
|
||||
|
||||
实际上你能买到的银行理财有两类:公募基金,或企业债券。公募基金国内管理得还很严,虽然也有跑路风险。但企业债的风险就极高了,如海航债券违约,恒大债务违约。企业可能破产,可能故意不还你的债。
|
||||
|
||||
## 期房 = 金融工具
|
||||
|
||||
期房交易属于投资,自然它也有收益属性。作为期货,期房相对现房也是有其收益的。姑且不提期房是否会比现房便宜,因为现房基本上都是二手房,其实很难比较。但原则上肯定是便宜的,这是一个利差。
|
||||
|
||||
在过去的时间里,大家一直默认房产就是会涨。购房者在 A 时间点,提前锁定了一处房产的所有权,是在 A 时间点的房产价格 a 上车的。而到了交付时间点 B,或者房产转售时间点 B',此时的交易价格 b 是上升了的(只要房产价格还在上涨)。所以实际上期房是一种金融工具。
|
||||
|
||||
买期房,就是在占便宜的。只要来到资产角度,用拆分资产定价和金融工具的角度分析,买期房的人,实际上是作为高级投资者参与到了高风险投资之中(期货市场都是高风险市场)。
|
||||
|
||||
买期房在过去之所以被一部分人视为安全的,这是因为房价一直涨,进而炒房客、房产商、房产中介的这种宣传让一部分人相信了。但他们相信了不意味着这个世界就是这么运行的,正如永动机民科相信自己能做出永动机,但他们都失败了。
|
||||
|
||||
## 投资人为什么不应被国家兜底补偿
|
||||
|
||||
国家不兜底投资者的投资失败损失,主要有以下几个原因:
|
||||
|
||||
1. 市场纪律:投资本身就存在风险,如果国家兜底,可能会削弱市场纪律,导致投资者忽视风险评估和管理。
|
||||
|
||||
2. 资源分配效率:市场经济中,资源应该根据效率原则进行分配。如果国家兜底,可能会导致资源流向效率不高的项目或企业。
|
||||
|
||||
3. 道德风险:兜底可能引发道德风险,即投资者或企业可能因为知道有国家兜底而进行过度风险的投资行为。
|
||||
|
||||
4. 财政压力:国家兜底可能会给公共财政带来巨大压力,影响国家在其他重要领域的投资和支出。
|
||||
|
||||
5. 公平性问题:投资失败的损失如果由国家兜底,可能会造成纳税人的不公平负担,特别是对于那些没有参与高风险投资的人。
|
||||
|
||||
6. 市场自我调节:市场具有自我调节的功能,投资失败的损失可以作为市场信号,促使投资者和企业更加谨慎。
|
||||
|
||||
7. 鼓励个人责任:不兜底可以鼓励投资者对自己的投资决策负责,进行充分的研究和风险评估。
|
||||
|
||||
8. 促进市场成熟:经历投资失败并承担后果,可以促进投资者和市场参与者的成熟,提高整个市场的投资水平和风险管理能力。
|
||||
|
||||
9. 避免政策依赖:如果投资者依赖国家兜底,可能会减少对提高自身竞争力和创新能力的动力。
|
||||
|
||||
10. 国际信任和竞争力:一个国家如果频繁兜底,可能会影响其在国际上的信任和竞争力,因为投资者可能会对该国市场的稳定性和可预测性产生怀疑。
|
||||
|
||||
综上所述,国家不兜底投资者的投资失败损失,是为了维护市场的健康运行和效率,同时促进投资者和企业的风险意识和自我发展能力。当然,这并不意味着国家完全不参与风险管理,例如通过制定和执行适当的监管政策来保护投资者权益,确保市场的公平和透明。
|
||||
|
||||
## 补助政策的陷阱
|
||||
|
||||
在实操中非常难定义什么样的投资者更迫切需要补助。这里的迫切,是从福利经济学角度出发的。经济学有很多研究方向和伦理,其中一个分支就是福利经济学:研究如何让整个社会的总福利最大化。
|
||||
|
||||
一般来说,如果政府或机构使用补助政策,他们会发现面临三个难题:
|
||||
|
||||
### 研究方面的难题
|
||||
|
||||
潜在的需要补助者,需求和情况非常多样和复杂,每个人的经济状况、家庭背景、健康状况等都不尽相同。而且存在信息不对称:政府或补助机构可能无法完全掌握补助者的真实情况。这都会导致决策不会完全有效(倒不如说,研究是一定不到位的,决策是一定存在失效的)。
|
||||
|
||||
### 公平性、欺诈、滥用的难题
|
||||
|
||||
有个概念叫激励不相容,广泛存在于经管学科里:我出于目的 A,制订了政策 a,想要补助具有特定特征 α 的群体 X。但就
|
||||
|
||||
会有群体 Y 的人,虽然不符合特征 α,但他们会模拟出类似的特征 α',来偷窃政策 a 想要补助的补助金,最后目的 A 无法实现。只要牵涉到的规模足够大,这种现象必然发生。
|
||||
|
||||
### 实现方面的难题
|
||||
|
||||
在实现过程中,一定伴随着落实的成本。我们或许可以说,前面两个问题,我们可以派出研究员,派出审计员,——这就带来了新的成本,而且可能带来贪腐。同时,政府或机构的现金成本并不是 0,通过税收、转移支付等渠道过来的资金,可能其实是消耗了更多社会资源才得到的,使用它们必然是浪费更多的资源。
|
||||
|
||||
我们构建这样一个政府或机构试图进行补助的政策,就会看到:
|
||||
|
||||
1. 在实操中非常难定义什么样的投资者更迫切需要补助。
|
||||
|
||||
2. 非常难规避不该拿补助的人跑来“偷”补助——跟科技企业走得近的人有没有共鸣?了解到高校部分不良教师水项目、蹭基金的群友有没有相关思考?哪怕只看前述的房地产语境,你也会看到假离婚,假结婚。
|
||||
|
||||
3. 政府补助,一定伴随着更多社会资源的浪费。如果政府拨款 X 元,它实际上是基于 Y 的社会资源的成本和 Z 的机会成本才得以实现。
|
||||
|
||||
### 投资与机会成本
|
||||
|
||||
譬如,某人用 648 元钱充手游氪金,但这 648 元,他本来可以做别的事。因为他充了手游,所以没法做别的事了。譬如他失业了,本来可以 600 元钱买一个就业培训,但现在没有买。
|
||||
|
||||
这部分“未能做某事”,如果做了,其会带来一个预期的收益 A。而他充了手游,也给他带来了收益(比如他原本精神压力很大,现在抽到了流萤,心理压力小了),收益 B。未能兑现的 A 就是机会成本,而 A 有可能比 B 大。
|
||||
|
||||
政府补助也会面临这种情况,我给 A 补助,那 B 自然就没有补助了,实际上就是在牺牲 B 补贴 A。
|
||||
|
||||
现在一部分地区出了政策,要求当地银行优先供血给烂尾楼对应的房产商。而当地银行的资金池是有限的,政策压力也是有限的。这些地方最终落实下来政策,原本在艰难市场环境中扶持的当地小微企业就更容易破产,雇员就更容易失业。
|
||||
|
||||
这甚至没有用到补贴,仅仅是银行政策倾向,就造成了实际上在剥削其他劳动者补贴“**期房投资者和不负责的房企**”这一结果。
|
||||
|
||||
### 激励不相容
|
||||
|
||||
对人民公社时期的一个常见反思,大锅饭,有人不出力。或者对苏联的一个反思,底层工厂钻空子。
|
||||
|
||||
这些都是激励不相容,你最初可能是出于朴素的善意,希望补偿那些“因为买的房子烂尾了导致一家人贫困潦倒”的人。但即使你投入了极大的成本,这部分人得到的补助一定不高。
|
||||
|
||||
但带来的损失,都投入极大成本了,这些损失会小吗?
|
||||
|
||||
还有一个离现在时间点很近的一个荒谬的相关补助。
|
||||
|
||||
大概 2017 年前后,上海内部试图通过一个政策,政府出资给风投兜底。也是出于朴素的善良愿望,希望上海的科技企业支棱起来。
|
||||
|
||||
这个提案立刻被摁死,社会资源根本容不得你们如此挥霍!最后只会是一群人设法“偷窃”了你想给的补助,你的目的根本达不到。
|
||||
|
||||
出这种提案的,被阻止了,那就是个傻逼而已。但如果没被阻止,就是罪人!
|
||||
|
||||
至于“因为买的房子烂尾了导致一家人贫困潦倒”是否存在?目前买房都不接受 0 首付,贷款都有还款能力资质审核。这些有首付能力的人,风险承担能力一定不是最弱的。
|
||||
|
||||
绝对有更多的人远比他们需要帮助。
|
||||
|
||||
![金融背景 02](/images/2024/06/2024063015140300.jpg)
|
@ -560,3 +560,7 @@
|
||||
slug: interview
|
||||
- name: 读书
|
||||
slug: reading
|
||||
- name: 金融
|
||||
slug: financial
|
||||
- name: 期房
|
||||
slug: off-plan
|
||||
|
@ -2,7 +2,7 @@ import { db } from '@/helpers/db/pool';
|
||||
import { atk_comments, atk_likes, atk_pages, atk_users } from '@/helpers/db/schema';
|
||||
import { makeToken, urlJoin } from '@/helpers/tools';
|
||||
import options from '@/options';
|
||||
import { and, desc, eq, isNull, notInArray, sql } from 'drizzle-orm';
|
||||
import { and, desc, eq, isNull, not, sql } from 'drizzle-orm';
|
||||
|
||||
export interface Comment {
|
||||
title: string;
|
||||
@ -53,9 +53,9 @@ export const latestComments = async (): Promise<Comment[]> => {
|
||||
authorLink: atk_users.link,
|
||||
})
|
||||
.from(atk_comments)
|
||||
.leftJoin(atk_pages, eq(atk_comments.page_key, atk_pages.key))
|
||||
.leftJoin(atk_users, eq(atk_comments.user_id, atk_users.id))
|
||||
.where(and(notInArray(atk_comments.user_id, options.settings.comments.admins), eq(atk_comments.is_pending, false)))
|
||||
.innerJoin(atk_pages, eq(atk_comments.page_key, atk_pages.key))
|
||||
.innerJoin(atk_users, eq(atk_comments.user_id, atk_users.id))
|
||||
.where(and(not(eq(atk_users.email, options.author.email)), eq(atk_comments.is_pending, false)))
|
||||
.orderBy(desc(atk_comments.created_at))
|
||||
.limit(options.settings.sidebar.comment);
|
||||
|
||||
@ -76,15 +76,6 @@ export const latestComments = async (): Promise<Comment[]> => {
|
||||
});
|
||||
};
|
||||
|
||||
export const increaseViews = async (pageKey: string) => {
|
||||
await db
|
||||
.update(atk_pages)
|
||||
.set({
|
||||
pv: sql`${atk_pages.pv} + 1`,
|
||||
})
|
||||
.where(eq(atk_pages.key, sql`${pageKey}`));
|
||||
};
|
||||
|
||||
const generatePageKey = (permalink: string): string => urlJoin(options.website, permalink, '/');
|
||||
|
||||
export const increaseLikes = async (permalink: string): Promise<{ likes: number; token: string }> => {
|
||||
|
@ -27,7 +27,10 @@ const avatarImage = async (
|
||||
}
|
||||
|
||||
return new Response(Buffer.from(await resp.arrayBuffer()), {
|
||||
headers: { 'Content-Type': 'image/png' },
|
||||
headers: {
|
||||
'Content-Type': 'image/png',
|
||||
'Cache-control': 'max-age=604800',
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -12,5 +12,5 @@ require (
|
||||
require (
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
golang.org/x/image v0.17.0 // indirect
|
||||
golang.org/x/image v0.18.0 // indirect
|
||||
)
|
||||
|
@ -21,6 +21,8 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.17.0 h1:nTRVVdajgB8zCMZVsViyzhnMKPwYeroEERRC64JuLco=
|
||||
golang.org/x/image v0.17.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
|
||||
golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ=
|
||||
golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
Loading…
Reference in New Issue
Block a user