DEV Community ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป

makotunes
makotunes

Posted on

[Starter Kit No.2] Exposing general-purpose Web scraping tool with text analysis function (automatic tagging / visualization)

Easy Customizable Scraper

Concept

screencapture-mockers-io-scanner-2020-02-29-15_20_39.png

General-purpose Web scraping tool with text analysis function.

The following features help users start development.

  • Easy settings
  • Customizability
  • Text analysis function (tagging / visualization)

Click here for source code
https://github.com/makotunes/easy-customizable-scraper

Application example

  • Collection of curated media articles and automatic tagging
  • Recommendation engine

This algorithm is used for the functions of my personally developed products.
https://mockers.io/scanner

Elemental technology

  • Web scraping
  • Automatic language detection
  • Morphological analysis
  • Feature tagging algorithm (original)
  • 2D map visualization technology (original)

Dependencies

  • Docker

Installation

It takes about 1-2 hours.

docker build -t scanner .

or

./build.sh

Run

docker run --rm -it -v "$PWD":/usr/src/app \
--name scanner --force scanner  \
-e 'ENTRY_URL=http://recipe.hacarus.com/' \
-e 'ALLOW_RULE=/recipe/' \
-e 'IMAGE_XPATH=//*[@id="root"]/div/div/section/div/div/div[1]/figure/img' \
-e 'DOCUMENT_XPATH=//td/text()|//p/text()' \
-e 'PAGE_LIMIT=2000' \
-e 'EXCLUDE_REG=\d(ๅนด|ๆœˆ|ๆ—ฅ|ๆ™‚|ๅˆ†|็ง’|๏ฝ‡|\u4eba|\u672c|cm|ml|g|\u5206\u679a\u5ea6)|hacarusinc|allrightsreserved' \
scanner:latest /usr/src/app/entrypoint.sh

or

./run.sh

Parametes

Set Environment Variable of Docker Container.

If you have at least ENTRY_URL, it will automatically scan the page and pull out the text.
If no options are specified, it is optimized for curated media and can be fully automated, such as extracting the text of articles.

Environment Variable Description
ENTRY_URL (Required) Site top URL to start scanning. All the pages are automatically scanned.
ALLOW_RULE Allow filter rule of target urls.
DENY_RULE Deny filter rule of target precedence overurls.
IMAGE_XPATH Specify the image you want to get on the page with XPATH.
DOCUMENT_XPATH XPATH of the top node in the page where text is to be extracted.
PAGE_LIMIT Scaned limittation of number of pages. -1 means unlimited number.
EXCLUDE_REG Regular expression of word rule not extracted by morphological analysis.

Result

result/res.json

Project structure

File Description
src/scraper.py Main scrapying logic
src/categorizer.py Main algorithm to tag and visualize passages.
src/tokenizer.py Main algorithm to do morphological analysis

Customize

custom/_formatter.py

Edit XPATH for required HTML nodes like below.

def formatter(sel):
    res = {}

    n_howtomake = int(len(sel.xpath('//*[@id="root"]/div/div/section/div/div/div[2]/div[1]/table[2]/tbody/tr/td/text()').extract()) / 2)
    res["n_howtomake"] = n_howtomake

    return res

custom/_finalizer.py

Edit post-process to generate your expected output like below.

import pandas as pd

def finalizer(res):
    pages = res["scatter"]
    pages = list(map(lambda x: x["user_meta"], pages))
    df = pd.DataFrame(pages)

    corr_df = df.loc[:, ["time", "n_howtomake", "n_components"]].corr()

    res["analyzed"] = {}
    res["analyzed"]["correlation"] = {}
    res["analyzed"]["correlation"]["time-n_howtomake"] = corr_df.loc["time", "n_howtomake"]

    return res

Example

Here is an example of using this tool for scraping and analysis.

Let's analyze free cooking recipe site.
** If you can't access it, try opening it in secret mode. **

All these results are stored in the "result" directory.

Visualize distribution of cooking time, number of ingredients, number of recipes

import matplotlib.pyplot as plt
import pandas as pd

def finalizer(res):

    pages = res["scatter"]
    pages = list(map(lambda x: x["user_meta"], pages))
    df = pd.DataFrame(pages)

    fig = plt.figure()
    x = df["time"]
    y = df["n_howtomake"]
    plt.scatter(x, y)
    plt.savefig('./result/time-n_howtomake.png')

    fig = plt.figure()
    x = df["time"]
    y = df["n_components"]
    plt.scatter(x, y)
    plt.savefig('./result/time-n_components.png')

    fig = plt.figure()
    x = df["n_howtomake"]
    y = df["n_components"]
    plt.scatter(x, y)
    plt.savefig('./result/n_howtomake-n_components.png')

    return res

Result

Cooking time: how to make

time-n_howtomake.png

Cooking time: number of ingredients

time-n_components.png

How to make: Number of ingredients

n_howtomake-n_components.png

Examine the correlation between cooking time, number of ingredients, and number of recipes

import matplotlib.pyplot as plt
import pandas as pd

def finalizer(res):
    pages = res["scatter"]
    pages = list(map(lambda x: x["user_meta"], pages))
    df = pd.DataFrame(pages)

    corr_df = df.loc[:, ["time", "n_howtomake", "n_components"]].corr()

    res["analyzed"] = {}
    res["analyzed"]["correlation"] = {}
    res["analyzed"]["correlation"]["time-n_howtomake"] = corr_df.loc["time", "n_howtomake"]
    res["analyzed"]["correlation"]["time-n_components"] = corr_df.loc["time", "n_components"]
    res["analyzed"]["correlation"]["n_howtomake-n_components"] = corr_df.loc["n_howtomake", "n_components"]

    fig = plt.figure()

    return res

Result

Cooking time: how to make

0.30457219729662316

Cooking time: number of ingredients

0.3949520467754227

How to make: Number of ingredients

0.6869899620517819

Select about three keywords that can be used to characterize each Leshig

result/tagged.csv

title tag1 tag2 tag3
ใชใ™ใจใƒˆใƒžใƒˆใฎไธญ่ฏๅ’Œใˆ(๏ผ‘๏ผ•ๅˆ†) ใชใ™ ใƒˆใƒžใƒˆ ๅคง่‘‰
ใถใ‚Šใฎ็…งใ‚Š็„ผใ(45ๅˆ†) ไธก้ข ็…งใ‚Š็„ผใ ๆฐดๆฐ—
ใŠใงใ‚“้ขจ็…ฎ(2ๆ™‚้–“) ๅคงๆ น ใ“ใ‚“ใซใ‚ƒใ ็ซน่ผช
ๅคงๆ นใจใƒ„ใƒŠใฎใ‚ตใƒฉใƒ€(15ๅˆ†) ใƒ„ใƒŠ ๅคงๆ น ใ‚ใ‹ใ‚
้ถใฎ็…งใ‚Š็„ผใไธผ(20ๅˆ†) ็‰‡ๆ —็ฒ‰ ใซใ‚“ใซใ ใ‚Œใ‚“ใ“ใ‚“
็ญ‘ๅ‰็…ฎ(๏ผ–๏ผๅˆ†) ใ‚Œใ‚“ใ“ใ‚“ ใ”ใผใ† ใ“ใ‚“ใซใ‚ƒใ
็™ฝ่œใจใ‚ใ‹ใ‚ใฎ้…ขใฎ็‰ฉ(15ๅˆ†) ็™ฝ่œ ใ‚ใ‹ใ‚ ใ—ใ‚ใ˜
้ฎญใฎใƒ›ใ‚คใƒซ็„ผใ(25ๅˆ†) ็Ž‰ใญใŽ ใ—ใ‚ใ˜ ใƒ”ใƒผใƒžใƒณ
ใ‚ญใƒฃใƒ™ใƒ„ใจใƒใƒ ใฎ็ฒ’ใƒžใ‚นใ‚ฟใƒผใƒ‰ๅ’Œใˆ(๏ผ‘๏ผ•ๅˆ†) ใ‚ญใƒฃใƒ™ใƒ„ ใ—ใ‚ใ˜ ใƒใƒ 
ใˆใฎใใจใƒฏใ‚ซใƒกใฎๅ’Œใˆ็‰ฉ(15ๅˆ†) ใˆใฎใ ใ‚ใ‹ใ‚ ใใ‚…ใ†ใ‚Š
้‡Œ่Š‹ใฎใŠใ‚„ใ(๏ผ“๏ผๅˆ†) ้‡Œ่Š‹ ็‰‡ๆ —็ฒ‰ ๆกœใˆใณ
้ถ่‚‰ใจ้‡Œ่Š‹ใฎ็…ฎ็‰ฉ(60ๅˆ†) ้‡Œ่Š‹ ้ถ่‚‰ ็›ธๆ€ง
็„ผใไธ‡้ก˜ๅฏบๅ”่พ›ๅญ(10ๅˆ†) ไธ‡้ก˜ๅฏบๅ”่พ›ๅญ ใ‹ใคใŠ็ฏ€ ไฝœใ‚Šๆ–น
่‚‰ใ˜ใ‚ƒใŒ(45ๅˆ†) ็Ž‰ใญใŽ ็‰›่‚‰ ใ˜ใ‚ƒใŒใ„ใ‚‚
้ฐ†ใฎๅนฝๅบต็„ผใ(๏ผ‘๏ผ•ๅˆ†(ๆผฌใ‘่พผใ‚€ๆ™‚้–“ใฏ็œใ)) ๅ†ท่”ตๅบซ ้ฐ† ใ‚†ใš
ใ‚ชใ‚ฏใƒฉใฎ็…ฎใณใŸใ—(๏ผ‘๏ผๅˆ†(ๅ†ทใ‚„ใ™ๆ™‚้–“ใฏ้™คใ)) ใ‚ชใ‚ฏใƒฉ ใ—ใ‚‡ใ†ใŒ ใ‚ชใ‚ฏใƒฉ
ๆ˜ฅ่Šใจๆฒนๆšใ’ใฎ็…ฎใณใŸใ—(15ๅˆ†) ๆ˜ฅ่Š ๆฒนๆšใ’ ๆ˜ฅ่Š
ใ—ใ„ใŸใ‘ใฎใƒ„ใƒŠใƒžใƒจ็„ผใ(๏ผ‘๏ผๅˆ†) ใƒžใƒจใƒใƒผใ‚บ ๅกฉใ‚ณใ‚ทใƒงใ‚ฆ ใ—ใ„ใŸใ‘
ใ‚ณใƒผใƒซใ‚นใƒญใƒผ(15ๅˆ†) ใ‚ญใƒฃใƒ™ใƒ„ ใƒžใƒจใƒใƒผใ‚บ ใใ‚…ใ†ใ‚Š
ใ˜ใ‚ƒใŒใ„ใ‚‚ใจใ‚ฟใ‚ณใฎใ‚ฌใƒผใƒชใƒƒใ‚ฏ็‚’ใ‚(๏ผ’๏ผๅˆ†) ใซใ‚“ใซใ ใ˜ใ‚ƒใŒใ„ใ‚‚ ใ‚ฟใ‚ณ
ๆฃ’ๆฃ’้ถ(๏ผ“๏ผๅˆ†) ใ—ใ‚‡ใ†ใŒ ใƒˆใƒžใƒˆ ใใ‚…ใ†ใ‚Š
ใ‚ขใƒœใ‚ซใƒ‰ใฎใƒใƒผใ‚บ็„ผใ(15ๅˆ†) ใ‚ขใƒœใ‚ซใƒ‰ ใƒใƒ  ใƒใƒผใ‚บ
ใ‚ญใƒฃใƒ™ใƒ„ใจๅคง่‘‰ใฎใ•ใฃใฑใ‚Šๅ’Œใˆ(๏ผ‘๏ผๅˆ†) ๅคง่‘‰ ใ‚ญใƒฃใƒ™ใƒ„ ๅคง่‘‰
ใ‚ซใƒ‹ใ‚ซใƒžใ‚ตใƒฉใƒ€(10ๅˆ†) ใƒฌใ‚ฟใ‚น ใใ‚…ใ†ใ‚Š ใ‚ตใƒฉใƒ€
ใ‚บใƒƒใ‚ญใƒผใƒ‹ใจใ‚‚ใ‚„ใ—ใฎใƒŠใƒ ใƒซ(๏ผ‘๏ผ•ๅˆ†) ใ‚บใƒƒใ‚ญใƒผใƒ‹ ใ‚‚ใ‚„ใ— ็ฒ—็†ฑ
ๆ˜ฅ้›จใ‚ตใƒฉใƒ€(๏ผ‘๏ผ•ๅˆ†) ๆ˜ฅ้›จ ใใ‚…ใ†ใ‚Š ใƒใƒ 
็™ฝ่œใจๆฒนๆšใ’ใฎใฟใžใ‚Œ็…ฎ(๏ผ“๏ผๅˆ†) ๅคงๆ น ็™ฝ่œ ๆฒนๆšใ’
็‰›่‚‰ใจใ‚Œใ‚“ใ“ใ‚“ใฎ็”˜่พ›็‚’ใ‚(30ๅˆ†) ใ‚Œใ‚“ใ“ใ‚“ ใซใ‚“ใซใ ็‰›่‚‰
่ฑšไธผ(30ๅˆ†) ใ—ใ‚‡ใ†ใŒ ใ—ใ‚ใ˜ ใƒฌใ‚ฟใ‚น
็ด…็™ฝใชใพใ™(30ๅˆ†) ใ‚†ใš็šฎ ๅคงๆ น ้ƒจๅˆ†
้‡Œ่Š‹ใฎใ‚ฌใƒผใƒชใƒƒใ‚ฏ็„ผใ(๏ผ“๏ผๅˆ†) ้‡Œ่Š‹ ใซใ‚“ใซใ ้ฆ™ใ‚Š
ใƒ–ใƒญใƒƒใ‚ณใƒชใƒผใฎใ”ใพใฟใๅ’Œใˆ(10ๅˆ†) ใƒ–ใƒญใƒƒใ‚ณใƒชใƒผ ๅ’Œ้ขจ ใฟใ
ใƒ–ใƒญใƒƒใ‚ณใƒชใƒผใฎใ‚ดใƒžๅ’Œใˆ(๏ผ‘๏ผ•ๅˆ†) ใƒ–ใƒญใƒƒใ‚ณใƒชใƒผ ๅ‡บๆฑ้†คๆฒน ็ฒ—็†ฑ
ใ‹ใถใฎ็”˜้…ขๆผฌใ‘(๏ผ‘ๆ™‚้–“) ใ‚†ใš ็”˜้…ข ๆ˜†ๅธƒ
ใ•ใ‚“ใพใฎใ—ใ‚‡ใ†ใŒ็…ฎ(๏ผ“๏ผๅˆ†) ใ•ใ‚“ใพ ใ—ใ‚‡ใ†ใŒ ๅœงๅŠ›
ใ‚นใƒ‘ใ‚ฒใƒ†ใ‚ฃใƒผใ‚ตใƒฉใƒ€(๏ผ’๏ผๅˆ†) ๅคงๆ น ใใ‚…ใ†ใ‚Š ใ‚นใƒ‘ใ‚ฒใƒƒใƒ†ใ‚ฃ
ๅˆ‡ใ‚Šๅนฒใ—ๅคงๆ นใฎ็…ฎ็‰ฉ(๏ผ’๏ผ•ๅˆ†) ๅˆ‡ใ‚Šๅนฒใ—ๅคงๆ น ๆฒนๆšใ’ ็Ÿญๅ†Š
ใชใ™ใจใ‚ชใ‚ฏใƒฉใฎๅ’Œใˆ็‰ฉ(๏ผ‘๏ผๅˆ†) ใชใ™ ใ‚ชใ‚ฏใƒฉ ๅ‡บๆฑ้†คๆฒน
ใชใ™ใจๅŽšๆšใ’ใฎใŠใ‚ใ—ใ‚ใ‚“(30ๅˆ†) ๅŽšๆšใ’ ใชใ™ ็‰‡ๆ —็ฒ‰
ใ”ใผใ†ใฎใ”ใพใƒžใƒจใ‚ตใƒฉใƒ€(15ๅˆ†) ใ”ใผใ† ๅฅฝใฟ ไธ€ๅ‘ณ
ๆฐด่œใจ้•ทใ„ใ‚‚ใฎใ‚ใ•ใณๅ’Œใˆ(๏ผ‘๏ผ•ๅˆ†) ๆฐด่œ ้•ทใ„ใ‚‚ ใ‚ใ•ใณ
ใƒ”ใƒผใƒžใƒณใฎใ˜ใ‚ƒใ“็‚’ใ‚(๏ผ‘๏ผ•ๅˆ†) ใƒ”ใƒผใƒžใƒณ ้›‘้ญš ้ก†็ฒ’ๅ’Œ้ขจใ ใ—
ใชใ™ใจ่ฑš่‚‰ใฎใ”ใพใฟใไธผ(20ๅˆ†) ใชใ™ ไธผ ใƒ”ใƒผใƒžใƒณ
ใƒ”ใƒช่พ›่ฑ†่…ใ‚นใƒ†ใƒผใ‚ญ(30ๅˆ†) ่ฑ†่… ใ—ใ‚‡ใ†ใŒ ็™ฝใƒใ‚ฎ
็™ฝ่œใจใƒใƒ ใฎ้’ใ˜ใใ‚ตใƒฉใƒ€(20ๅˆ†) ็™ฝ่œ ๅคง่‘‰ ใƒใƒ 
้ฎญใฎใ‚ทใƒฃใƒชใ‚ขใƒ”ใƒณใ‚ฝใƒผใ‚นใŒใ‘(30ๅˆ†) ้ฎญ ใซใ‚“ใซใ ใ‚ฝใƒผใ‚น
็™ฝ่œใฎใ•ใฃใฑใ‚Šใ‚ตใƒฉใƒ€(15ๅˆ†) ็™ฝ่œ ใใ‚…ใ†ใ‚Š ใ‚ตใƒฉใƒ€
ใ‹ใถใจ่‚‰ๅ›ฃๅญใฎ็…ฎ็‰ฉ(30ๅˆ†) ใ—ใ‚‡ใ†ใŒ ้ถใƒŸใƒณใƒ ็‰‡ๆ —็ฒ‰
ใ”ใผใ†ใฎๆข…ใŠใ‹ใ‹็…ฎ(๏ผ”๏ผ•ๅˆ†) ใ”ใผใ† ใ‹ใคใŠ็ฏ€ ๅœงๅŠ›้‹
ๅˆ‡ใ‚Šๅนฒใ—ๅคงๆ นใจใปใ†ใ‚Œใ‚“่‰ใฎๅ’Œใˆ็‰ฉ(20ๅˆ†(ๆฐดใซๆˆปใ™ๆ™‚้–“ใฏ้™คใ)) ใปใ†ใ‚Œใ‚“่‰ ๅˆ‡ใ‚Šๅนฒใ—ๅคงๆ น ็†ฑๆนฏ
ใ‹ใผใกใ‚ƒใจๆšใ’ใฎ็…ฎ็‰ฉ(20ๅˆ†) ใ‹ใผใกใ‚ƒ ๆฒนๆšใ’ ๆšใ’
ใ•ใคใพใ„ใ‚‚ใฎใƒฌใƒขใƒณ็…ฎ(30ๅˆ†) ใ•ใคใพใ„ใ‚‚ ใƒฌใƒขใƒณๆฑ ใƒฌใƒขใƒณ
่œใฎ่Šฑใฎ่พ›ๅญๅ’Œใˆ(15ๅˆ†) ่œใฎ่Šฑ ็ทดใ‚Šใ‹ใ‚‰ใ— ้•ทใ•
ใ‹ใผใกใ‚ƒใจใ“ใ‚“ใซใ‚ƒใใฎ็…ฎ็‰ฉ(30ๅˆ†) ใ“ใ‚“ใซใ‚ƒใ ใ‹ใผใกใ‚ƒ ็†ฑๆนฏ
ใ‚†ใšๅ…ฅใ‚Šๆนฏ่ฑ†่…(๏ผ‘ๆ™‚้–“) ่ฑ†่… ๆ˜ฅ่Š ๅฅฝใฟ
ๅคงๆ นใจๅŽšๆšใ’ใฎ็…ฎ็‰ฉ(๏ผ–๏ผๅˆ†) ๅŽšๆšใ’ ๅคงๆ น ๅฝฉใ‚Š
ๅฐๆพ่œใŽใ‚‡ใ†ใ–(45ๅˆ†) ๅฐๆพ่œ ใซใ‚“ใซใ ใ—ใ‚‡ใ†ใŒ
ๆฐด่œใจๆฒนๆšใ’ใฎ็…ฎใณใŸใ—(15ๅˆ†) ๆฒนๆšใ’ ๆฐด่œ ้ฃŸๆ„Ÿ
ใตใ‚ใตใๅคงๆ น(๏ผ“๏ผๅˆ†ไปฅไธŠ) ๅคงๆ น ๅ‘ณๅ™Œ ใ„ใ‚Šใ”ใพ
ๆ˜ฅ่Šใฎ็™ฝๅ’Œใˆ(๏ผ‘๏ผ•ๅˆ†) ๆ˜ฅ่Š ่ฑ†่… ็™ฝๅ’Œใˆ
ใชใ™ใฎใƒ›ใ‚คใƒซ็„ผใ(15ๅˆ†) ใชใ™ ็”Ÿๅงœ ใƒ›ใ‚คใƒซ
ใˆใณใจใƒ‹ใƒฉใฎไธญ่ฏ้ขจๅต็‚’ใ‚(30ๅˆ†) ็Ž‰ใญใŽ ใƒ‹ใƒฉ ใˆใณ
ใ—ใ—ใ‚ƒใ‚‚ใฎๅ—่›ฎๆผฌใ‘(๏ผ“๏ผๅˆ†) ใ—ใ—ใ‚ƒใ‚‚ ๅ—่›ฎๆผฌใ‘ ใƒ”ใƒผใƒžใƒณ
ๅ…ซๅฎ่œ(๏ผ“๏ผๅˆ†) ่ฑš่‚‰ ็™ฝ่œ ็Ž‰ใญใŽ
ใƒ–ใƒญใƒƒใ‚ณใƒชใƒผใฎใ‚ใ•ใƒžใƒจๅ’Œใˆ(๏ผ‘๏ผ•ๅˆ†) ใƒ–ใƒญใƒƒใ‚ณใƒชใƒผ ้ฃŸๆ„Ÿ ใ‚ใ•ใณ
้ถใฎใ™ใ็…ฎ(30ๅˆ†) ้ถ่‚‰ ้ถใ‚‚ใ‚‚่‚‰ ใ—ใ„ใŸใ‘
้‡Œ่Š‹ใฎๆข…ใŠใ‹ใ‹ๅ’Œใˆ(35ๅˆ†) ้‡Œ่Š‹ ๆข…ๅนฒใ— ใ‹ใคใŠ็ฏ€
ใƒ–ใƒญใƒƒใ‚ณใƒชใƒผใฎ็ฃฏๅ’Œใˆ(15ๅˆ†) ใƒ–ใƒญใƒƒใ‚ณใƒชใƒผ ๅ‡บๆฑ้†คๆฒน ็„ผใๆตท่‹”
็„ผใ้ณฅไธผ(20ๅˆ†) ้ถ่‚‰ ้ถใ‚‚ใ‚‚่‚‰ ็™ฝใƒใ‚ฎ
ใปใ†ใ‚Œใ‚“่‰ใฎใŠๆตธใ—(10ๅˆ†) ใ‹ใคใŠ็ฏ€ ใปใ†ใ‚Œใ‚“่‰ 10ๅˆ†
ใ•ใ‚“ใพใฎๆข…ใ—ใใƒญใƒผใƒซ(45ๅˆ†) ็‰‡ๆ —็ฒ‰ ใ•ใ‚“ใพ ๅคง่‘‰
ใใ‚…ใ†ใ‚ŠใจใƒˆใƒžใƒˆใฎๅœŸไฝ้…ขๅ’Œใˆ(๏ผ“๏ผๅˆ†) ใƒˆใƒžใƒˆ ใใ‚…ใ†ใ‚Š ใ‹ใคใŠ็ฏ€
ใ•ใฐใฎๅ‘ณๅ™Œ็…ฎ(30ๅˆ†) ใ•ใฐ ๅ‘ณๅ™Œ ใ—ใ‚‡ใ†ใŒ
ใ‚จใƒชใƒณใ‚ฎใฎใƒใ‚ฟใƒผ็‚’ใ‚(15ๅˆ†) ใ‚จใƒชใƒณใ‚ฎ ใƒใ‚ฟใƒผ ใ‚จใƒชใƒณใ‚ฎ
ใ•ใคใพใ„ใ‚‚ใจใ‚ฏใƒชใƒผใƒ ใƒใƒผใ‚บใฎใ‚ตใƒฉใƒ€(๏ผ’0ๅˆ†) ใ•ใคใพใ„ใ‚‚ ใƒžใƒจใƒใƒผใ‚บ ๅกฉใ‚ณใ‚ทใƒงใ‚ฆ
่–„ๆšใ’ใฎ็ด่ฑ†ใ‚ญใƒ ใƒ่ฉฐใ‚(15ๅˆ†) ใ‚ญใƒ ใƒ ็ด่ฑ† ้•ทใƒใ‚ฎ
้ฎญใฎๅ‘ณๅ™Œใƒจใƒผใ‚ฐใƒซใƒˆๆผฌใ‘(๏ผ‘๏ผ•ๅˆ†(ๆผฌใ‘่พผใ‚€ๆ™‚้–“ใฏ้™คใ)) ๅ‘ณๅ™Œ ้ฎญ ใƒจใƒผใ‚ฐใƒซใƒˆ
ไบ”็›ฎ่ฑ†(๏ผ”๏ผ•ๅˆ†) ใ”ใผใ† ใ‚Œใ‚“ใ“ใ‚“ ใ“ใ‚“ใซใ‚ƒใ
ๆ–ฐ็”Ÿๅงœใจๆฐด่œใฎ่‚‰ๅทปใ(๏ผ“๏ผๅˆ†) ๆ–ฐ็”Ÿๅงœ ๆฐด่œ ่‚‰
ๅฐๆพ่œใจใƒ„ใƒŠใฎๅ’Œใˆ็‰ฉ(๏ผ‘๏ผ•ๅˆ†) ๅฐๆพ่œ ใƒ„ใƒŠ ๆฐดๆฐ—
ๆ‰‹็พฝไธญใจๅคงๆ นใฎ็…ฎ็‰ฉ(๏ผ”๏ผ•ๅˆ†) ๅคงๆ น ๆ‰‹็พฝไธญ ๅผฑ็ซ
ๆ‰‹็พฝๅ…ˆใฎ็…งใ‚Š็„ผใ(60ๅˆ†) ่กจ้ข ๆ‰‹็พฝๅ…ˆ ใซใ‚“ใซใ
ใปใ†ใ‚Œใ‚“่‰ใฎๆข…ๅ’Œใˆ(15ๅˆ†) ใปใ†ใ‚Œใ‚“่‰ ๆข… ๆข…ๅนฒใ—
ใชใ‚ใ“ใŠใ‚ใ—(๏ผ‘๏ผ•ๅˆ†) ใชใ‚ใ“ ๅคง่‘‰ ใ‹ใคใŠ็ฏ€
็ฐกๅ˜ใ‚ฟใƒณใƒ‰ใƒชใƒผใƒใ‚ญใƒณ(๏ผ‘ๆ™‚้–“ไปฅไธŠ) 1ๆ™‚้–“ ๅกฉใ‚ณใ‚ทใƒงใ‚ฆ ใ‚ฟใƒณใƒ‰ใƒชใƒผใƒใ‚ญใƒณ
ใ‚ใ•ใ‚Šใฎ้…’่’ธใ—(15ๅˆ†) ใ‚ใ•ใ‚Š ใซใ‚“ใซใ ใฟใ˜ใ‚“ๅˆ‡ใ‚Š
ใƒ”ใƒผใƒžใƒณใฎ่‚‰่ฉฐใ‚(๏ผ“๏ผๅˆ†) ็Ž‰ใญใŽ ใƒ”ใƒผใƒžใƒณ ่‚‰
ใกใใ‚ใฎ็ฃฏ่พบๆšใ’(15ๅˆ†) ็ซน่ผช ้’ใฎใ‚Š ่กฃ
้•ทใ„ใ‚‚ใฎๆข…ๅ’Œใˆ(10ๅˆ†) ้•ทใ„ใ‚‚ ใ‹ใคใŠ็ฏ€ ๆข…ๅนฒใ—
ๆฐด่œใจใ‚ขใƒœใ‚ซใƒ‰ใฎใ‚ตใƒฉใƒ€(๏ผ‘๏ผ•ๅˆ†) ใ‚ขใƒœใ‚ซใƒ‰ ๆฐด่œ ่ฑ†่…
้…ข้ถ(20ๅˆ†) ้ถ่‚‰ ้ถใŒใ‚‰ใ‚นใƒผใƒ—ใฎ็ด  ไธ€ๅฃ
้ฏ›ใฎ่ฅฟไบฌ็„ผใ(๏ผ‘๏ผ•ๅˆ†(ๆผฌใ‘่พผใ‚€ๆ™‚้–“ใฏ้™คใ)) ้ฏ› ๅ†ท่”ตๅบซ ้ญš
ใใ‚…ใ†ใ‚Šใฎๅกฉๆ˜†ๅธƒๅ’Œใˆ(10ๅˆ†) ใใ‚…ใ†ใ‚Š ๅกฉๆ˜†ๅธƒ ไนฑๅˆ‡ใ‚Š
ใชใ™ใฎ็…ฎใณใŸใ—(20ๅˆ†) ใชใ™ ใ—ใ‚‡ใ†ใŒ ไฝœใ‚Šๆ–น
ใ”ใผใ†ใจไบบๅ‚ใฎ่‚‰ๅทปใ(30ๅˆ†) ใ”ใผใ† ่‚‰ ใซใ‚“ใซใ
ๅคงๆ นใƒป้‡Œ่Š‹ใƒปใ‚คใ‚ซใฎ็…ฎ็‰ฉ(40ๅˆ†) ใ‚คใ‚ซ ๅคงๆ น ้‡Œ่Š‹
ๅ›ž้‹่‚‰(30ๅˆ†) ่ฑš่‚‰ ใซใ‚“ใซใ ็‰‡ๆ —็ฒ‰
ใปใ†ใ‚Œใ‚“่‰ใจๅนฒใ—ใˆใณใฎใ‚ดใƒžๅ’Œใˆ(๏ผ‘๏ผ•ๅˆ†) ใปใ†ใ‚Œใ‚“่‰ ๅนฒใ—ใ‚จใƒ“ ๅนฒใ—ใˆใณ
้‡Œ่Š‹ใฎใใผใ‚็…ฎ(๏ผ“๏ผๅˆ†) ้‡Œ่Š‹ ็‰‡ๆ —็ฒ‰ ้ถใƒŸใƒณใƒ
ไธ‰ๅบฆ่ฑ†ใจไบบๅ‚ใฎใŠใ‹ใ‹ๅ’Œใˆ(๏ผ‘๏ผๅˆ†) ไธ‰ๅบฆ่ฑ† ๆนฏ ๅ‡บๆฑ้†คๆฒน
ไธญ่ฏไธผ(30ๅˆ†) ใƒใƒณใ‚ฒใƒณ่œ ใ—ใ‚ใ˜ ่ฑš่‚‰
ใใ‚…ใ†ใ‚ŠใจใŸใ“ใฎ้…ขใฎ็‰ฉ(20ๅˆ†) ใใ‚…ใ†ใ‚Š ใŸใ“ ใ‚ใ‹ใ‚
ๆ–ฐ็Ž‰ใญใŽใฎใ‚ณใƒณใ‚ฝใƒก็…ฎ่พผใฟ(45ๅˆ†) ็‰‡ๆ —็ฒ‰ ้ถใƒŸใƒณใƒ ๆ–ฐ็Ž‰ใญใŽ
ใ‚Œใ‚“ใ“ใ‚“ใฎใใ‚“ใดใ‚‰(๏ผ‘๏ผ•ๅˆ†) ใ‚Œใ‚“ใ“ใ‚“ ใ„ใ‚Šใ”ใพ ไธญ็ซ
้‡Ž่œใŸใฃใทใ‚Š็‰›ไธผ(20ๅˆ†) ็Ž‰ใญใŽ ใƒ‹ใƒฉ ใ—ใ‚ใ˜
ใƒ›ใ‚ฟใƒ†ใจใƒใƒณใ‚ฒใƒณ่œใฎใ‚ฏใƒชใƒผใƒ ็…ฎ(๏ผ’๏ผๅˆ†) ็‰‡ๆ —็ฒ‰ ใซใ‚“ใซใ ใƒใƒณใ‚ฒใƒณ่œ
ใปใ†ใ‚Œใ‚“่‰ใจใ”ใผใ†ใฎ็™ฝๅ’Œใˆ(60ๅˆ†) ใ”ใผใ† ่ฑ†่… ใปใ†ใ‚Œใ‚“่‰
ใ•ใ‚“ใพใฎ่’ฒ็„ผใ(๏ผ“๏ผๅˆ†) ใ•ใ‚“ใพ ใ”ใพ ๅคง่‘‰
ใฒใ˜ใใฎ็‚’ใ‚็…ฎ(๏ผ–๏ผๅˆ†) ใฒใ˜ใ ๆฒนๆšใ’ ๅคง่ฑ†
ใ‚ชใ‚ฏใƒฉใฎ็ด่ฑ†ๅ’Œใˆ(๏ผ‘๏ผๅˆ†) ใ‹ใคใŠ็ฏ€ ใ‚ชใ‚ฏใƒฉ ็ด่ฑ†
ใ˜ใ‚ƒใ“ใฎใ‚ตใƒฉใƒ€(๏ผ‘๏ผๅˆ†) ็ธฎ็ทฌ้›‘้ญš ่ฒๅ‰ฒใ‚Œๅคงๆ น ๆฐด่œ
้‡Œ่Š‹ใฎใƒ›ใƒƒใƒˆใ‚ตใƒฉใƒ€(45ๅˆ†) ้‡Œ่Š‹ ใปใ†ใ‚Œใ‚“่‰ ใƒ™ใƒผใ‚ณใƒณ
ใ‹ใผใกใ‚ƒใฎใ‚ตใƒฉใƒ€(๏ผ‘๏ผ•ๅˆ†) ใ‹ใผใกใ‚ƒ ใƒจใƒผใ‚ฐใƒซใƒˆ ใใ‚…ใ†ใ‚Š
่ฑ†่…ใฎใใฎใ“ใ‚ใ‚“ใ‹ใ‘(๏ผ‘๏ผๅˆ†) ่ฑ†่… ใ—ใ‚ใ˜ ใˆใฎใ
ๆ˜ฅๅทปใ(60ๅˆ†) ใ—ใ‚‡ใ†ใŒ ๆ˜ฅ้›จ ใƒ‹ใƒฉ
ใ‚Œใ‚“ใ“ใ‚“ใฎใฏใ•ใฟ็„ผใ(๏ผ“๏ผๅˆ†) ใ‚Œใ‚“ใ“ใ‚“ ใ—ใ‚‡ใ†ใŒ ้ถใƒŸใƒณใƒ
้ซ˜้‡Ž่ฑ†่…ใฎๅซใ‚็…ฎ(30ๅˆ†) ้ซ˜้‡Ž่ฑ†่… ็ซนไธฒ ๆฐดๆฐ—
่ฑšใƒŸใƒณใƒใจ็™ฝ่œใฎ็‚’ใ‚็‰ฉ(15ๅˆ†) ๆ˜ฅ้›จ ็™ฝ่œ ใซใ‚“ใซใ
ใ„ใ‚ใ—ใฎใ•ใฃใฑใ‚Š็…ฎ(๏ผ”๏ผ•ๅˆ†) ใ„ใ‚ใ— ใ—ใ‚‡ใ†ใŒ ้•ทใƒใ‚ฎ
ใ‚Œใ‚“ใ“ใ‚“ใฎใ‚ซใƒฌใƒผ็‚’ใ‚(๏ผ‘๏ผ•ๅˆ†) ใ‚Œใ‚“ใ“ใ‚“ OLIVE OIL ใ‚ซใƒฌใƒผ็ฒ‰
ใ•ใ•ใฟใฎไธญ่ฏ้ขจใ‚ตใƒฉใƒ€(25ๅˆ†) ใ•ใ•ใฟ ใ‚‚ใ‚„ใ— ใใ‚…ใ†ใ‚Š
่Œ„ๅญใจ่ฑš่‚‰ใฎใƒ”ใƒช่พ›ๅ‘ณๅ™Œ็‚’ใ‚(30ๅˆ†) ่ฑš่‚‰ ่Œ„ๅญ ่ฑ†ๆฟ้†ค
ใ•ใ•ใฟใฎใ‹ใ‚‰ๆšใ’(30ๅˆ†) ใ•ใ•ใฟ ใซใ‚“ใซใ ใ—ใ‚‡ใ†ใŒ

Call for ideas

What do you want to do with this tool?
If there is a need, it may be addressed in a future update.
We look forward to your comments.

Top comments (0)

Timeless DEV post...

How to write a kickass README

Arguably the single most important piece of documentation for any open source project is the README. A good README not only informs people what the project does and who it is for but also how they use and contribute to it.

If you write a README without sufficient explanation of what your project does or how people can use it then it pretty much defeats the purpose of being open source as other developers are less likely to engage with or contribute towards it.