What is Hackers' Pub?

Hackers' Pub is a place for software engineers to share their knowledge and experience with each other. It's also an ActivityPub-enabled social network, so you can follow your favorite hackers in the fediverse and get their latest posts in your feed.

BotKit 0.2.0 Released

We're pleased to announce the release of BotKit 0.2.0! For those new to our project, is a framework for creating standalone bots that can interact with Mastodon, Misskey, and other platforms without the constraints of these existing platforms.

This release marks an important step in our journey to make fediverse bot development more accessible and powerful, introducing several features that our community has been requesting.

The Journey to Better Bot Interactions

In building BotKit, we've always focused on making bots more expressive and interactive. With version 0.2.0, we're taking this to the next level by bringing the social aspects of the fediverse to your bots.

Expressing Your Bot's Personality with Custom Emojis

One of the most requested features has been support. Now your bots can truly express their personality with unique visuals that make their messages stand out.

// Define custom emojis for your bot
const emojis = bot.addCustomEmojis({
  botkit: { 
    file: `${import.meta.dirname}/images/botkit.png`, 
    type: "image/png" 
  },
  fedify: { 
    url: "https://fedify.dev/logo.png", 
    type: "image/png" 
  }
});

// Use these custom emojis in your messages
await session.publish(
  text`BotKit ${customEmoji(emojis.botkit)} is powered by Fedify ${customEmoji(emojis.fedify)}`
);

With this new API, you can:

Engaging Through Reactions

Communication isn't just about posting messagesโ€”it's also about responding to others. The new reaction system creates natural interaction points between your bot and its followers:

// React to a message with a standard Unicode emoji
await message.react(emoji`๐Ÿ‘`);

// Or use one of your custom emojis as a reaction
await message.react(emojis.botkit);

// Create a responsive bot that acknowledges reactions
bot.onReact = async (session, reaction) => {
  await session.publish(
    text`Thanks for reacting with ${reaction.emoji} to my message, ${reaction.actor}!`,
    { visibility: "direct" }
  );
};

This feature allows your bot to:

Conversations Through Quotes

Discussions often involve referencing what others have said. Our new support enables more cohesive conversation threads:

// Quote another message in your bot's post
await session.publish(
  text`Responding to this interesting point...`,
  { quoteTarget: originalMessage }
);

// Handle when users quote your bot's messages
bot.onQuote = async (session, quoteMessage) => {
  await session.publish(
    text`Thanks for sharing my thoughts, ${quoteMessage.actor}!`,
    { visibility: "direct" }
  );
};

With quote support, your bot can:

Visual Enhancements

Because communication is visual too, we've improved how your bot presents itself:

  • Image attachments now properly display in the web interface
  • Your bot's content looks better and provides a richer experience

Behind the Scenes: Enhanced Activity Propagation

We've also improved how activities propagate through the fediverse:

  • More precise propagation of replies, shares, updates, and deletes
  • Activities are now properly sent to the original message authors

These improvements ensure your bot's interactions are consistent and reliable across different fediverse platforms.

Taking Your First Steps with BotKit 0.2.0

Ready to experience these new features? BotKit 0.2.0 is available on JSR and can be installed with a simple command:

deno add jsr:@fedify/botkit@0.2.0

Since BotKit uses the Temporal API (which is still evolving in JavaScript), remember to enable it in your deno.json:

{
  "imports": {
    "@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
  },
  "unstable": ["temporal"]
}

With these simple steps, you're ready to create or upgrade your fediverse bot with our latest features.

Looking Forward

BotKit 0.2.0 represents our ongoing commitment to making fediverse bot development accessible, powerful, and enjoyable. We believe these new features will help your bots become more engaging and interactive members of the fediverse community.

For complete docs and more examples, visit our docs site.

Thank you to everyone who contributed to this release through feedback, feature requests, and code contributions. The BotKit community continues to grow, and we're excited to see what you'll create!


BotKit is powered by Fedify, a lower-level framework for creating ActivityPub server applications.

1
1
0
0

Hey folks! We're excited to share a preview of a new API coming in 1.6 that should make structuring larger federated apps much cleaner: FederationBuilder.

As your Fedify applications grow, you might encounter circular dependency issues when registering dispatchers and listeners across multiple files. The new FederationBuilder pattern helps solve this by separating the configuration phase from instantiation.

Instead of this:

// federation.ts
import { createFederation } from "@fedify/fedify";

export const federation = createFederation<AppContext>({
  kv: new DbKvStore(), 
  queue: new RedisMessageQueue(),
  // Other options...
});

// Now we need to import this federation instance in other files
// to register dispatchers and listeners...

You can now do this:

// builder.ts
import { createFederationBuilder } from "@fedify/fedify";

export const builder = createFederationBuilder<AppContext>();

// other files can import and configure this builder...
// actors.ts
import { builder } from "./builder.ts";
import { Person } from "@fedify/fedify";

builder.setActorDispatcher("/users/{handle}", async (ctx, handle) => {
  // Actor implementation
});
// inbox.ts
import { builder } from "./builder.ts";
import { Follow } from "@fedify/fedify";

builder.setInboxListeners("/users/{handle}/inbox", "/inbox")
  .on(Follow, async (ctx, follow) => {
    // Follow handling
  });
// main.ts โ€” Only create the Federation instance at startup
import { builder } from "./builder.ts";

// Build the Federation object with actual dependencies
export const federation = await builder.build({
  kv: new DbKvStore(),
  queue: new RedisMessageQueue(),
  // Other options...
});

This pattern helps avoid circular dependencies and makes your code more modular. Each part of your app can configure the builder without needing the actual Federation instance.

The full documentation will be available when 1.6 is released, but we wanted to share this early with our community. Looking forward to your feedback when it lands!

Want to try it right now? You can install the development version from JSR or npm:

# Deno
deno add jsr:@fedify/fedify@1.6.0-dev.777+1206cb01

# Node.js
npm add @fedify/fedify@1.6.0-dev.777

# Bun
bun add @fedify/fedify@1.6.0-dev.777

0
0
0

Unbound 1.23.0 is now available. Our resolver now features โ€˜fast reloadโ€™, allowing it to read the new config in a thread, and when done only briefly pauses the server to update the settings. This version also contains redis replica support, DNS Error Reporting, and several bug fixes. nlnetlabs.nl/news/2025/Apr/24/

0

I've currently been doing a tonne of work on Doorkeeper, a Mastodon dependency for OAuth, and currently that work is mostly uncompensated.

I'm also doing a reasonable amount of work on the standards side (W3C & IETF), which is also uncompensated.

I'm not making ends meet at the moment, so if you can spare โ‚ฌ5-10 a month, please do consider supporting my work on Mastodon, Doorkeeper, standards, and the wider Fediverse.

I'm currently running a deficit of about โ‚ฌ1000-1600 per month, which is completely unsustainable.

(there's also one-time, but ongoing support is what enables me to do this important work)

support.thisismissem.social

0
0
0

Now that #GoToSocial v0.19.0 is out, we're going to start the process of transferring our coding workflow from Github over to #Codeberg (@CodebergCodeberg.org), to get away from Microsoft's endless parade of crapola.

This means that some time in the next week or so, we will "lock" the Github repository so that only superseriousbusiness.org members can create new PRs and issues etc (similar to what we do when we're on holiday).

Then, we will migrate the repository over to Codeberg, using Codeberg's migration functionality to keep issues, pull requests, comments, etc intact.

Once we've validated that everything is in order, we will mark the Github repository as a read-only mirror of the Codeberg repo, and start using Codeberg for issues, pull requests, CI/CD etc.

To avoid breaking people's automated builds that rely on that Github repo, we are planning to keep it as a read-only mirror for a while (eg., 6 months or so, not sure yet) . At some point though we will fully remove it, to avoid contributing our code to Microsoft's "ai" garbage. But we will warn in advance about this so that people can update their scripts and stuff in time.

There will probably be some turbulence in our CI/CD pipelines and workflow and whatnot during this transition period, but nothing that should affect end users of the software: releases up to v0.19.0 will remain available on Github and Docker as normal, and snapshots should remain up to date on our Minio S3 bucket and Docker.

We're looking forward to the move, and to putting the sloth in its new home and seeing it wander around sniffing the furniture and exploring :gtspat: Thanks for reading!

0
0
1
1
0
1
1

์ €...์ด๊ฑฐ ํŒ”์•„์š” ....4/15์ผ์— ๋ฐ›์•˜์–ด์š”....
ํŒŒ๋Š”์ด์œ , ....5๋…„์ „์— ์“ฐ๋˜ ํ”„๋กœ๋ชจ๋ธ, ....์žฅ๋กฑ์—์„œ ์ฐพ์•˜์–ด์š”........
์ฒ˜์Œ์— ์„œ๋น„์Šคํ•˜๋Š” ์ด์šฉ๊ถŒ ์‚ฌ์šฉํ•ด์„œ ... ํ™• ๊นŽ์„๊ฒŒ์š”....
์šดํฌ 11๋งŒ์— ํŒ”์•„์š”.........์ธ์ฆ์€ ์‚ฌ์‹ค๋ถ„์—๊ฒŒ....์ง์ ‘๋“œ๋ฆฝ๋‹ˆ๋‹ค.... ๋ฏผํŠธ์ƒ‰์ด์˜ˆ์š” .....

0
0
0
0

์˜ˆ์ „์— ์ด๋ช…๋ฐ•๋•Œ์ฏค์ธ๊ฐ€ MOU๋ผ๋Š” ๋ง์ด ์ผ์ƒ์— ๋“ค์–ด์˜ค๊ธฐ ์‹œ์ž‘ํ•˜๋”๋‹ˆ MOU๊ฐ€ ํ•œ ๋•Œ ์œ ํ–‰์ฒ˜๋Ÿผ... ๋ฒˆ์ง€๋˜... ๋ญ”๊ฐ€ ๋Œ€๋‹จํ•œ ๊ฒƒ์ฒ˜๋Ÿผ

๋ธ”๋Ÿญ์ฒด์ธ์ด๋ž€ ์šฉ์–ด๋„ ์—ฌ๊ธฐ์ €๊ธฐ ํผ์ง€๋”๋‹ˆ, ์ด์   AI๋„ ์ผ๋‹จ ์—ฌ๊ธฐ์ €๊ธฐ ๊ฐ€์ ธ๋‹ค ๋ถ™์ด๋Š”... ์ž์ฒด๊ฐ€ ๋‚˜์˜๋‹ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ฑ ์•„๋ฌด๋ฐ๋‹ค ๋ง‰ ๊ฐ€์ ธ๋‹ค ๋ถ™์—ฌ์„œ ์“ฐ๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€ ์‹ถ์€ ์˜์‹ฌ์ด ๋“ค ๋•Œ๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฑฐ;;;;

์ด๊ฒŒ ๋งˆ์น˜ ๋…ธ์•” ์ด˜์Šคํ‚ค, Noam Chomsky,์˜ Univeral Grammar๋‚˜ Chunk, Generative Grammar๋“ฑ์˜ ์ด๋ก /๊ฐœ๋… ์ฒด๊ณ„๋ฅผ ์ค‘ํ•™๊ต ์ดˆ๋“ฑํ•™๊ต ๊ฐ€๋ฅด์น˜๋Š” ์–ดํ•™์›๋“ค์—์„œ ์–ด๋–ป๊ฒŒ ๊ธฐ์กด ํ•™์›๋“ค๊ณผ ์ฐจ๋ณ„ ์ ์šฉํ•ด์„œ ๊ฐ€๋ฅด์น˜๋Š” ๊ฑด์ง€... ์•ž๋’ค ์„ค๋ช…์€ ์—†๊ณ  ๋‹ค์งœ๊ณ ์งœ ์ฒญํฌ..., ํ•˜๋„ ์ฒญํฌ ์ฒญํฌํ•ด์„œ ํ•™์› ๋ธ”๋กœ๊ทผ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์ด๋ฏธ ์˜์–ด๋ฅผ ์ข€ ํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ฉด ์–ด๋А์ •๋„ ์˜๋ฏธ๋‹จ์œ„๋กœ ์ฒดํ—˜์ ์œผ๋กœ ๊ฐ€๋ฅด์น˜๊ณ  ๋ฐฐ์šฐ๊ณ  ํ–ˆ๋˜๊ฑฐ์— ๊ทธ๋ƒฅ ๋ง๋งŒ ์ฒญํฌ๋ผ๊ณ  ๋ถ™์ธ ๊ฑฐ...

๊ตณ์ด?

๋˜, ์ข€ ์žˆ์œผ๋‹ˆ corpus๋ž€ ๋ง์ด ์œ ํ–‰์„ ํ•˜๋”๋‹ˆ, ์‹ฌ๋ฆฌ์–ธ์–ดํ•™, ์–ธ์–ด์‹ฌ๋ฆฌํ•™์ด ๋‚˜์™”๋‹ค๊ฐ€ ์ด์   ๋ง‰ ์ธ์ง€์–ธ์–ดํ•™์ด ์–ด์ฉŒ๊ณ  ๊ทธ๋Ÿฌ๋˜๋ฐ... ๋ง‰์ƒ ํ•™์›์žฅ์ด๋‚˜ ๊ต์‚ฌ์˜ ์ „๊ณต์„ ๋ณด๊ฑฐ๋‚˜ํ•˜๋ฉด... ๊ทธ๋ฆฌ๊ณ  ์ธ์ง€์–ธ์–ดํ•™์€ ๋Œ€ํ•™์› ์„/๋ฐ•์‚ฌ๊ณผ์ •์—์„œ ๊ทธ์ชฝ์œผ๋กœ ์ „๊ณต์„ ์ •ํ•˜๊ณ  ๊ณต๋ถ€๋ฅผ ์ข€ ์ œ๋Œ€๋กœ ํ•ด์•ผ ๋ง›์ด๋‚˜ ๋ณผ... ์—ฌํŠผ... ์œ ํ–‰ํ•˜๋Š” ์šฉ์–ด๋งŒ ์‹น ๊ฐ€์ ธ ์™€๊ฐ€์ง€๊ณ  ์ผ์ข…์˜ ์ƒ์ˆ ๋กœ๋งŒ ์จ๋จน๊ณ  ์•Œ๋งน์ด๋Š” ํ•˜๋‚˜๋„ ์—†๋Š”...

์‹ฌ์ง€์–ด ๋‰ด๋กœ๋ง๊ท€์Šคํ‹ฑ์Šค neurolinguistics๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ๊ณณ๋„ ๋ดค์Œ. ์˜์–ดํ•™์›์ด ๋ง์€ ์ฒจ๋‹จ์ด์—ฌ ์ฒจ๋‹จ.

๋„ˆ๋ฌด ์—ฌ๋Ÿฌ๋ถ„์•ผ์—์„œ ๋ด์„œ;;;;

์˜ค๋Š˜์˜ ํ—›์†Œ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์›Œ์›Œ~

;-)

0

์ˆ˜ํ™•ํ•œ ์ „ํ˜ธ๋Š” ๊นจ๋—์ด ์”ป์–ด ๊ทธ๋Œ€๋กœ ์Œˆ์œผ๋กœ ๋“œ์…”๋„, ๋ฐฅ๊ณผ ํ•จ๊ป˜ ๋จน์–ด๋„ ์ฐธ ์ž˜ ์–ด์šธ๋ ค์š”. ์ƒ๋Ÿฌ๋“œ๋กœ๋Š” ์ฐธ๊ธฐ๋ฆ„๊ณผ ํ—ˆ๋ธŒ์†”ํŠธ๋ฅผ ๋ฟŒ๋ฆฌ๋ฉด ํ’๋ฏธ๋ฅผ ๋” ์‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ํ˜น์€ ๊ฐ€๋ณ๊ฒŒ ๋ฐ์ณ์„œ ์ดˆ๊ณ ์ถ”์žฅ์— ๋ฌด์ณ๋„ ์ข‹๋‹ต๋‹ˆ๋‹ค! โ€‹ ์ „ํ˜ธ์™€ ํ•จ๊ป˜ ๋ง›์žˆ๊ณ  ๊ฑด๊ฐ•ํ•œ ๋ด„ ๋ณด๋‚ด์„ธ์š”๐ŸŒฟ

0

๋ฏธ๋‚˜๋ฆฌ๊ณผ์˜ ๋…ํŠนํ•œ ํ–ฅ๊ณผ ํ’๋ฏธ๋ฅผ ๊ฐ€์ง„ ์‚ฐ์ฑ„์ด์ง€๋งŒ ๊ทธ ํ–ฅ์ด ๊ฐ•ํ•˜์ง€ ์•Š์•„ ์–ด๋ฆฐ์ด๋“ค๋„ ๋ถ€๋‹ด ์—†์ด ์ฆ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค๐ŸŒฟ ๋ฐ˜๋Œ€๋กœ ์‚ฐ์ฑ„ ํŠน์œ ์˜ ๊ฐ•ํ•œ ํ–ฅ์„ ์„ ํ˜ธํ•˜๋Š” ๋ถ„๋“ค์ด๋ผ๋ฉด ์ข‹์•„ํ•˜์ง€ ์•Š์œผ์‹ค ์ˆ˜๋„ ์žˆ๊ฒ ๋„ค์š”๐Ÿฅน

0

์ „ํ˜ธ๋Š” ์ด๋ฅธ ๋ด„์— ์‹น์„ ํ‹”์›Œ ๋ถ€์ง€๋Ÿฐํžˆ ์žŽ์„ ์ƒ์‚ฐํ•˜๋‹ค 5~6์›” ๊ฝƒ์„ ํ”ผ์šฐ๊ณ  ํ•œ์—ฌ๋ฆ„ ์ข…์ž๋ฅผ ์ˆ™์„ฑ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹œ๋“  ํ›„์— ๊ฐ€์„์ด ์˜ค๋ฉด ๋‹ค์‹œ ์‹น์ด ์˜ฌ๋ผ์™€ ์žŽ์„ ์ƒ์‚ฐํ•˜๋Š”๋ฐ์š”. ๋ด„ ํ•œ์ฒ ์—๋งŒ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฐ์ฑ„๋“ค๊ณผ ๋‹ฌ๋ฆฌ ๋ด„๊ณผ ๊ฐ€์„์— ๋‘ ๋ฒˆ ๋ง›๋ณผ ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ์‚ฐ์ฑ„์ž…๋‹ˆ๋‹ค๐Ÿฝ๏ธ

0

์ฐธ๊ณ ๋กœ ์ „ํ˜ธ์˜ ์žŽ ์ถ”์ถœ๋ฌผ์€ ๊ด€์ ˆ ๊ฑด๊ฐ•์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฑด๊ฐ•๊ธฐ๋Šฅ์‹ํ’ˆ์›๋ฃŒ๋กœ ์ธ์ •๋ฐ›๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตญ๋ฆฝ์‚ฐ๋ฆผ๊ณผํ•™์›์˜ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ „ํ˜ธ์˜ ์žŽ, ์ค„๊ธฐ, ๊ฝƒ๋Œ€, ๋ฟŒ๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ€์œ„์—์„œ ํ•ญ์—ผ, ํ•ญ์•” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์•Œ๋ ค์ง„ 6๊ฐ€์ง€ ์ง€ํ‘œ์„ฑ๋ถ„์ด ํ™•์ธ๋˜์—ˆ๋‹ต๋‹ˆ๋‹ค๐ŸŒฟ

0

์ „ํ˜ธ๋Š” ๋‚จ๋ถ€ ์ง€์—ญ ์„ฌ๊ณผ ๋‚ด๋ฅ™ ๊นŠ์€ ์‚ฐ, ๊ฐ•๊ธฐ์Šญ, ๋“คํŒ ๋“ฑ ์Šตํ•œ ๊ณณ์—์„œ ๋ฌด๋ฆฌ ์ง€์–ด ์ž๋ผ๋Š” ๋ฏธ๋‚˜๋ฆฌ๊ณผ์˜ ์—ฌ๋Ÿฌํ•ด์‚ด์ดํ’€์ž…๋‹ˆ๋‹ค. โ€‹๋ฟŒ๋ฆฌ๋Š” โ€˜์•„์‚ผ(่›พๅƒ)โ€™์ด๋ผ๋Š” ํ•œ์•ฝ์žฌ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋Š”๋ฐ ์†Œํ™”๋ถˆ๋Ÿ‰, ์‹์š•๋ถ€์ง„ ๋“ฑ์˜ ์ฒ˜๋ฐฉ์— ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‹๋ฌผ ์ด๋ฆ„ โ€˜์ „ํ˜ธโ€™์™€ ํ•œ์•ฝ์žฌ ์ด๋ฆ„ โ€˜์ „ํ˜ธ(ๅ‰่ƒก)โ€™๋Š” ์ „ํ˜€ ๋‹ค๋ฅด๋‹ต๋‹ˆ๋‹ค!

0

์•„์ง์€ ๋„๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ์ง€ ์•Š์•„ ์ƒ์†Œํ•œ ์‚ฐ์ฑ„์ธ '์ „ํ˜ธ'๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์†Œ๊ฐœํ•˜๋Š” ์ด์œ ๋Š” ํฌ๊ทผํ•œ ๋ด„์— ์‹น์ด ์˜ฌ๋ผ์˜ค๋Š” ๋‹ค๋ฅธ ์นœ๊ตฌ๋“ค๊ณผ ๋‹ฌ๋ฆฌ ์ถ”์šด 2์›”๋ถ€ํ„ฐ ์ž๋ผ๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฝค๋‚˜ ๋ถ€์ง€๋Ÿฐํ•œ ์‚ฐ์ฑ„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค๐ŸŒฟ ๋•๋ถ„์— ์•ผ์ƒ์˜ ๊ณ ๋ผ๋‹ˆ ์นœ๊ตฌ๋“ค์—๊ฒŒ ์ข‹์€ ๋จน์ด๊ฐ€ ๋˜๊ณ  ์žˆ์ฃ ~

0

#์ˆฒ์˜_์นœ๊ตฌ๋“ค ๐ŸŒฟ๐Ÿด ๋”ฐ๋“ฏํ•œ ๋ด„ ํ–‡์‚ด์— ๊ฐ€์žฅ ๋จผ์ € ํ‘ธ๋ฅธ ์‹น์„ ํ‹”์›Œ ์šฐ๋ฆฌ ์‹ํƒ์„ ๋” ๊ฑด๊ฐ•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๋Š”, ์ผ ๋…„์— ํ•œ ๋ฒˆ ๋ด„ ํ•œ์ฒ ์—๋งŒ ์ฆ๊ธธ ์ˆ˜ ์žˆ์–ด ๋” ๊ฐ€์น˜ ์žˆ๋Š”, ์ €์†๋…ธํ™”๋ฅผ ์œ„ํ•œ ๋ชธ์— ์ข‹๊ณ  ๋ง›๋„ ์ข‹์€ ์‹์žฌ๋ฃŒ~ ์˜ค๋Š˜์˜ ์‚ฐ์ฑ„๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค! ํ–ฅ๊ธ‹ํ•œ ๋ด„๋‚˜๋ฌผ '์ „ํ˜ธ' ์–ด๋– ์„ธ์š”?๐Ÿ˜Š

0
0

SIM ๊ตํ™˜์„ ๊ณ ๋ฏผํ•˜์‹œ๋Š” ๋ถ„๋“ค๊ป˜...
์ž๊ธฐ๊ฐ€ ์‚ฌ๊ณ  ์ณ ๋†“๊ณ  ์ฑ…์ž„์„ ๊ณ ๊ฐ์—๊ฒŒ ์ „๊ฐ€ํ•˜๋Š” SKT์—๊ฒŒ ํ’€ํ”„๋ผ์ด์Šค(6-8์ฒœ์›๋Œ€)๋กœ ์œ ์‹ฌ์„ ์‚ฌ ์ค€๋‹ค๋Š” ์„ ํƒ์ง€ ์™ธ์—๋„, ์ฟ ํŒก์—์„œ 1-3์ฒœ์›์— ์•Œ๋œฐํฐ ์œ ์‹ฌ์„ ์‚ฌ์„œ ๋ฒˆํ˜ธ์ด๋™์„ ํ•œ๋‹ค๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค...

0

I've currently been doing a tonne of work on Doorkeeper, a Mastodon dependency for OAuth, and currently that work is mostly uncompensated.

I'm also doing a reasonable amount of work on the standards side (W3C & IETF), which is also uncompensated.

I'm not making ends meet at the moment, so if you can spare โ‚ฌ5-10 a month, please do consider supporting my work on Mastodon, Doorkeeper, standards, and the wider Fediverse.

I'm currently running a deficit of about โ‚ฌ1000-1600 per month, which is completely unsustainable.

(there's also one-time, but ongoing support is what enables me to do this important work)

support.thisismissem.social

0
0
0
3
0

๊ฑฐ๊พธ๋กœ ์ƒํƒœ ๋ชจ๋‚˜๋“œ๋กœ ๊ฐ•ํ™” ํ•™์Šต ํ•˜๊ธฐ (1/2) 2ํŽธ์„ ๋งˆ์ € ์จ์•ผํ•˜๋Š”๋ฐ, ๋จผ์ € ํ•˜์Šค์ผˆ ์„ธ๋ฏธ๋‚˜ ์‹œ๊ฐ„์— ์ „์ฒด ๋‚ด์šฉ์œผ๋กœ ๋™๋ฃŒ๋“คํ•œํ…Œ ๋ฐœํ‘œ๋ฅผ ํ–ˆ๋‹ค. ๊ทผ๋ฐ ๋ฐœํ‘œํ•˜๋ฉด์„œ ๊ธ€์— ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ ์ด๋ผ๊ณ  ์จ๋†“์€๊ฒŒ ๋˜๊ฒŒ ์–ผ๋ ๋šฑ๋•…์ด๋ž€๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค. ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์ง ์ง€๊ฐ€ ์‹œ๊ฐ„์ด ์ข€ ๋˜์–ด์„œ ์ •ํ™•ํžˆ ๋ญ๊ฐ€ ๋ฌธ์ œ์˜€๋Š”์ง€ ์ข€ ๊นŒ๋จน์–ด์„œ ์‹ค์ œ๋กœ ์“ฐ๊ธฐ๊ฐ€ ํž˜๋“ค์–ด์„œ ์ค‘๊ฐ„์— ์ข€ ๋†จ์—ˆ๋‹คใ…‹ใ…‹ ์•”ํŠผ ๋ฐœํ‘œ๋ฅผ ํ•ด๋ณด๋Š”๊ฒŒ ๋‚ด์šฉ ์ ๊ฒ€์— ๋„์›€์ด ๋งŽ์ด ๋œ๋‹จ๊ฑธ ์•Œ์•˜๋‹ค.

๊ฑฐ๊พธ๋กœ ์ƒํƒœ ๋ชจ๋‚˜๋“œ๋กœ ๊ฐ•ํ™” ํ•™์Šต ํ•˜๊ธฐ (1/2)

๊ธฐ๊ณ„ ํ•™์Šต์„ ์ „ํ˜€ ๋ชจ๋ฅด๊ณ  ์‚ด๋ฉด ์•ˆ ๋˜๊ฒ ๋‹ค ์‹ถ์–ด, ์–ผ๋งˆ์ „๋ถ€ํ„ฐ ํ•˜์Šค์ผˆ๋กœ ๊ณต๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. Hasktorch๋ผ๊ณ  ํ•˜์Šค์ผˆ์šฉ Torch ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด์ „์— ๋„์ „ํ–ˆ์„๋• MNIST๊นŒ์ง€ ํ•˜๊ณ  ๋‹ค์Œ์— ๋ญ˜ ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๊ทธ๋งŒ๋’€๋Š”๋ฐ, ์ด๋ฒˆ์—” ๊ฐ•ํ™” ํ•™์Šต์œผ๋กœ ์ด์–ด๋‚˜๊ฐ€ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ฐ•ํ™” ํ•™์Šต์€ ์ฃผ์–ด์ง„ ํ™˜๊ฒฝ์—์„œ ๋ณด์ƒ์„ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ, ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”์—†๋‹ค๋Š”๊ฒŒ ์žฅ์ ์ด๋‹ค. ๋Œ€์‹  ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„๋„ ํ™˜๊ฒฝ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ๋Š” ๋ฐ์ดํ„ฐ ๋ชจ์œผ๊ธฐ์™€ ๋‹ฌ๋ฆฌ ์ฆ๊ฑฐ์šด ์ผ์ด๋‹ˆ ๋งˆ๋‹คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ฒซ๋ฒˆ์งธ๋กœ ๋„์ „์œผ๋กœ ์Šค๋„ค์ดํฌ ๊ฒŒ์ž„์„ ๊ณจ๋ž๋Š”๋ฐ, ๋‹ค๋“ค ํ•œ๋ฒˆ์ฏค์€ ํ•ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๋ฑ€์„ ์กฐ์ข…ํ•ด ๋จน์ด๋ฅผ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋จน์œผ๋ฉด ๋˜๋Š”๋ฐ, ๋ฑ€์˜ ๋จธ๋ฆฌ๊ฐ€ ๋ฒฝ์ด๋‚˜ ์•„๋‹ˆ๋ฉด ์ž๊ธฐ ๋ชธํ†ต์— ๋ถ€๋”ชํžˆ๋ฉด ์ฃฝ๋Š”๋‹ค. ์—ฌ์ฐจ์—ฌ์ฐจ ํ•™์Šต์‹œ์ผœ์„œ ์ด์ •๋„๊นŒ์ง€ ํ•˜๋Š”๋ฐ์—๋Š” ์„ฑ๊ณตํ–ˆ๋‹ค. ๊ฐ•ํ™” ํ•™์Šต ์ง€์‹์ด ์ผ์ฒœํ•ด์„œ ๊ฒŒ์ž„์„ ํด๋ฆฌ์–ดํ•˜๋Š” ์ˆ˜์ค€๊นŒ์ง€๋Š” ๋ชป ๋งŒ๋“ค๊ฒ ๋‹ค. ์ด ๊ธ€์€ ํ•™์Šต์„ ์ž˜ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ, ๊ฐ•ํ™”ํ•™์Šต ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž˜ ์งœ๋А๋ƒ์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค.<์ผ๋‹จ ๊ฐ•ํ™” ํ•™์Šต์ด๋ž€๊ฑธ ํ˜•์‹ํ™” ํ•ด๋ณด์ž. ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๋ž€ ๋‹จ์–ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ• ์ˆ˜ ์žˆ์„๊นŒ? ๋จผ์ € ์—์ด์ „ํŠธ์˜ ์ •์˜๋Š” ์ด๋ ‡๋‹ค.type Agent = Observation -> Action<๊ด€์ธก Observation ์— ๋”ฐ๋ผ ํ–‰๋™ Action ์„ ์„ ํƒํ•œ๋‹ค. ๋‚˜๋Š” ๋ˆˆ์•ž์— ์ฝœ๋ผ๊ฐ€ ๋ณด์ด๋ฉด ๋งˆ์‹ ๋‹ค. ํ™˜๊ฒฝ์€ ์—์ด์ „ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€์ด๋‹ค. ์ผ์ƒ์ ์ธ ํ‘œํ˜„์œผ๋กœ ์“ฐ์ž๋ฉด, ์—์ด์ „ํŠธ๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ๋ฌด์–ธ๊ฐ€์ด๋‹ค.runAgent :: Agent -> [Action]<์ด runAgent ํ•จ์ˆ˜๊ฐ€ ํ™˜๊ฒฝ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. Agent๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์ฃฝ์„ ๋•Œ๊นŒ์ง€ ์„ ํƒํ•œ ํ–‰๋™๋“ค์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑด ๋„ˆ๋ฌด ์™ธ์—ฐ์ ์ธ ์ •์˜๊ณ , ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๊ฐ€ ๋ณดํ†ต ๋งŒ์กฑํ• ๋งŒํ•œ ์กฐ๊ฑด์„ ๋‚˜์—ดํ•ด๋ณด์ž๋ฉด ์ด๋ ‡๋‹ค.ํ™˜๊ฒฝ์€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋œ๋‹ค์ƒํƒœ๋Š” ์—์ด์ „ํŠธ๊ฐ€ ๋ฌด์—‡์„ ๊ด€์ธกํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค์—์ด์ „ํŠธ์˜ ํ–‰๋™์€ ๋‹ค์Œ ์ƒํƒœ์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค<์ด ์กฐ๊ฑด๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ํ™˜๊ฒฝ์„ ์ข€๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ •์˜ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.class Environment e where type State e type Observation e type Action e update :: (State e, Action e) -> State e -- ์กฐ๊ฑด 1, 3 observe :: State e -> Observation e -- ์กฐ๊ฑด 2<์Šค๋„ค์ดํฌ ๊ฒŒ์ž„์—์„œ ์ƒํƒœ๋Š” ๋ฑ€์˜ ๋ชจ์–‘๊ณผ ๋จน์ด์˜ ์œ„์น˜, ๊ด€์ธก์€ ์ƒํƒœ์™€ ๊ฐ™๊ณ (ํ”Œ๋ ˆ์ด์–ด๋Š” ์ „์ฒด ๊ฒŒ์ž„ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค), ํ–‰๋™์€ ์ขŒํšŒ์ „๊ณผ ์šฐํšŒ์ „์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฑ€์ด ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์ขŒํšŒ์ „ ์šฐํšŒ์ „ ํ•œ๋‹ค๊ณ  ๋ฐ•์ˆ˜ ์ณ์ค„์ˆœ ์—†๊ณ , ์šฐ๋ฆฌ๋Š” ์–˜ํ•œํ…Œ ๋ฐ”๋ผ๋Š” ๊ฒŒ ์žˆ๋‹ค. ์ฃฝ์ง€์•Š๊ณ  ๋” ๋งŽ์€ ๋จน์ด๋ฅผ ๋จน์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฑ€์ด ์ œ๋•Œ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์„œ ๋จน์ด๋ฅผ ์ง€๋‚˜์น˜์ง€ ์•Š๊ณ  ๋จน์œผ๋ฉด ์ž˜ ํ–ˆ๋‹ค๊ณ  ๋ณด์ƒ์„ ์ฃผ์ž. ๊ทธ๋Ÿฌ๋ฉด ๋ฑ€์€ ๋ณด์ƒ์„ ๋” ๋งŽ์ด ๋ฐ›์„ ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•œ๋‹ค.type RewardFunction = (Observation, Action) -> Float<๋ณด์ƒ ํ•จ์ˆ˜๋Š” ๊ด€์ธก์™€ ํ–‰๋™์— ๋”ฐ๋ผ ๋ณด์ƒ์„ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ฐ€๋ น ๋ฑ€์ด ๋จน์ด ํ•˜๋‚˜๋ฅผ ๋ƒ ๋ƒ ํ•˜๋ฉด ๋ณด์ƒ์„ 1 ์ฃผ๋ฉด ๋œ๋‹ค. ์ง€๋‚˜์ณ๋ฒ„๋ฆฌ๋ฉด 0์ ์ด๊ณ , ์ฃฝ์—ˆ์„ ๋•Œ๋Š” -1์ ์„ ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹น๊ทผ๊ณผ ์ฑ„์ฐ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค. ๋˜, ๋ณด์ƒ์€ ๋”ํ•ด์„œ ๋ˆ„์ ์ด ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋Œ€์ถฉ Float์œผ๋กœ ๊ณ ๋ฅธ๋‹ค. ํ•™์Šต์„ ์‹œํ‚ค๋ ค๋ฉด ๋ณด์ƒ์„ ๊ณ„์‚ฐํ•ด์•ผํ•˜๊ณ , ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด ๊ด€์ธก๊ณผ ํ–‰๋™์„ ์ง์ง€์–ด์•ผํ•œ๋‹ค.trainAgent :: Agent -> [(Observation, Action)]<runAgent์™€ ๋‹ฌ๋ฆฌ Observation๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ด๋•Œ [(Observation, Action)]์„ ์—ํ”ผ์†Œ๋“œ Episode ๋ผ๊ณ  ํ•œ๋‹ค. ์—ํ”ผ์†Œ๋“œ๋กœ๋ถ€ํ„ฐ ๋ณด์ƒ์„ ๊ตฌํ•˜์ž.rewards = fmap (uncurry rewardFn) (trainAgent agent)rewardFn :: RewardFunctionagent :: Agent<...ํ•ด์น˜์› ๋‚˜? ์—ํ”ผ์†Œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธฐ๋ก๋ ์ง€๋ฅผ ์‚ดํŽด๋ณด์ž.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ๐ŸŽ๐ŸŽ๐ŸŽ๐Ÿ’€<์œ„์˜ rewards์˜ ๊ฐ’์ด ์ด๋Ÿฐ ์˜๋ฏธ์ผ๊ฑฐ๋ผ๊ณ  ๋ณด์ธ๋‹ค. ์‹ค์ œ๋กœ Float ๊ฐ’์„ ํ‘œ์‹œํ•ด๋ณด์ž.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ0010011000<ํ˜น์‹œ ์ด์ƒํ•œ ๊ฑธ ์ฐพ์œผ์…จ๋‚˜์š”? ์ด๋Ÿฐ์‹์œผ๋กœ ๋ณด์ƒํ•˜๋Š”๊ฒŒ ํ‹€๋ฆฐ ๊ฑด ์•„๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์—์ด์ „ํŠธ๊ฐ€ ์žฅ๊ธฐ์ ์ธ ๊ณ„ํš์„ ์„ธ์šฐ๋„๋ก ํ•™์Šต์‹œํ‚ค์ง€ ๋ชปํ•œ๋‹ค. ๋จน์ด๋ฅผ ๋จน๋Š” ์ˆœ๊ฐ„์—๋งŒ ๋ณด์ƒ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋จน์ด๋ฅผ ํ–ฅํ•ด ๋‹ค๊ฐ€๊ฐ€๊ฒŒ๋” ์œ ๋„ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ณด์ƒ์„ ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ˆ„์ ์‹œ์ผœ์•ผ ํ•œ๋‹ค.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ3332221000rewards = scanr (+) 0 (fmap (uncurry rewardFn) (trainAgent agent))<์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์šฉ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ• ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“ค์—ˆ๋Š”๋ฐ, ๋‹คํ–‰ํžˆ scanr ํ•จ์ˆ˜ ๋•๋ถ„์— ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ข€๋” ๊ฐœ์„ ํ•ด๋ณผ๊นŒ. ์ง€๊ธˆ์˜ ๋ณด์ƒ ์ฒด๊ณ„์—์„œ ์—์ด์ „ํŠธ๋Š” ๋จผ ๋ฏธ๋ž˜๋ฅผ ๊ณ ๋ คํ•˜๋ฉฐ ์„ ํƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์‚ฌ์‹ค ๋ฑ€์ด ๋งจ ์ฒ˜์Œ์— ์ขŒํšŒ์ „์„ ํ•˜๋˜ ์šฐํšŒ์ „์„ ํ•˜๋˜, ์ฃฝ๊ธฐ ์ „๊นŒ์ง€ ๋จน์ด๋ฅผ ์ด ๋ช‡๊ฐœ ๋จน๋Š”์ง€์— ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ๋ผ์น ๊ฑฐ ๊ฐ™์ง„ ์•Š๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ์˜ ์„ ํƒ์˜ ์˜ํ–ฅ์€ ์‹œ๊ฐ„์ด ์ง€๋‚  ์ˆ˜๋ก ์ ์  ํฌ๋ฏธํ•ด์ง„๋‹ค. ์ด ์ ์„ ๋ฐ˜์˜ํ•ด์„œ ๋ฑ€์ด ์ž˜๋ชป๋œ ํŽธ๊ฒฌ์„ ๊ฐ–์ง€ ์•Š๋„๋ก ๋„์™€์ฃผ์ž. ๋ฏธ๋ž˜์˜ ๋ณด์ƒ์„ ๋ˆ„์ ํ•˜๋˜, ๊ฐ์‡ ์œจ 0.9๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ1.932.152.391.541.711.901.000.000.000.00rewards = scanr (\x y -> x + 0.9 * y) 0 (fmap (uncurry rewardFn) (trainAgent agent))<์ด์ œ ๋‚˜๋จธ์ง€๋Š” GPUํ•œํ…Œ ๋งก๊ธฐ๋ฉด ๋œ๋‹ค. ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์œ„์˜ ๋™์˜์ƒ์—์„œ์ฒ˜๋Ÿผ ์›€์ง์ด๋Š” ๋ฑ€์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.<์—ฌ๊ธฐ์„œ GPU๋ฅผ 100์žฅ ๋” ์‚ฌ์„œ ๋ฑ€ ๋Œ€์‹ ์— ์ข€๋” ์šฐ๋ฆฌ ์‚ถ์— ๋„์›€๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ํ•™์Šต์‹œํ‚จ๋‹ค๋ฉด, ๊ทธ๊ฑธ 10๋…„์ „์— ํ–ˆ์œผ๋ฉด, ๋‚œ ์ง€๊ธˆ ๋ถ€์ž๊ฐ€ ๋˜์–ด์žˆ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐํšŒ๋Š” ์ด๋ฏธ ๋– ๋‚ฌ๊ณ , ๋‚œ ์ง€๊ธˆ ๋ˆ์€ ์—†์ง€๋งŒ ๋Œ€์‹  ์‹œ๊ฐ„์€ ๋งŽ๋‹ค. ๊ทธ ์‹œ๊ฐ„์„, ์ง€๊ธˆ์˜ ๊ทธ๋Ÿญ์ €๋Ÿญ ๋ณผ๋งŒํ•œ ์ฝ”๋“œ๋ฅผ ์ฅ๊ผฌ๋ฆฌ๋งŒํผ ๊ฐœ์„ ํ•˜๋Š”๋ฐ ๋‚ญ๋น„ํ•ด๋ณด๋ ค ํ•œ๋‹ค. ์ง€๊ธˆ ์ฝ”๋“œ์—์„œ ๋ญ๊ฐ€ ๋งˆ์Œ์— ์•ˆ๋“œ๋ƒ๋ฉด,<๋ณด์ƒ์ด ์‚ฌ์‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค ๋จน์ด๋ฅผ ๋จน์ž๋งˆ์ž ์ฆ‰๊ฐ์ ์œผ๋กœ ์ฃผ๋Š” ๋ณด์ƒ๊ณผ, ๊ทธ๊ฒƒ์„ ๋ˆ„์ ํ•œ ๋ณด์ƒ, ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋‹ค. ์‹ค์ œ๋กœ ํ•™์Šต์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ›„์ž์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ๋ณด์ƒ ํ•จ์ˆ˜์˜ ์ •์˜๋Š” ์ „์ž์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๋ณด์ƒ ํ•จ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ๋ฏธ๋ž˜์— ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์ˆ˜๊ฐ€ ์—†์–ด์„œ ๊ทธ๋ ‡๋‹ค. ์ •์˜๋ฅผ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆˆ ์ด์œ ๊ฐ€ ์˜๋ฏธ๋ฅผ ๋ช…์พŒํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ทธ๋ƒฅ ํ•œ๋ฒˆ์— ๊ณ„์‚ฐ์„ ํ• ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.<ํ™˜๊ฒฝ์˜ ์ •์˜ ์œ„์—์„œ ์‚ดํŽด๋ณธ runAgent์˜ ์ •์˜๊ฐ€ ์ผ๊ฒฌ ์šฐ์•„ํ•ด๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ ์ •์˜๋Š” ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๊ฐ€ ๋ชจ๋‘ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ผ ๊ฒƒ์„ ๊ฐ•์š”ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Environment์˜ ์ •์˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๋Š” ๊ฐ์ž์˜ ๋ถ€์ˆ˜ํšจ๊ณผ Side effect ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ฐ€๋ น ์˜จ๋ผ์ธ ๊ฒŒ์ž„์„ ํ™˜๊ฒฝ์œผ๋กœ ์‚ผ๋Š”๋‹ค๋ฉด, ํ™˜๊ฒฝ์€ ๋„คํŠธ์›Œํ‚น์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋˜, ์—์ด์ „ํŠธ๋Š” ๋งค๋ฒˆ ๋˜‘๊ฐ™์€ ์„ ํƒ์ด ์•„๋‹Œ ํ™•๋ฅ ์  ์„ ํƒ์„ ํ•˜๊ณ  ์‹ถ์„ํ…๋ฐ, ์ด๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ์จ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.<๊ทธ๋Ÿฌ๋ฉด ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋ƒ?<๋งž๋‹ค. ๋‚˜์ฒ˜๋Ÿผ ์‹œ๊ฐ„์ด ๋งŽ๋‹ค๋ฉด ์ง์ ‘ ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ์ •์˜๊ฐ€ ์ ์  ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ๋  ๊ฒƒ์ด๊ณ ... ์‹œ๊ฐ„์„ ์•„๊ปด์ฃผ๊ธฐ ์œ„ํ•ด ์ •๋‹ต์„ ์•Œ๋ ค์ฃผ๊ฒ ๋‹ค. ํ™˜๊ฒฝ์€ ์—์ด์ „ํŠธ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋‚˜๋“œ์—ฌ์•ผ ํ•œ๋‹ค. ๋”ฑ ๊ฑฐ๊ธฐ๊นŒ์ง€์—ฌ์•ผ ํ•œ๋‹ค. ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ ์‚ฌ์ด์— ๊ทธ ์ด์ƒ์˜ ๊ด€๊ณ„๋Š” ๋ถ€์ ์ ˆํ•˜๋‹ค.<๊ธ€์ด ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๊ธธ์–ด์ ธ๋ฒ„๋ ค์„œ, ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€ ํ•ด์•ผ๊ฒ ๋‹ค. ์ด์–ด์ง€๋Š” ๊ธ€์—์„œ ๊ฑฐ๊พธ๋กœ ์ƒํƒœ ๋ชจ๋‚˜๋“œ๊ฐ€ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์†Œ๊ฐœํ•œ๋‹ค. ์‚ฌ์‹ค ์•„๊นŒ ํ™˜๊ฒฝ์ด๋‹ˆ ์—์ด์ „ํŠธ๋‹ˆ ์–ด์ฉŒ๊ณ  ํ• ๋•Œ๋ถ€ํ„ฐ, ์ง„์ž‘์— ๊ฐ•ํ™” ํ•™์Šต์„ ๋งˆ์Šคํ„ฐํ•œ ํ•™์ƒ๋“ค์ด ์ด๋ฏธ ๋‹ค ์•„๋Š” ๋‚ด์šฉ์— ์ง€๊ฒจ์›Œ ์กธ๊ธฐ ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ๋ณด์˜€๋‹ค. ๋‹ค์Œ ์ˆ˜์—…์€ ์žฌ๋ฐŒ์„ํ…Œ๋‹ˆ, ๋Œ€์‹  ๊ทธ๋•Œ๊นŒ์ง€ ๋ชจ๋‚˜๋“œ๋ฅผ ๋ฐฐ์›Œ์˜ค์„ธ์š”.

hackers.pub ยท Hackers' Pub

Link author: bgl gwyng@bgl@hackers.pub

8
0
0

๊ฑฐ๊พธ๋กœ ์ƒํƒœ ๋ชจ๋‚˜๋“œ๋กœ ๊ฐ•ํ™” ํ•™์Šต ํ•˜๊ธฐ (1/2) 2ํŽธ์„ ๋งˆ์ € ์จ์•ผํ•˜๋Š”๋ฐ, ๋จผ์ € ํ•˜์Šค์ผˆ ์„ธ๋ฏธ๋‚˜ ์‹œ๊ฐ„์— ์ „์ฒด ๋‚ด์šฉ์œผ๋กœ ๋™๋ฃŒ๋“คํ•œํ…Œ ๋ฐœํ‘œ๋ฅผ ํ–ˆ๋‹ค. ๊ทผ๋ฐ ๋ฐœํ‘œํ•˜๋ฉด์„œ ๊ธ€์— ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ ์ด๋ผ๊ณ  ์จ๋†“์€๊ฒŒ ๋˜๊ฒŒ ์–ผ๋ ๋šฑ๋•…์ด๋ž€๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค. ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์ง ์ง€๊ฐ€ ์‹œ๊ฐ„์ด ์ข€ ๋˜์–ด์„œ ์ •ํ™•ํžˆ ๋ญ๊ฐ€ ๋ฌธ์ œ์˜€๋Š”์ง€ ์ข€ ๊นŒ๋จน์–ด์„œ ์‹ค์ œ๋กœ ์“ฐ๊ธฐ๊ฐ€ ํž˜๋“ค์–ด์„œ ์ค‘๊ฐ„์— ์ข€ ๋†จ์—ˆ๋‹คใ…‹ใ…‹ ์•”ํŠผ ๋ฐœํ‘œ๋ฅผ ํ•ด๋ณด๋Š”๊ฒŒ ๋‚ด์šฉ ์ ๊ฒ€์— ๋„์›€์ด ๋งŽ์ด ๋œ๋‹จ๊ฑธ ์•Œ์•˜๋‹ค.

๊ฑฐ๊พธ๋กœ ์ƒํƒœ ๋ชจ๋‚˜๋“œ๋กœ ๊ฐ•ํ™” ํ•™์Šต ํ•˜๊ธฐ (1/2)

๊ธฐ๊ณ„ ํ•™์Šต์„ ์ „ํ˜€ ๋ชจ๋ฅด๊ณ  ์‚ด๋ฉด ์•ˆ ๋˜๊ฒ ๋‹ค ์‹ถ์–ด, ์–ผ๋งˆ์ „๋ถ€ํ„ฐ ํ•˜์Šค์ผˆ๋กœ ๊ณต๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. Hasktorch๋ผ๊ณ  ํ•˜์Šค์ผˆ์šฉ Torch ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด์ „์— ๋„์ „ํ–ˆ์„๋• MNIST๊นŒ์ง€ ํ•˜๊ณ  ๋‹ค์Œ์— ๋ญ˜ ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๊ทธ๋งŒ๋’€๋Š”๋ฐ, ์ด๋ฒˆ์—” ๊ฐ•ํ™” ํ•™์Šต์œผ๋กœ ์ด์–ด๋‚˜๊ฐ€ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ฐ•ํ™” ํ•™์Šต์€ ์ฃผ์–ด์ง„ ํ™˜๊ฒฝ์—์„œ ๋ณด์ƒ์„ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ, ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”์—†๋‹ค๋Š”๊ฒŒ ์žฅ์ ์ด๋‹ค. ๋Œ€์‹  ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„๋„ ํ™˜๊ฒฝ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ๋Š” ๋ฐ์ดํ„ฐ ๋ชจ์œผ๊ธฐ์™€ ๋‹ฌ๋ฆฌ ์ฆ๊ฑฐ์šด ์ผ์ด๋‹ˆ ๋งˆ๋‹คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ฒซ๋ฒˆ์งธ๋กœ ๋„์ „์œผ๋กœ ์Šค๋„ค์ดํฌ ๊ฒŒ์ž„์„ ๊ณจ๋ž๋Š”๋ฐ, ๋‹ค๋“ค ํ•œ๋ฒˆ์ฏค์€ ํ•ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๋ฑ€์„ ์กฐ์ข…ํ•ด ๋จน์ด๋ฅผ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋จน์œผ๋ฉด ๋˜๋Š”๋ฐ, ๋ฑ€์˜ ๋จธ๋ฆฌ๊ฐ€ ๋ฒฝ์ด๋‚˜ ์•„๋‹ˆ๋ฉด ์ž๊ธฐ ๋ชธํ†ต์— ๋ถ€๋”ชํžˆ๋ฉด ์ฃฝ๋Š”๋‹ค. ์—ฌ์ฐจ์—ฌ์ฐจ ํ•™์Šต์‹œ์ผœ์„œ ์ด์ •๋„๊นŒ์ง€ ํ•˜๋Š”๋ฐ์—๋Š” ์„ฑ๊ณตํ–ˆ๋‹ค. ๊ฐ•ํ™” ํ•™์Šต ์ง€์‹์ด ์ผ์ฒœํ•ด์„œ ๊ฒŒ์ž„์„ ํด๋ฆฌ์–ดํ•˜๋Š” ์ˆ˜์ค€๊นŒ์ง€๋Š” ๋ชป ๋งŒ๋“ค๊ฒ ๋‹ค. ์ด ๊ธ€์€ ํ•™์Šต์„ ์ž˜ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ, ๊ฐ•ํ™”ํ•™์Šต ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž˜ ์งœ๋А๋ƒ์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค.<์ผ๋‹จ ๊ฐ•ํ™” ํ•™์Šต์ด๋ž€๊ฑธ ํ˜•์‹ํ™” ํ•ด๋ณด์ž. ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๋ž€ ๋‹จ์–ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ• ์ˆ˜ ์žˆ์„๊นŒ? ๋จผ์ € ์—์ด์ „ํŠธ์˜ ์ •์˜๋Š” ์ด๋ ‡๋‹ค.type Agent = Observation -> Action<๊ด€์ธก Observation ์— ๋”ฐ๋ผ ํ–‰๋™ Action ์„ ์„ ํƒํ•œ๋‹ค. ๋‚˜๋Š” ๋ˆˆ์•ž์— ์ฝœ๋ผ๊ฐ€ ๋ณด์ด๋ฉด ๋งˆ์‹ ๋‹ค. ํ™˜๊ฒฝ์€ ์—์ด์ „ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€์ด๋‹ค. ์ผ์ƒ์ ์ธ ํ‘œํ˜„์œผ๋กœ ์“ฐ์ž๋ฉด, ์—์ด์ „ํŠธ๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ๋ฌด์–ธ๊ฐ€์ด๋‹ค.runAgent :: Agent -> [Action]<์ด runAgent ํ•จ์ˆ˜๊ฐ€ ํ™˜๊ฒฝ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. Agent๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์ฃฝ์„ ๋•Œ๊นŒ์ง€ ์„ ํƒํ•œ ํ–‰๋™๋“ค์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑด ๋„ˆ๋ฌด ์™ธ์—ฐ์ ์ธ ์ •์˜๊ณ , ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๊ฐ€ ๋ณดํ†ต ๋งŒ์กฑํ• ๋งŒํ•œ ์กฐ๊ฑด์„ ๋‚˜์—ดํ•ด๋ณด์ž๋ฉด ์ด๋ ‡๋‹ค.ํ™˜๊ฒฝ์€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋œ๋‹ค์ƒํƒœ๋Š” ์—์ด์ „ํŠธ๊ฐ€ ๋ฌด์—‡์„ ๊ด€์ธกํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค์—์ด์ „ํŠธ์˜ ํ–‰๋™์€ ๋‹ค์Œ ์ƒํƒœ์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค<์ด ์กฐ๊ฑด๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ํ™˜๊ฒฝ์„ ์ข€๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ •์˜ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.class Environment e where type State e type Observation e type Action e update :: (State e, Action e) -> State e -- ์กฐ๊ฑด 1, 3 observe :: State e -> Observation e -- ์กฐ๊ฑด 2<์Šค๋„ค์ดํฌ ๊ฒŒ์ž„์—์„œ ์ƒํƒœ๋Š” ๋ฑ€์˜ ๋ชจ์–‘๊ณผ ๋จน์ด์˜ ์œ„์น˜, ๊ด€์ธก์€ ์ƒํƒœ์™€ ๊ฐ™๊ณ (ํ”Œ๋ ˆ์ด์–ด๋Š” ์ „์ฒด ๊ฒŒ์ž„ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค), ํ–‰๋™์€ ์ขŒํšŒ์ „๊ณผ ์šฐํšŒ์ „์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฑ€์ด ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์ขŒํšŒ์ „ ์šฐํšŒ์ „ ํ•œ๋‹ค๊ณ  ๋ฐ•์ˆ˜ ์ณ์ค„์ˆœ ์—†๊ณ , ์šฐ๋ฆฌ๋Š” ์–˜ํ•œํ…Œ ๋ฐ”๋ผ๋Š” ๊ฒŒ ์žˆ๋‹ค. ์ฃฝ์ง€์•Š๊ณ  ๋” ๋งŽ์€ ๋จน์ด๋ฅผ ๋จน์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฑ€์ด ์ œ๋•Œ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์„œ ๋จน์ด๋ฅผ ์ง€๋‚˜์น˜์ง€ ์•Š๊ณ  ๋จน์œผ๋ฉด ์ž˜ ํ–ˆ๋‹ค๊ณ  ๋ณด์ƒ์„ ์ฃผ์ž. ๊ทธ๋Ÿฌ๋ฉด ๋ฑ€์€ ๋ณด์ƒ์„ ๋” ๋งŽ์ด ๋ฐ›์„ ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•œ๋‹ค.type RewardFunction = (Observation, Action) -> Float<๋ณด์ƒ ํ•จ์ˆ˜๋Š” ๊ด€์ธก์™€ ํ–‰๋™์— ๋”ฐ๋ผ ๋ณด์ƒ์„ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ฐ€๋ น ๋ฑ€์ด ๋จน์ด ํ•˜๋‚˜๋ฅผ ๋ƒ ๋ƒ ํ•˜๋ฉด ๋ณด์ƒ์„ 1 ์ฃผ๋ฉด ๋œ๋‹ค. ์ง€๋‚˜์ณ๋ฒ„๋ฆฌ๋ฉด 0์ ์ด๊ณ , ์ฃฝ์—ˆ์„ ๋•Œ๋Š” -1์ ์„ ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹น๊ทผ๊ณผ ์ฑ„์ฐ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค. ๋˜, ๋ณด์ƒ์€ ๋”ํ•ด์„œ ๋ˆ„์ ์ด ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋Œ€์ถฉ Float์œผ๋กœ ๊ณ ๋ฅธ๋‹ค. ํ•™์Šต์„ ์‹œํ‚ค๋ ค๋ฉด ๋ณด์ƒ์„ ๊ณ„์‚ฐํ•ด์•ผํ•˜๊ณ , ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด ๊ด€์ธก๊ณผ ํ–‰๋™์„ ์ง์ง€์–ด์•ผํ•œ๋‹ค.trainAgent :: Agent -> [(Observation, Action)]<runAgent์™€ ๋‹ฌ๋ฆฌ Observation๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ด๋•Œ [(Observation, Action)]์„ ์—ํ”ผ์†Œ๋“œ Episode ๋ผ๊ณ  ํ•œ๋‹ค. ์—ํ”ผ์†Œ๋“œ๋กœ๋ถ€ํ„ฐ ๋ณด์ƒ์„ ๊ตฌํ•˜์ž.rewards = fmap (uncurry rewardFn) (trainAgent agent)rewardFn :: RewardFunctionagent :: Agent<...ํ•ด์น˜์› ๋‚˜? ์—ํ”ผ์†Œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธฐ๋ก๋ ์ง€๋ฅผ ์‚ดํŽด๋ณด์ž.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ๐ŸŽ๐ŸŽ๐ŸŽ๐Ÿ’€<์œ„์˜ rewards์˜ ๊ฐ’์ด ์ด๋Ÿฐ ์˜๋ฏธ์ผ๊ฑฐ๋ผ๊ณ  ๋ณด์ธ๋‹ค. ์‹ค์ œ๋กœ Float ๊ฐ’์„ ํ‘œ์‹œํ•ด๋ณด์ž.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ0010011000<ํ˜น์‹œ ์ด์ƒํ•œ ๊ฑธ ์ฐพ์œผ์…จ๋‚˜์š”? ์ด๋Ÿฐ์‹์œผ๋กœ ๋ณด์ƒํ•˜๋Š”๊ฒŒ ํ‹€๋ฆฐ ๊ฑด ์•„๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์—์ด์ „ํŠธ๊ฐ€ ์žฅ๊ธฐ์ ์ธ ๊ณ„ํš์„ ์„ธ์šฐ๋„๋ก ํ•™์Šต์‹œํ‚ค์ง€ ๋ชปํ•œ๋‹ค. ๋จน์ด๋ฅผ ๋จน๋Š” ์ˆœ๊ฐ„์—๋งŒ ๋ณด์ƒ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋จน์ด๋ฅผ ํ–ฅํ•ด ๋‹ค๊ฐ€๊ฐ€๊ฒŒ๋” ์œ ๋„ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ณด์ƒ์„ ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ˆ„์ ์‹œ์ผœ์•ผ ํ•œ๋‹ค.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ3332221000rewards = scanr (+) 0 (fmap (uncurry rewardFn) (trainAgent agent))<์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์šฉ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ• ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“ค์—ˆ๋Š”๋ฐ, ๋‹คํ–‰ํžˆ scanr ํ•จ์ˆ˜ ๋•๋ถ„์— ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ข€๋” ๊ฐœ์„ ํ•ด๋ณผ๊นŒ. ์ง€๊ธˆ์˜ ๋ณด์ƒ ์ฒด๊ณ„์—์„œ ์—์ด์ „ํŠธ๋Š” ๋จผ ๋ฏธ๋ž˜๋ฅผ ๊ณ ๋ คํ•˜๋ฉฐ ์„ ํƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์‚ฌ์‹ค ๋ฑ€์ด ๋งจ ์ฒ˜์Œ์— ์ขŒํšŒ์ „์„ ํ•˜๋˜ ์šฐํšŒ์ „์„ ํ•˜๋˜, ์ฃฝ๊ธฐ ์ „๊นŒ์ง€ ๋จน์ด๋ฅผ ์ด ๋ช‡๊ฐœ ๋จน๋Š”์ง€์— ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ๋ผ์น ๊ฑฐ ๊ฐ™์ง„ ์•Š๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ์˜ ์„ ํƒ์˜ ์˜ํ–ฅ์€ ์‹œ๊ฐ„์ด ์ง€๋‚  ์ˆ˜๋ก ์ ์  ํฌ๋ฏธํ•ด์ง„๋‹ค. ์ด ์ ์„ ๋ฐ˜์˜ํ•ด์„œ ๋ฑ€์ด ์ž˜๋ชป๋œ ํŽธ๊ฒฌ์„ ๊ฐ–์ง€ ์•Š๋„๋ก ๋„์™€์ฃผ์ž. ๋ฏธ๋ž˜์˜ ๋ณด์ƒ์„ ๋ˆ„์ ํ•˜๋˜, ๊ฐ์‡ ์œจ 0.9๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ1.932.152.391.541.711.901.000.000.000.00rewards = scanr (\x y -> x + 0.9 * y) 0 (fmap (uncurry rewardFn) (trainAgent agent))<์ด์ œ ๋‚˜๋จธ์ง€๋Š” GPUํ•œํ…Œ ๋งก๊ธฐ๋ฉด ๋œ๋‹ค. ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์œ„์˜ ๋™์˜์ƒ์—์„œ์ฒ˜๋Ÿผ ์›€์ง์ด๋Š” ๋ฑ€์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.<์—ฌ๊ธฐ์„œ GPU๋ฅผ 100์žฅ ๋” ์‚ฌ์„œ ๋ฑ€ ๋Œ€์‹ ์— ์ข€๋” ์šฐ๋ฆฌ ์‚ถ์— ๋„์›€๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ํ•™์Šต์‹œํ‚จ๋‹ค๋ฉด, ๊ทธ๊ฑธ 10๋…„์ „์— ํ–ˆ์œผ๋ฉด, ๋‚œ ์ง€๊ธˆ ๋ถ€์ž๊ฐ€ ๋˜์–ด์žˆ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐํšŒ๋Š” ์ด๋ฏธ ๋– ๋‚ฌ๊ณ , ๋‚œ ์ง€๊ธˆ ๋ˆ์€ ์—†์ง€๋งŒ ๋Œ€์‹  ์‹œ๊ฐ„์€ ๋งŽ๋‹ค. ๊ทธ ์‹œ๊ฐ„์„, ์ง€๊ธˆ์˜ ๊ทธ๋Ÿญ์ €๋Ÿญ ๋ณผ๋งŒํ•œ ์ฝ”๋“œ๋ฅผ ์ฅ๊ผฌ๋ฆฌ๋งŒํผ ๊ฐœ์„ ํ•˜๋Š”๋ฐ ๋‚ญ๋น„ํ•ด๋ณด๋ ค ํ•œ๋‹ค. ์ง€๊ธˆ ์ฝ”๋“œ์—์„œ ๋ญ๊ฐ€ ๋งˆ์Œ์— ์•ˆ๋“œ๋ƒ๋ฉด,<๋ณด์ƒ์ด ์‚ฌ์‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค ๋จน์ด๋ฅผ ๋จน์ž๋งˆ์ž ์ฆ‰๊ฐ์ ์œผ๋กœ ์ฃผ๋Š” ๋ณด์ƒ๊ณผ, ๊ทธ๊ฒƒ์„ ๋ˆ„์ ํ•œ ๋ณด์ƒ, ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋‹ค. ์‹ค์ œ๋กœ ํ•™์Šต์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ›„์ž์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ๋ณด์ƒ ํ•จ์ˆ˜์˜ ์ •์˜๋Š” ์ „์ž์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๋ณด์ƒ ํ•จ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ๋ฏธ๋ž˜์— ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์ˆ˜๊ฐ€ ์—†์–ด์„œ ๊ทธ๋ ‡๋‹ค. ์ •์˜๋ฅผ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆˆ ์ด์œ ๊ฐ€ ์˜๋ฏธ๋ฅผ ๋ช…์พŒํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ทธ๋ƒฅ ํ•œ๋ฒˆ์— ๊ณ„์‚ฐ์„ ํ• ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.<ํ™˜๊ฒฝ์˜ ์ •์˜ ์œ„์—์„œ ์‚ดํŽด๋ณธ runAgent์˜ ์ •์˜๊ฐ€ ์ผ๊ฒฌ ์šฐ์•„ํ•ด๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ ์ •์˜๋Š” ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๊ฐ€ ๋ชจ๋‘ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ผ ๊ฒƒ์„ ๊ฐ•์š”ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Environment์˜ ์ •์˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๋Š” ๊ฐ์ž์˜ ๋ถ€์ˆ˜ํšจ๊ณผ Side effect ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ฐ€๋ น ์˜จ๋ผ์ธ ๊ฒŒ์ž„์„ ํ™˜๊ฒฝ์œผ๋กœ ์‚ผ๋Š”๋‹ค๋ฉด, ํ™˜๊ฒฝ์€ ๋„คํŠธ์›Œํ‚น์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋˜, ์—์ด์ „ํŠธ๋Š” ๋งค๋ฒˆ ๋˜‘๊ฐ™์€ ์„ ํƒ์ด ์•„๋‹Œ ํ™•๋ฅ ์  ์„ ํƒ์„ ํ•˜๊ณ  ์‹ถ์„ํ…๋ฐ, ์ด๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ์จ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.<๊ทธ๋Ÿฌ๋ฉด ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋ƒ?<๋งž๋‹ค. ๋‚˜์ฒ˜๋Ÿผ ์‹œ๊ฐ„์ด ๋งŽ๋‹ค๋ฉด ์ง์ ‘ ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ์ •์˜๊ฐ€ ์ ์  ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ๋  ๊ฒƒ์ด๊ณ ... ์‹œ๊ฐ„์„ ์•„๊ปด์ฃผ๊ธฐ ์œ„ํ•ด ์ •๋‹ต์„ ์•Œ๋ ค์ฃผ๊ฒ ๋‹ค. ํ™˜๊ฒฝ์€ ์—์ด์ „ํŠธ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋‚˜๋“œ์—ฌ์•ผ ํ•œ๋‹ค. ๋”ฑ ๊ฑฐ๊ธฐ๊นŒ์ง€์—ฌ์•ผ ํ•œ๋‹ค. ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ ์‚ฌ์ด์— ๊ทธ ์ด์ƒ์˜ ๊ด€๊ณ„๋Š” ๋ถ€์ ์ ˆํ•˜๋‹ค.<๊ธ€์ด ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๊ธธ์–ด์ ธ๋ฒ„๋ ค์„œ, ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€ ํ•ด์•ผ๊ฒ ๋‹ค. ์ด์–ด์ง€๋Š” ๊ธ€์—์„œ ๊ฑฐ๊พธ๋กœ ์ƒํƒœ ๋ชจ๋‚˜๋“œ๊ฐ€ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์†Œ๊ฐœํ•œ๋‹ค. ์‚ฌ์‹ค ์•„๊นŒ ํ™˜๊ฒฝ์ด๋‹ˆ ์—์ด์ „ํŠธ๋‹ˆ ์–ด์ฉŒ๊ณ  ํ• ๋•Œ๋ถ€ํ„ฐ, ์ง„์ž‘์— ๊ฐ•ํ™” ํ•™์Šต์„ ๋งˆ์Šคํ„ฐํ•œ ํ•™์ƒ๋“ค์ด ์ด๋ฏธ ๋‹ค ์•„๋Š” ๋‚ด์šฉ์— ์ง€๊ฒจ์›Œ ์กธ๊ธฐ ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ๋ณด์˜€๋‹ค. ๋‹ค์Œ ์ˆ˜์—…์€ ์žฌ๋ฐŒ์„ํ…Œ๋‹ˆ, ๋Œ€์‹  ๊ทธ๋•Œ๊นŒ์ง€ ๋ชจ๋‚˜๋“œ๋ฅผ ๋ฐฐ์›Œ์˜ค์„ธ์š”.

hackers.pub ยท Hackers' Pub

Link author: bgl gwyng@bgl@hackers.pub

8
0
0
2

๊ธฐ์†Œ๊ถŒ ์ˆ˜์‚ฌ๊ถŒ ๋„ˆ๋ฌด ๊ฐ•ํ•œ ๊ถŒ๋ ฅ์ด๋‹ค. ๊ฒฝ์ฐฐ์ด๋‚˜ ๊ฒ€์ฐฐ์„ ์‚ฌ๋ƒฅ๊ฐœ์ฒ˜๋Ÿผ ์จ ๋ฒ„๋ฆ‡ ํ•ด์˜จ ํ•œ๊ตญ ์ •์น˜์—์„œ๋Š” ํŠนํžˆ ๊ทธ๋ ‡๋‹ค. ์ด๊ฑธ ์ž˜๊ฒŒ ์ž˜๋ผ์„œ ๋‚˜๋ˆ ์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

0

ๆฐด้…ธๅŒ–ใƒŠใƒˆใƒชใ‚ฆใƒ ใ‚’ใŠ่“ๅญใจๅฝใ‚Šไธ‹็ดš็”Ÿ2ไบบใซ้ฃŸในใ•ใ›ใ‚ˆใ†ใจใ—ใฆใ‚„ใ‘ใฉใ•ใ›ใ‚‹ใ€€ๆ–ฐๆฝŸ็œŒไบ”ๆณ‰ๅธ‚ใฎไธญๅญฆๆ ก๏ฝœTBSย NEWSย DIG

ๆ–ฐๆฝŸ็œŒไบ”ๆณ‰ๅธ‚ใฎไธญๅญฆๆ กใง17ๆ—ฅใ€็†็ง‘ใฎๅฎŸ้จ“ใงไฝฟใฃใŸๆฐด้…ธๅŒ–ใƒŠใƒˆใƒชใ‚ฆใƒ ใ‚’็”ทๅญ็”Ÿๅพ’ใŒไธ‹็ดš็”Ÿ2ไบบใซ้ฃŸในใ•ใ›ใ‚ˆใ†ใจใ—ใฆใ‚„ใ‘ใฉใ‚’ใ•ใ›ใฆใ„ใŸใ“ใจใŒๅˆ†ใ‹ใ‚Šใพใ—ใŸใ€‚ไบ”ๆณ‰ๅธ‚ๆ•™่‚ฒๅง”ๅ“กไผšใ‚„่ค‡ๆ•ฐใฎไฟ่ญท่€…ใซใ‚ˆใ‚Šใพใ™ใจใ€ไปŠๆœˆ17ๆ—ฅใ€ไบ”ๆณ‰ๅธ‚ๅ†…ใฎไธญๅญฆๆ กใงๆฐด้…ธๅŒ–ใƒŠใƒˆใƒชใ‚ฆใƒ ใ‚’ไฝฟใฃใŸ็†็ง‘ใฎๅฎŸ้จ“ใŒ่กŒใ‚ใ‚Œใพใ—ใŸใ€‚ใใฎ้š›ใ€1ไบบใฎ็”ทๅญ็”Ÿๅพ’ใŒๆฐด้…ธๅŒ–ใƒŠใƒˆใƒชใ‚ฆใƒ ใ‚’ๆŒใก...

www.youtube.com ยท YouTube

0
0
0
0
0

SIM ๊ตํ™˜์„ ๊ณ ๋ฏผํ•˜์‹œ๋Š” ๋ถ„๋“ค๊ป˜...
์ž๊ธฐ๊ฐ€ ์‚ฌ๊ณ  ์ณ ๋†“๊ณ  ์ฑ…์ž„์„ ๊ณ ๊ฐ์—๊ฒŒ ์ „๊ฐ€ํ•˜๋Š” SKT์—๊ฒŒ ํ’€ํ”„๋ผ์ด์Šค(6-8์ฒœ์›๋Œ€)๋กœ ์œ ์‹ฌ์„ ์‚ฌ ์ค€๋‹ค๋Š” ์„ ํƒ์ง€ ์™ธ์—๋„, ์ฟ ํŒก์—์„œ 1-3์ฒœ์›์— ์•Œ๋œฐํฐ ์œ ์‹ฌ์„ ์‚ฌ์„œ ๋ฒˆํ˜ธ์ด๋™์„ ํ•œ๋‹ค๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค...

0

ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ ์ง„์งœ ๊ณจ๋•Œ๋ฆฌ๋„ค

ไธญ "็พŽ์™€ ๋ฌด์—ญํ˜‘์ƒ ๊ฐ€์งœ๋‰ด์Šคโ€ฆ๋Œ€์ค‘ ๊ด€์„ธ๋ถ€ํ„ฐ ํ•ด์ œํ•˜๋ผ"

0
3
0
0
0
3

์ „๊ด‘ํ›ˆ ์‚ฌ๋ž‘์ œ์ผ๊ตํšŒ ๋ชฉ์‚ฌ๊ฐ€ ๊ตญ๋ฏผ์˜ํž˜ ๋Œ€์„  ๊ฒฝ์„  ํ›„๋ณด๋“ค์„ ๋น„๋‚œํ•˜๋ฉฐ ์ž์œ ํ†ต์ผ๋‹น ํ›„๋ณด๋กœ 6ยท3 ๋Œ€์„ ์— ์ถœ๋งˆํ•œ๋‹ค๊ณ  ๋ฐํ˜”์Šต๋‹ˆ๋‹ค. ์ „ ๋ชฉ์‚ฌ๋Š” ์„ ๊ฑฐ๊ถŒยทํ”ผ์„ ๊ฑฐ๊ถŒ์ด ๋ชจ๋‘ ๋ฐ•ํƒˆ๋ผ, 2029๋…„๊นŒ์ง€ ๋Œ€์„  ์ถœ๋งˆ๋Š”์ปค๋…• ํˆฌํ‘œ๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์„ ๊ฑฐ ๋‚˜์˜ฌ ์ˆ˜ ์—†๋Š” ์ „๊ด‘ํ›ˆ, ๋Œ€์„  ์ถœ๋งˆ โ€˜์„ ์–ธโ€™โ€ฆ๋…ธ๋ฆผ์ˆ˜...

1
1

Jaeyeol Lee shared the below article:

๊ฐ„๋‹จํ•œ rpmbuild์˜ ์‚ฌ์šฉ๊ณผ private rpm package ๋ฐฐํฌ

Perlmint @perlmint@hackers.pub

๋งˆ์ง€๋ชปํ•ด ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์€ ์‚ฌ๋žŒ์„ ์œ„ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ๋œ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ๋ถ€์กฑํ•œ ์ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ง์ ‘ ์†Œ์Šค์—์„œ ๋นŒ๋“œํ•˜๋Š” ์ผ๋„ ์ ๊ณ , ๊ทธ๊ฑธ ์‹œ์Šคํ…œ ์ „์—ญ์— ์„ค์น˜ํ•˜๋Š” ์ผ๋„ ํ”์น˜๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข‹์€ ํŒจํ‚ค์ง€๋งค๋‹ˆ์ €์™€ ๊ด€๋ฆฌ๊ฐ€ ์ž˜๋˜๋Š” ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ๋“ค์„ ๋‘๊ณ  ์•„์ฃผ ๊ฐ€๋”์€ ์ง์ ‘ ๋นŒ๋“œ๋ฅผ ํ•  ์ผ์ด ์ƒ๊ธฐ๊ณ , ํ”์น˜ ์•Š๊ฒŒ ์‹œ์Šคํ…œ ์ „์—ญ์— ์„ค์น˜ํ•  ์ผ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์ง€๊ฐ„ํ•œ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์š”์ฆˆ์Œ์˜ ์žฅ๋น„์—์„œ๋Š” ๋ณ„ ๋ถˆ๋งŒ ์—†์ด ๋นŒ๋“œ ํ•  ๋งŒํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋‚˜, ์ปดํŒŒ์ผ๋Ÿฌ์ฒ˜๋Ÿผ ํ•œ๋ฒˆ ๋นŒ๋“œํ–ˆ์œผ๋ฉด ๋‹ค์‹œ๋Š” ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์„ค์น˜ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜ํ•„ ์ด๋Ÿฐ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ๊ฒฐ๊ณผ๋ฌผ๋„ ๋ฉ์น˜๊ฐ€ ๋งค์šฐ ํฝ๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ๋Š” ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ณ  ํ•„์š”ํ•œ ํ•ญ๋ชฉ๋งŒ ํŒจํ‚ค์ง€์— ๋„ฃ์–ด์„œ ๋งŒ๋“ค์–ด๋‘๊ณ  ๋‹ค์‹œ ํ™œ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ด๊ธฐ์— ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ rpmbuild์— ๋Œ€ํ•œ ๋‚˜๋ฆ„ ์ตœ์†Œํ•œ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ด…๋‹ˆ๋‹ค.

rpmbuild

rpmbuild๋Š” rpm-build ํŒจํ‚ค์ง€๋กœ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋‚˜๋ฆ„ ๋‹จ์ˆœํ•˜๊ฒŒ rpm์œผ๋กœ ํŒจํ‚ค์ง•์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค. specํŒŒ์ผ์— ํŒจํ‚ค์ง€ ์ •๋ณด, ๋นŒ๋“œ ๋ช…๋ น, ์„ค์น˜ ๋ช…๋ น, ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จํ•ด์•ผ ํ•  ํŒŒ์ผ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•ด์„œ rpmbuild์— ์ž…๋ ฅ์œผ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋นŒ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ rpmํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. native ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ๋””๋ฒ„๊ทธ ์‹ฌ๋ณผ์„ ์•Œ์•„์„œ ๋ถ„๋ฆฌํ•ด์„œ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ํ•„์š”ํ•œ ์˜์กด์„ฑ๋„ ์ถ”์ •ํ•ด์„œ ๋ช…์‹œํ•ด์ค๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ spec ๋ช…์„ธ๋กœ ์—ฐ๊ด€๋œ ์„œ๋ธŒ ํŒจํ‚ค์ง€๋„(ex. ์‹คํ–‰ํŒŒ์ผ ํŒจํ‚ค์ง€์ธ curl๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€ libcurl, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ ํŒจํ‚ค์ง€ libcurl-devel) ๊ฐ™์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ํ™˜๊ฒฝ

rpmbuild๋Š” ๊ธฐ๋ณธ์œผ๋กœ ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS,BUILDROOT}์˜ ๊ฒฝ๋กœ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ ๊ฐ ๊ฒฝ๋กœ์˜ ์šฉ๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • SOURCES์—๋Š” ์••์ถ•๋œ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • SPECS์—๋Š” ํŒจํ‚ค์ง€ ์ •์˜์ธ specํŒŒ์ผ์„ ๋‘ก๋‹ˆ๋‹ค.
  • BUILD๋ฐ‘์—์„œ ๋นŒ๋“œ ์ž‘์—…์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • RPMS์— ๋ฐ”์ด๋„ˆ๋ฆฌ rpm๊ฒฐ๊ณผ๋ฌผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • SRPMS์—๋Š” ์†Œ์Šค rpm๊ฒฐ๊ณผ๋ฌผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • BUILDROOT๋Š” ํŒจํ‚ค์ง• ํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ชจ์œผ๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

specํŒŒ์ผ

specํŒŒ์ผ์€ ํŒจํ‚ค์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๋นŒ๋“œํ•˜๊ณ  ์–ด๋–ค ํ•ญ๋ชฉ๋“ค์ด ํŒจํ‚ค์ง€์— ํฌํ•จ๋ ์ง€, ํŒจํ‚ค์ง€์˜ ์ด๋ฆ„, ์„ค๋ช… ๋ฐ ์˜์กด์„ฑ ๋“ฑ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ํŒจํ‚ค์ง€ ์„ค์น˜, ์‚ญ์ œ์‹œ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต ์‹œ์ž‘ ๋ถ€๋ถ„์—๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •์˜๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋ฆ„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“  python์„ ์œ„ํ•œ spec์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Summary: Python %{version}
Name: python-alternative
Version: %{version}
Release: 1%{?dist}
Obsoletes: %{name} <= %{version}
Provides: %{name} = %{version}
URL: https://www.python.org
Requires: libffi openssl
AutoReq: no
License: PSFL

Source: https://www.python.org/ftp/python/%{version}/Python-%{version}.tgz

BuildRequires: libffi-devel openssl-devel
BuiltRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

%define major_version %(echo "%{version}" | sed -E 's/^([0-9]+)\\..+/\1/' | tr -d)
%define minor_version %(echo "%{version}" | sed -E 's/^[0-9]+\\.([0-9]+)\\..+/\1/' | tr -d)

%description
Python

%package devel
Summary: python development files
Requires: %{name} = %{version}-%{release}

%description devel
Python development package

%prep
%setup -q -n Python-%{version}

%build
./configure --prefix=%{_prefix}

%install
%{__make} altinstall DESTDIR=%{buildroot}
%{__ln_s} -f %{_bindir}/python%{major_version}.%{minor_version} %{buildroot}/%{_bindir}/python%{major_version}

%clean
%{__rm} -rf %{buildroot}

%files
%{_bindir}/python*
%exclude %{_bindir}/idle*
%{_bindir}/pip*
%{_bindir}/pydoc*
%exclude %{_bindir}/2to3*
%{_libdir}/libpython*
%{_prefix}/lib/libpython*
%{_prefix}/lib/python*
%{_mandir}/man1/python*

%files devel
%{_includedir}/python*
%{_prefix}/lib/pkgconfig/python*

%๋กœ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, %package, %description, %files ๊ฐ™์€ ๋งคํฌ๋กœ๋Š” ์ธ์ž๋ฅผ ์ฃผ์–ด์„œ ์„œ๋ธŒ ํŒจํ‚ค์ง€๋ฅผ ์ •์˜ํ•˜๋Š”๋ฐ๋„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„  ์˜ˆ์ œ์ฒ˜๋Ÿผ devel ์ด๋ผ๊ณ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ”์ธ ํŒจํ‚ค์ง€์ด๋ฆ„ ๋’ค์— ๋ถ™์—ฌ์„œ python-alternative-devel๊ฐ€ ๋˜๋ฉฐ, curl - libcurl๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋ฉ”์ธ์˜ ์ด๋ฆ„์€ curl์ด๊ณ , ๋”ธ๋ฆฐ ํŒจํ‚ค์ง€๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” %package -n libcurl๊ณผ ๊ฐ™์ด -n์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡๋ช‡ ๋งคํฌ๋กœ๋Š” ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

%package

์œ ์‚ฌ์„ฑ์„ ๋ณด๋ฉด specํŒŒ์ผ์˜ ๋งจ ์ฒซ๋ถ€๋ถ„์€ ๋ฉ”์ธ ํŒจํ‚ค์ง€์˜ %package์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์Šต๋‹ˆ๋‹ค. <Key>: <Value>์˜ ํ˜•ํƒœ๋กœ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ Key๋ฅผ ๋ณด๋ฉด ๋ฌด์Šจ ๊ฐ’์ธ์ง€ ์ถ”์ธก ํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์„ค๋ช…ํ•  %files์—์„œ ๋‚˜์—ดํ•œ ํŒŒ์ผ์„ rpmbuild๊ฐ€ ๋ถ„์„ํ•˜์—ฌ ์ž๋™์œผ๋กœ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด์„ฑ์„ ์ถ”์ •ํ•ด์„œ ์ถ”๊ฐ€ ํ•ด ์ค๋‹ˆ๋‹ค. python ์Šคํฌ๋ฆฝํŠธ, perl ์Šคํฌ๋ฆฝํŠธ, native ์‹คํ–‰ํŒŒ์ผ ๋“ฑ์„ ๋ถ„์„ํ•ด์„œ ์•Œ์•„์„œ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ํ‹€๋ฆฐ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ๋Š” AutoReq: no๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ž๋™ ์˜์กด์„ฑ ์ถ”๊ฐ€๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด python-alternative ํŒจํ‚ค์ง€๋Š” /usr/local/bin/python%{version}์„ ์„ค์น˜ํ•˜๋Š”๋ฐ ์•„๋งˆ๋„ ๊ฐ™์ด ํฌํ•จ๋˜๋Š” python ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด์„œ /bin/python์„ ์˜์กด์„ฑ์œผ๋กœ ์ถ”์ •ํ•˜์—ฌ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์Šค์Šค๋กœ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์˜์กด์„ฑ์€ ๋ฏธ๋ฆฌ ์„ค์น˜ ๋˜์–ด์žˆ๊ธฐ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ๋ณดํ†ต์€ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค๋งŒ, ์ด ๊ฒฝ์šฐ์—๋Š” ์Šค์Šค๋กœ ์ œ๊ณต์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— python์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ python์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ AutoReq๋ฅผ ๊ป์Šต๋‹ˆ๋‹ค.

%prep

์ค€๋น„๋‹จ๊ณ„๋กœ ์†Œ์Šค์ฝ”๋“œ์˜ ์••์ถ•์„ ํ•ด์ œํ•˜๊ณ  ํ•„์š”ํ•œ๊ฒฝ์šฐ ํŒจ์น˜๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. %setup ๋งคํฌ๋กœ๋ฅผ ์ด ์•ˆ์—์„œ ๋ณดํ†ต ์‚ฌ์šฉํ•˜๋ฉฐ, %setup์€ Source์— ๋ช…์‹œ๋œ ํŒŒ์ผ๋ช…์˜ ์••์ถ• ํŒŒ์ผ์„ SOURCES ๋ฐ‘์—์„œ ์ฐพ์•„์„œ ์••์ถ•์„ ํ’‰๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™์„ ํ•ฉ๋‹ˆ๋‹ค. ์•ž์„  ์˜ˆ์ œ์—์„œ๋Š” SOURCES/Python-%{version}.tgz์˜ ์••์ถ•์„ ํ’€๊ณ  Python-%{version}์œผ๋กœ ์ด๋™์„ ํ•ฉ๋‹ˆ๋‹ค. ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณดํ†ต ์ด ๋’ค์— ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ช…๋ น๋“ค์„ ์ถ”๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค.

%build

์„ค์ •, ์ปดํŒŒ์ผ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ด๊ณณ์—์„œ ์ž์ฃผ ํ•˜๋Š” ๋งคํฌ๋กœ๋กœ %configure, %make_build ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. %configure๋Š” configure๋ฅผ prefix ๋ฐ ๊ธฐํƒ€ ๋ช‡๊ฐ€์ง€ ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ์ด๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹คํ–‰ํ•ด์ฃผ๋ฉฐ, %make_build๋Š” make์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ชจ๋“  ํƒ€๊ฒŸ์„ ๋นŒ๋“œ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ๋‘˜๋‹ค ์•ˆ์“ฐ๊ณ  ์žˆ๊ณ , ์‹ฌ์ง€์–ด ์‹ค์ œ ๋นŒ๋“œ๋Š” ์•ˆํ•˜๋Š”๋ฐ ์–ด์จŒ๋“  ์ดํ›„์˜ %install๊นŒ์ง€ ์ง€๋‚˜๊ณ ๋‚˜์„œ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ๋งŒ ๋งž๋Š” ์œ„์น˜์— ๋งŒ๋“ค์–ด์ง€๋ฉด ๋Œ€์ถฉ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ๋Š” ๋ณ„ ๋ฌธ์ œ๋Š” ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

%install

์—ฌ๊ธฐ์„œ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ %make_install์„ ์‚ฌ์šฉํ•˜์—ฌ make install DESTDIR=%{buildroot}์™€ ๋น„์Šทํ•œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜์—ฌ %{buildroot}๋ฐ‘์— ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์ด prefix๋ฅผ ์œ ์ง€ํ•˜์—ฌ ์„ค์น˜๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ %{__ln_s} -f %{_bindir}/python%{major_version}.%{minor_version} %{buildroot}/%{_bindir}/python%{major_version}์„ ๋ณด๋ฉด ์ถ”์ • ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, ํŒจํ‚ค์ง€์— ํฌํ•จ์‹œํ‚ฌ ํŒŒ์ผ๋“ค์„ %{buildroot}๋ฐ‘์— ์ƒ์„ฑ์„ ํ•˜๋ฉด ๋˜๋ฉฐ, ์ถ”๊ฐ€์ ์ธ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์‹œ์ ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ, ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฒŒ๋˜๋ฉด ์กด์žฌํ•˜๊ฒŒ ๋  %{_bindir}/python%{major_version}.%{minor_version}๋ฅผ ํ–ฅํ•˜๋Š” ๊ฒƒ์„ %{buildroot} ๋ฐ‘์ธ %{buildroot}/%{_bindir}/python%{major_version}์— ๋งŒ๋“ญ๋‹ˆ๋‹ค.

%files

ํŒจํ‚ค์ง€์— ํฌํ•จ๋  ํŒŒ์ผ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. glob ์–‘์‹์œผ๋กœ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. %{buildroot} ๋ฐ‘์— ์ƒ์„ฑ ๋˜์—ˆ์ง€๋งŒ ์–ด๋А %files์—๋„ ํฌํ•จ๋˜์ง€ ์•Š์€ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋นŒ๋“œ๋ฅผ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ %exclude๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์™ธํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐํƒ€ ๋งคํฌ๋กœ

rpmbuild์—์„œ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๋‹ค์–‘ํ•œ ๋งคํฌ๋กœ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. --define "_libdir %{_prefix}/lib64"์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์‹คํ–‰์‹œ์— ์ฃผ์–ด์„œ ์‹คํ–‰์‹œ์ ์— ๋งคํฌ๋กœ๋ฅผ ๋ฎ์–ด ์“ธ ์ˆ˜๋„ ์žˆ๊ณ , ์•ž์„  specํŒŒ์ผ ๋‚ด์˜ %define major_version ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ๋งคํฌ๋กœ์™€ ์…ธ ๋ช…๋ น์„ ํ™œ์šฉํ•˜์—ฌ ๋งคํฌ๋กœ๋ฅผ ์ •์˜ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋™์ž‘์„ ์•ˆํ•˜๋Š” ๊ฒƒ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” --show-rc์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํฌ๋กœ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ •์˜๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ

rpmbuild์˜ ๋งค๋‰ด์–ผ์„ ๋ณด๋ฉด ์ž์„ธํ•˜๊ฒŒ ๋‚˜์™€์žˆ์ง€๋งŒ ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ฒŒ๋Š” rpmbuild -bb <specfile>๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ค. ์ด ๋•Œ, ์••์ถ•๋œ ์†Œ์Šค์ฝ”๋“œ๋Š” ๋ฏธ๋ฆฌ SOURCES๋ฐ‘์— ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

private rpm package ๋ฐฐํฌ

์ง์ ‘ ๋น„๊ณต๊ฐœ ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์—ฌ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, rpm๊ด€๋ จ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ช…๋ น์ด ์ž…๋ ฅ์œผ๋กœ http๋“ฑ์˜ URL๋„ ๋ฐ›๋Š” ๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ์ ๋‹นํ•œ ์žฅ๋น„์—์„œ http๋กœ ์„œ๋น™์„ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Read more โ†’
4