シェルスクリプトマガジン

test

ユニケージ通信(Vol.86掲載)

投稿日:2023.09.25 | カテゴリー: コード

著者:田渕 智也、高橋 未来哉

業務システム開発手法の「ユニケージ」では、データベース管理システムやフレームワークなどを使わずにシステムを構築します。システムの中身が見えやすい分、仕組みやルールを理解していないと正しい開発ができません。第5回は、排他制御について紹介します。

シェルスクリプトマガジン Vol.86は以下のリンク先でご購入できます。

図2 ulockコマンド

#!/bin/bash

if ulock lock; then

  ここに読み書きなどの処理を記述する

  rm -rf lock

香川大学SLPからお届け!(Vol.86掲載)

投稿日:2023.09.25 | カテゴリー: コード

著者:石上 椋一

今回は、私が開発した文章校正用のWebアプリケーションについて紹介します。文章校正機能は「textlint」というNode.js上で稼働するアプリケーションを使って実現しているため、少ないコード量で実装できました。米Google社のアプリケーション開発プラットフォーム「Firebase」を利用したユーザー認証機能を付加する方法も解説します。

シェルスクリプトマガジン Vol.86は以下のリンク先でご購入できます。

図1 テンプレートファイル「index.html」に記述するコード

<!doctype html>
<html lang="ja">
  <head>
    <title>文章校正アプリ</title>
  </head>
  <body>
    <h1>こんにちは!文章校正アプリです</h1>
    <h2>PDFファイルアップローダー</h2>
    <form action="/result" method="POST" enctype="multipart/form-data">
      <input type=file name="pdf_file">
      <button>ファイル送信</button>
    </form>
  </body>
</html>

図2 テンプレートファイル「result.html」に記述するコード

<!doctype html>
<html lang="ja">
  <head>
    <title>文章校正アプリ 結果表示</title>
  </head>
  <body>
    <h1>こんにちは!文章校閲アプリです</h1>
    <h2>PDFファイルアップローダー</h2>
    <form action="/result" method="POST" enctype="multipart/form-data">
      <input type=file name="pdf_file">
      <button>ファイル送信</button>
    </form>
    <table border="1">
      <thead>
        <tr>
          <th>何行目</th>
          <th>何文字目</th>
          <th>修正内容</th>
        </tr>
      </thead>
      <tbody>
        {% for result in result_table %}
        <tr>
          <td>{{result[0]}}</td>
          <td>{{result[1]}}</td>
          <td>{{result[2]}}</td>                    
        </tr>
        {% endfor %}
      </tbody>
    </table>
    <br>
    <p>修正した文章</p>
    <textarea rows="10" cols="80">{{result_text}}</textarea>
  </body>
</html>

図3 「web_app.py」ファイルに記述するコード

from flask import Flask, request, render_template, \
                  redirect, url_for, session
import subprocess
import re

app = Flask(__name__)
def upload_pdf_file(pdf_file):
  pdf_file.save("uploads/target.pdf")
def run_pdf2text():
  cmd = "pdftotext -nopgbrk uploads/target.pdf uploads/target.md"
  subprocess.run(cmd, shell=True, capture_output=True, text=True)
def run_textlint_and_get_result_list():
  cmd = "npx textlint uploads/target.md"
  result = subprocess.run(cmd, shell=True,
                          capture_output=True, text=True)
  result_list = result.stdout.split("\n")
  result_table = []
  for result in result_list[2:-4]:
    tmp_result = result.split(" error ")
    if len(tmp_result) >= 2:
      row = int(tmp_result[0].split(":")[0].strip())
      colum = tmp_result[0].split(":")[1].strip()
      error_data = re.sub("ja-technical-writing/[a-z | -]*",
                          "",tmp_result[1]).strip()
      result_table.append([row, colum, error_data])
  return result_table
def run_textlint_fix_data():
  cmd = "npx textlint --fix ./uploads/target.md"
  subprocess.run(cmd, shell=True, capture_output=True, text=True)
  with open("./uploads/target.md", ) as md_file:
    data_lines = md_file.read()
  return data_lines
@app.route("/index", methods=["GET"])
def index():
  return render_template("index.html")
@app.route("/", methods=["GET"])
def root():
  return redirect(url_for("index"))
@app.route("/result", methods=["GET", "POST"])
def result():
  if request.method == "POST":
    pdf_file = request.files["pdf_file"]
    upload_pdf_file(pdf_file)
    run_pdf2text()
    result_table = run_textlint_and_get_result_list()
    result_text = run_textlint_fix_data()
    return render_template("result.html",
                           result_table=result_table,
                           result_text=result_text)
  return redirect(url_for('index'))

if __name__ == "__main__":
  app.debug = True
  app.run(host='0.0.0.0', port=5000)

図4 「.textlintrc.json」ファイルに記述する設定の例

{
  "rules": {
    "preset-ja-technical-writing": {
      "sentence-length": {
        "max": 100
      },
      "max-comma": {
        "max": 4
      },
      "max-ten": {
        "max": 4
      },
      "max-kanji-continuous-len": {
        "max": 7,
        "allow": []
      },
      "arabic-kanji-numbers": true,
      "no-mix-dearu-desumasu": {
        "preferInHeader": "",
        "preferInBody": "である",
        "preferInList": "である",
        "strict": true
      },
      "ja-no-mixed-period": {
        "periodMark": "。"
      },
      "no-double-negative-ja": true,
      "no-dropping-the-ra": true,
      "no-doubled-conjunctive-particle-ga": true,
      "no-doubled-conjunction": true,
      "no-doubled-joshi": {
        "min_interval": 1
      },
      "no-invalid-control-character": true,
      "no-zero-width-spaces": true,
      "no-exclamation-question-mark": true,
      "no-hankaku-kana": true,
      "ja-no-weak-phrase": true,
      "ja-no-successive-word": true,
      "ja-no-abusage": true,
      "ja-no-redundant-expression": true,
      "ja-unnatural-alphabet": true,
      "no-unmatched-pair": true
    }
  }
}

図10 「~/webapp/static/json/firebase.json」ファイルに記述する設定の例

{
  "apiKey": "AIzaSyA1LQooSfvSda0jkBQl20ZfGR6lHOC5XBw",
  "authDomain": "test-1d03e.firebaseapp.com",
  "databaseURL": "https://test-1d03e-default-rtdb.firebaseio.com",
  "projectId": "test-1d03e",
  "storageBucket": "test-1d03e.appspot.com",
  "messagingSenderId": "919322583901",
  "appId": "1:919322583901:web:abb5d744e9ed04b8927eb4"
}

図11 テンプレートファイル「create_account.html」に記述するコード

<!doctype html>
<html lang="ja">
  <head>
    <title>文章校正アプリ アカウント作成ページ</title>
  </head>
  <body>
    <form class="login-form" action='/create_account' method='POST'>
      <input type="text" name="email" placeholder="email address"/>
      <input type="password" name="password" placeholder="password"/>
      <button>Create an account</button>
      <p>{{msg}}</p>
      <p>Already registered?
        <a href="/login">Login</a>
      </p>
    </form>
  </body>
</html>

図12 テンプレートファイル「login.html」に記述するコード

<!doctype html>
<html lang="ja">
  <head>
    <title>文章校正アプリ ログインページ</title>
  </head>
  <body>
    <form class="login-form" action="/login" method="POST">
      <input type="text" name="email" placeholder="email address"/>
      <input type="password" name="password" placeholder="password"/>
      <button>Login</button>
      <p>{{msg}}</p>
      <p>Not registered?
        <a href="/create_account">Create an account</a>
      </p>
    </form>
  </body>
</html>

図13 「web_app.py」ファイルの「app = Flask(name)」行の前後に追加するコード

import os, json
import pyrebase

app = Flask(__name__)
app.config["SECRET_KEY"] = os.urandom(24)
with open("static/json/firebase.json") as f:
  firebaseConfig = json.loads(f.read())
firebase = pyrebase.initialize_app(firebaseConfig)
auth = firebase.auth()

図14 「web_app.py」ファイルの既存のルーティング設定にコードを追加

(略)
@app.route("/index", methods=["GET"])
def index():
  if session.get("usr") == None:
    return redirect(url_for("login"))
  return render_template("index.html")
@app.route("/", methods=["GET"])
def root():
  return redirect(url_for("index"))
@app.route("/result", methods=["GET", "POST"])
def result():
  if session.get("usr") == None:
    return redirect(url_for("login"))
  if request.method == "POST":
    pdf_file = request.files["pdf_file"]
(略)

図15 「web_app.py」ファイルにルーティング設定を追加

@app.route("/login", methods=["GET", "POST"])
def login():
  if request.method == "GET":
    return render_template("login.html", msg="")
  email = request.form["email"]
  password = request.form["password"]
  try:
    auth.sign_in_with_email_and_password(email, password)
    session["usr"] = email
    return redirect(url_for("index"))
  except:
    message = "メールアドレスまたはパスワードが違います"
    return render_template("login.html", msg=message)
@app.route("/create_account", methods=["GET", "POST"])
def create_account():
  if request.method == "GET":
    return render_template("create_account.html", msg="")
  email = request.form["email"]
  password = request.form["password"]
  try:
    auth.create_user_with_email_and_password(email, password)
    session["usr"] = email
    return redirect(url_for("index"))
  except:
    message = "アカウントを作成できませんでした"
    return render_template("login.html", msg=message)
@app.route('/logout')
def logout():
  del session["usr"]
  return redirect(url_for("login"))

Pythonあれこれ(Vol.86掲載)

投稿日:2023.09.25 | カテゴリー: コード

著者:飯尾 淳

本連載では「Pythonを昔から使っているものの、それほど使いこなしてはいない」という筆者が、いろいろな日常業務をPythonで処理することで、立派な「蛇使い」に育つことを目指します。その過程を温
かく見守ってください。皆さんと共に勉強していきましょう。第16回では、データを永続的に残す「永続化」の手法の一つとして、Pythonプログラムからデータベースにアクセスする方法について解説します。

シェルスクリプトマガジン Vol.86は以下のリンク先でご購入できます。

図3 データベースにテーブルを作成してデータを格納するコード

from sqlalchemy import text
with engine.connect() as conn:
  conn.execute(text("CREATE TABLE a_table (id int, name string)"))
  conn.execute(
    text("INSERT INTO a_table (id, name) VALUES (:id, :name)"),
         [{"id":1, "name":"John"}, {"id":2, "name":"Bob"}],
    )
  conn.commit()

図5 テーブルのデータを読み出すコード

with engine.connect() as conn:
  result = conn.execute(text("SELECT * FROM a_table"))
  for record in result:
    print(f"id: {record.id}, name: {record.name}")

図6 commit()を忘れたコードの例

with engine.connect() as conn:
  conn.execute(
    text("INSERT INTO a_table (id, name) VALUES (:id, :name)"),
         [{"id":3, "name":"Kate"}, {"id":4, "name":"Bob"}],
    )
  conn.commit()

図8 データベースに含まれるテーブルを表示するコード

from sqlalchemy import create_engine
engine = create_engine("sqlite:///:memory:", echo=True)
with engine.connect() as conn:
  result = conn.execute(
             text("SELECT name FROM sqlite_master WHERE type='table'")
           )
  for record in result:
    print(record)

図9 ファイル内にデータベースを作成するコード

from sqlalchemy import create_engine, text
engine = create_engine("sqlite:///db.sqlite3")
with engine.connect() as conn:
  conn.execute(text("CREATE TABLE a_table (id int, name string)"))
  conn.execute(
    text("INSERT INTO a_table (id, name) VALUES (:id, :name)"),
         [{"id": 1, "name": "John"}, {"id": 2, "name": "Bob"}],
  )
  conn.commit()

図10 ファイル内データベースのテーブルからデータを読み出すコード

from sqlalchemy import create_engine, text
engine = create_engine("sqlite:///db.sqlite3")
with engine.connect() as conn:
  result = conn.execute(text("SELECT * FROM a_table"))
  for record in result:
    print(f"id: {record.id}, name: {record.name}")

Raspberry Pi Pico W/WHで始める電子工作(Vol.86掲載)

投稿日:2023.09.25 | カテゴリー: コード

著者:米田 聡

本連載では、人気のマイコンボード「Raspberry Pi Pico W」を活用していきます。同ボードは、無線LANやBluetoothの通信機能を搭載し、入手しやすく価格も手頃なので、IoT機器を自作するのに最適なハードウエアです。第2回は、有機ELディスプレイを取り付けます。

シェルスクリプトマガジン Vol.86は以下のリンク先でご購入できます。

図6 SSD1306搭載有機ELディスプレイを動作させるサンプルプログラム(ssd1306_sample.py)

from machine import I2C
from ssd1306 import SSD1306_I2C
import network

i2c = I2C(0)
ssd = SSD1306_I2C(width=128, height=32, i2c=i2c, addr=0x3C)

ssd.fill(0)             # 0クリア
ssd.text("Hello, world", 0, 0)
# IPアドレスを描画
conn = network.WLAN(network.STA_IF)
if conn.isconnected():
    conf = conn.ifconfig()
    ssd.text(conf[0], 0, 8)
ssd.show()              # フレームバッファをSSD1306に転送

特集1 COBOL入門(Vol.86記載)

投稿日:2023.09.25 | カテゴリー: コード

著者:比毛 寛之

レガシー問題や技術者不足などで話題の多いプログラミング言語が「COBOL」です 。古い言語というイメージがありますが、ISOから2023年の新規格が公表されたことでも分かるように、現在も進化を続けています。本特集では、COBOLの現状を紹介しつつ、「opensource COBOL 4J」というオープンソースソフトウエアのCOBOLコンパイラを使ってCOBOL言語の基本を解説します。

シェルスクリプトマガジン Vol.86は以下のリンク先でご購入できます。

図1 「HELLO WORLD!」という文字列を表示するCOBOLのサンプルコード

----+----1----+----2----+----3----+----4----+----5
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLOWORLD.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  MY-TEXT PIC X(20).
       PROCEDURE DIVISION.
       MAIN-RTN.
           MOVE "HELLO WORLD!" TO MY-TEXT.
           DISPLAY MY-TEXT.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5

図4 COBOLのサンプルコード

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
       IDENTIFICATION DIVISION.
       PROGRAM-ID. MYCOBOL.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  MY-GRP.
      *    03  MY-WORK-X     PIC X(10).                                 20230804
           03  MY-WORK-X2    PIC X(10).                                 20230804
           03  MY-WORK-9     PIC 9(05).
      ********************************************
       PROCEDURE DIVISION.
      ********************************************
       PROC1 SECTION.
       PROC1-000.
      *    MOVE "ABC" TO MY-WORK-X.                                     20230804
           MOVE "DEF" TO MY-WORK-X2.                                    20230804
           MOVE 100   TO MY-WORK-9.
       PROC1-900.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8

図5 コンソールからの入力と画面への出力をするサンプルコード

----+----1----+----2----+----3----+----4----+----5----+
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  MY-NAME PIC X(20).
       PROCEDURE DIVISION.
       MAIN-RTN.
           DISPLAY "Enter your name: " NO ADVANCING.
           ACCEPT  MY-NAME.
           DISPLAY "Hello " MY-NAME.
       MAIN-EXIT.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+

図6 ファイルにデータを出力するサンプルコード

----+----1----+----2----+----3----+----4----+----5----+----6----+----7
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EMPWRITE.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMP-FILE ASSIGN TO "EMPFILE"
                  ORGANIZATION IS INDEXED
                  ACCESS MODE  IS  DYNAMIC
                  RECORD KEY   IS  EMP-CD
                  FILE STATUS  IS  EMP-STS.
       DATA DIVISION.
       FILE SECTION.
       FD  EMP-FILE.
       01  EMP-REC.
           03  EMP-CD         PIC X(04).
           03  EMP-NAME       PIC X(20).
           03  EMP-DPT-CD     PIC X(02).
           03  EMP-ENT-DATE   PIC 9(08).
       WORKING-STORAGE SECTION.
       01  EMP-STS            PIC  9(02).
       PROCEDURE DIVISION.
       MAIN-CONTROL SECTION.
       MAIN-000.
           DISPLAY "*** Creating Employee file ***".
           OPEN  OUTPUT EMP-FILE.
      *
           MOVE  "0011"            TO   EMP-CD.
           MOVE  "Saitama Saburo"  TO   EMP-NAME.
           MOVE  "01"              TO   EMP-DPT-CD.
           MOVE  20020401          TO   EMP-ENT-DATE.
           WRITE EMP-REC.
      *                        ----+----+----+----+----+----+----+
           WRITE EMP-REC FROM "0012Chiba Jiro          0219990401".
           WRITE EMP-REC FROM "0013Tokyo Taro          0319970401".
           WRITE EMP-REC FROM "0014Kanagawa Shiro      0120120401".
           WRITE EMP-REC FROM "0015Niigata  Goroo      0220010401".
      *                        ----+----+----+----+----+----+----+
           CLOSE EMP-FILE.
       MAIN-900.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+----6----+----7

図7 ファイル中のレコードを読み出して画面に表示するサンプルコード

----+----1----+----2----+----3----+----4----+----5----+----6----+
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EMPLIST.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMP-FILE ASSIGN TO "EMPFILE"
                  ORGANIZATION IS INDEXED
                  ACCESS MODE  IS  DYNAMIC
                  RECORD KEY   IS  EMP-CD
                  FILE STATUS  IS  EMP-STS.
       DATA DIVISION.
       FILE SECTION.
       FD  EMP-FILE.
       01  EMP-REC.
           03  EMP-CD         PIC X(04).
           03  EMP-NAME       PIC X(20).
           03  EMP-DPT-CD     PIC X(02).
           03  EMP-ENT-DATE   PIC 9(08).
       WORKING-STORAGE SECTION.
       01  EMP-STS            PIC 9(02).
       01  DSP-REC.
           03  DSP-CD         PIC X(04).
           03  FILLER         PIC X.
           03  DSP-NAME       PIC X(20).
           03  FILLER         PIC XX.
           03  DSP-DPT-CD     PIC X(02).
           03  FILLER         PIC X.
           03  DSP-ENT-DATE   PIC 9999/99/99.
       PROCEDURE DIVISION.
       MAIN-CONTROL SECTION.
       MAIN-000.
           OPEN  INPUT EMP-FILE.
           DISPLAY "*** Employee List ***".
           DISPLAY "ID   Employee Name        Dpt Enter date".
           DISPLAY "---- -------------------- --- ----------".
           PERFORM UNTIL (EMP-STS NOT = ZERO)
             READ EMP-FILE NEXT
               AT END
                  DISPLAY "EOF"
               NOT AT END
                  MOVE   EMP-CD         TO   DSP-CD
                  MOVE   EMP-NAME       TO   DSP-NAME
                  MOVE   EMP-DPT-CD     TO   DSP-DPT-CD
                  MOVE   EMP-ENT-DATE   TO   DSP-ENT-DATE
                  DISPLAY DSP-REC
             END-READ
           END-PERFORM.
           CLOSE EMP-FILE.
       MAIN-900.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+----6----+

図9 「EMPSEARCH.cbl」ファイルに記述するコード

----+----1----+----2----+----3----+----4----+----5----+----6----+-
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EMPSEARCH.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WK-AREA.
         03  WK-CD        PIC X(04).
         03  WK-NAME      PIC X(20).
         03  WK-DPT-CD    PIC X(02).
         03  WK-ENT-DATE  PIC 9(08).
         03  WK-RETURN    PIC 9(01).
       PROCEDURE DIVISION.
       MAIN-RTN.
           DISPLAY "*** Employee Search ***".
           DISPLAY "Code:     : " NO ADVANCING.
           ACCEPT  WK-CD.
           CALL   "EMPREAD" USING WK-CD, WK-NAME, WK-DPT-CD,
                                  WK-ENT-DATE, WK-RETURN.
           IF WK-RETURN = ZERO
              DISPLAY "Name      : " WK-NAME
              DISPLAY "Dept code : " WK-DPT-CD
              DISPLAY "Enter date: " WK-ENT-DATE
           ELSE
              DISPLAY "Employee not found!"
           END-IF.
       MAIN-EXIT.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+----6----+-

図10 「EMPREAD.cbl」ファイルに記述するコード

----+----1----+----2----+----3----+----4----+----5----+----6----+----7
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EMPREAD.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMP-FILE ASSIGN TO "EMPFILE"
                  ORGANIZATION IS INDEXED
                  ACCESS MODE  IS  DYNAMIC
                  RECORD KEY   IS  EMP-CD
                  FILE STATUS  IS  EMP-STS.
       DATA DIVISION.
       FILE SECTION.
       FD  EMP-FILE.
       01  EMP-REC.
           03  EMP-CD         PIC X(04).
           03  EMP-NAME       PIC X(20).
           03  EMP-DPT-CD     PIC X(02).
           03  EMP-ENT-DATE   PIC 9(08).
       WORKING-STORAGE SECTION.
       01  EMP-STS            PIC  9(02).
       LINKAGE SECTION.
       01  LK-CD              PIC X(04).
       01  LK-NAME            PIC X(20).
       01  LK-DPT-CD          PIC X(02).
       01  LK-ENT-DATE        PIC 9(08).
       01  LK-RETURN          PIC 9(01).
       PROCEDURE DIVISION     USING     LK-CD, LK-NAME, LK-DPT-CD,
                                        LK-ENT-DATE, LK-RETURN.
       MAIN-CONTROL SECTION.
       MAIN-000.
           INITIALIZE EMP-REC.
           MOVE  ZERO         TO   LK-RETURN.
           OPEN  INPUT EMP-FILE.
           MOVE  LK-CD        TO   EMP-CD.
           READ  EMP-FILE KEY IS   EMP-CD
             INVALID KEY
                 MOVE  1      TO   LK-RETURN
           END-READ.
           MOVE  EMP-NAME     TO   LK-NAME.
           MOVE  EMP-DPT-CD   TO   LK-DPT-CD.
           MOVE  EMP-ENT-DATE TO   LK-ENT-DATE.
           CLOSE EMP-FILE.
       MAIN-900.
           EXIT PROGRAM.
----+----1----+----2----+----3----+----4----+----5----+----6----+----7

図11 「EmpSearchDemo.java」ファイルに記述するコード

import jp.osscons.opensourcecobol.libcobj.ui.*;

public class EmpSearchDemo {
    public static void main(String[] args) throws Exception {
        EMPREAD prog = new EMPREAD();
        CobolResultSet rs = prog.execute("0011", "", "", 0, 0);
        System.out.println("*** Employee Search from Java ***");
        System.out.println("Code      : " + rs.getString(1));
        System.out.println("Name      : " + rs.getString(2));
        System.out.println("Dept code : " + rs.getString(3));
        System.out.println("Enter date: " + rs.getInt(4));
    }
}

特集1 Markdown入門ガイド(Vol.86記載)

投稿日:2023.09.25 | カテゴリー: コード

著者:藤原 由来

本特集では、文書の装飾や構造付けを手軽に実施できる記法「Markdown」について解説します。Markdownを使うと、テキストファイルでレポートやスライド、書籍などを作成でき、GitHubなどの各種Webサービスでの投稿やコミュニケーションがより便利になります。

シェルスクリプトマガジン Vol.86は以下のリンク先でご購入できます。

図2 Markdownの記述内容

# カレーの作り方

おいしいカレーを作りましょう。

## 材料

- カレールー
- 牛肉
- 野菜
- サラダ油
- 水

図19 Markdownテキストの例

#␣カレーの作り方

おいしいカレーを作りましょう。

##␣材料

-␣カレールー
-␣牛肉
-␣野菜
-␣サラダ油
-␣水

図46 MarpによるスライドのMarkdownテキスト例

---
marp: true
---

# カレーの作り方

おいしいカレーを作りましょう。

---

# 材料

- カレールー
- 牛肉
- 野菜
- サラダ油
- 水

シェルスクリプトマガジンvol.86 Web掲載記事まとめ

投稿日:2023.09.25 | カテゴリー: コード

004 レポート Python in Excelの開発版登場
005 レポート iPhone 15シリーズを発表
006 製品レビュー 電子小物「koko Tag(ココタグ)」
007 NEWS FLASH
008 特集1 Markdown入門ガイド/藤原由来 コード掲載
024 特集2 最新COBOL入門/比毛寛之 コード掲載
034 特別企画 CMSのPlone/酒井忠臣、烈
046 Raspberry Pi Pico W/WHで始める電子工作/米田聡 コード掲載
050 CMS/桑原滝弥、イケヤシロウ
052 Pythonあれこれ/飯尾淳 コード掲載
057 Hello Nogyo!
058 中小企業手作りIT化奮戦記/菅雄一
062 法林浩之のFIGHTING TALKS/法林浩之
064 香川大学SLPからお届け!/石上椋一 コード掲載
072 行動経済学と心理学で円滑に業務を遂行/請園正敏
076 タイ語から分かる現地生活/つじみき
082 Linux定番エディタ入門/大津真
088 ユニケージ通信/田渕智也、高橋未来哉 コード掲載
091 Techパズル/gori.sh
093 コラム「ユニケージアーキテクチャ」/シェル魔人

Vol.86

投稿日:2023.09.25 | カテゴリー: バックナンバー

 多くのエンジニアがドキュメントを書くときによく用いているのが、マークアップ言語「Markdown」です。Markdownでは、テキスト記述によって文書の装飾や構造付けを手軽に行えます。
 特集1では、このMarkdownの書き方を初心者にも分かりやすく紹介します。コードエディタのVisual Studio Code上でMarkdownの記述を試しながら、読み進められます。Markdownの基本から活用法まで、自分のものにしてください。
 特集2では、メインフレームなどのレガシー環境で使われてきたプログラミング言語「COBOL」を解説しています。現在もCOBOL技術者に対する需要はあります。また、オープンソースソフトウエアとしてCOBOLのコンパイラは進化を続けています。業務システムに携わる機会があるエンジニアや、システム部門の人に、この特集2はお薦めです。
 特別企画では、オープンソースのコンテンツ管理システム「Plone」を紹介しています。Ploneは、プログラミング言語のPythonと、コンテンツ管理フレームワークのZopeを用いて開発されています。WordPressのような手軽さよりも大規模サイトで動かすことを目的としたPloneを、この機会に知ってください。
 このほか、レポートでは、表計算ソフトのMicrosoft ExcelでPythonコードを実行可能にする、開発中の「Python in Excel」を紹介しています。
 今回も読み応え十分のシェルスクリプトマガジン Vol.86。お見逃しなく!

※記事掲載のコードはこちら。記事の補足情報はこちら

※読者アンケートはこちら

Vol.86 補足情報

投稿日:2023.09.25 | カテゴリー: コード

訂正・補足情報はありません。
情報は随時更新致します。

  • shell-mag ブログの 2023年9月 のアーカイブを表示しています。

  • -->