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

test

AWKでデジタル信号処理(Vol.79掲載)

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

著者:斉藤 博文

プログラミング言語「AWK」は、データストリーム(データの流れ)を逐次処理するのに適しています。本連載では、電子回路の分野でその特徴を生かし、シェルスクリプトを組み合わせてデジタル信号を処理します。第1回は「デジタルフィルタ」と「リングバッファ」について解説します。

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

図14 1~10000の出力データから末尾の10行を取り出すAWKプログラム(tail.awk)

#! /usr/bin/gawk -f

{
    lines[NR] = $0;
}

END {
    for (i = NR - 9; i <= NR; i++) {
        print lines[i];
    }
}

図15 リングバッファを用いたAWKプログラム(tail_ring.awk)

#! /usr/bin/gawk -f

BEGIN {
    len = 10;
}

{
    idx = NR % 10;
    buf[idx] = $0;
}

END {
    for (i = 9; i >= 0; i--) {
        print get_buf(buf, idx - i, len);
    }
}

function get_buf(buf, idx, len) {
    if (idx < 0) {
        return buf[idx + len];
    } else {
        return buf[idx];
    }
}

図17 「get_buf」関数をPythonのプログラムで記述

def get_buf(buf, idx, len):
    if (idx < 0):
        return buf[idx + len]
    else:
        return buf[idx]

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

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

著者:岩本 和真

人間の言語をコンピュータで処理する自然言語処理の分野は、近年、急速に進歩しています。それによって例えば、自然な翻訳や文章生成をする技術などが開発されています。同分野の学習成果として筆者は、「秘書チャット」と名付けたチャットボットアプリを作成しました。今回は、このアプリに盛り込んだ機能について、技術的に解説します。

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

図5 形態素解析処理をするmorpheme()関数の定義コード

def morpheme(self, input, speech=False):
  input=unicodedata.normalize('NFKC', input)
    if speech:
      speech_list = []
      sentence = self.wakati.parse(input).split()
      node = self.wakati.parseToNode(input)
      while node:
        if node.feature.split(",")[0] != "BOS/EOS":
          speech_list.append(node.feature.split(",")[0])    
        node = node.next
      return sentence, speech_list
    else:
      sentence = self.wakati.parse(input).split()
      return sentence

図8 予定の内容を抽出するcontent_extract()関数の定義コード

def content_extract(self, input_list, speech_list):
  out_list = []
  ban_word = ["覚え", "記憶"]
  pass_word = ["予定", "こと"]
  for i, input in enumerate(input_list):
    if input in ban_word:
      break
    elif input in pass_word:
      continue
    elif input.isdecimal() and \
         input_list[i+1] in self.date_key:
      continue
    elif (input_list[i-1]).isdecimal() and \
         input in self.date_key:
      continue
    elif out_list != [] and speech_list[i-1] == "名詞" and \
         speech_list[i+1] == "名詞" and \
         input_list[i+1] not in pass_word:
      out_list.append(input_list[i])
    elif speech_list[i] == "名詞":
      out_list.append(input)
    else:
      continue
  return ''.join(out_list) 

図9 Webページのテキスト情報を抽出するscraping()関数の定義コード

from bs4 import BeautifulSoup
import requests

def scraping(url, file_path):
  responses = requests.get(url)
  soup = BeautifulSoup(responses.content, 'html.parser')
  text_list = soup.get_text().splitlines()
  text_list = list(set(text_list))
  text_list = [text.replace('\u3000', '') for text in text_list]
  text = '\n'.join(text_list)
  with open(file_path, 'w', encoding='utf_8') as f:
    f.write(text)

図12 曜日や豆知識を答える機能のコード

def week_teach(self, input):
  year = None
  month = None
  day = None
  input = self.date_update.convert(input)
  input_list = self.morpheme(input)
  if "年" in input_list:
    year = self.date_specify("年", input_list)
  else:
    year = self.year
  if "月" in input_list:
    month = self.date_specify("月", input_list)
  else:
    month = self.month
  day = self.date_specify("日", input_list)
  d_key = dt.date(year, month, day)
  week_key = d_key.weekday()
  return year, month, day, self.week_list[week_key]
    
def knowledge_teach(self):
  file_path = "text_data/min_kl.txt"
  with open(file_path, 'r', encoding='UTF-8') as f:
    knowledge_data = f.readlines()
  knowledge = random.choice(knowledge_data)
  return knowledge

Raspberry Piを100%活用しよう(Vol.79掲載)

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

著者:米田 聡

小型コンピュータボード「Raspberry Pi」(ラズパイ)向けにさまざまな拡張ボードが発売されています。その拡張ボードとラズパイを組み合わせれば、ラズパイでいろいろなことが簡単に試せます。第12回は、電流を測定するクランプメーターを搭載する拡張基板を扱います。

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

図6 本連載で作成したサンプルプログラム(sample.py)

import time
import board
import math
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.ads1x15 import Mode
from adafruit_ads1x15.analog_in import AnalogIn

GAIN = 1
RATE = 860

i2c = busio.I2C(board.SCL, board.SDA, frequency=1000000)
ads = ADS.ADS1115(i2c, GAIN)
# 差動入力で初期化
in0 = AnalogIn(ads, ADS.P0, ADS.P1)

# 連続モードの設定
ads.mode = Mode.CONTINUOUS
ads.data_rate = RATE
SAMPLE_INTERVAL = 1.0 / ads.data_rate

# ADS1115のCONTINUOUSモードは初回読み取り実行後に設定が行われ
# 設定に2サンプリングクロックが必要になる
_ = in0.voltage # 設定用の空読み込み

value = 0.0
current_value = 0.0
sqrtI = 0.0

time_next_sample = time.monotonic() + SAMPLE_INTERVAL
for i in range(ads.data_rate):
    while time.monotonic() < (time_next_sample):
        pass
    # 前回と同じ値が読み取られた場合は読み飛ばす
    current_value = in0.voltage
    while current_value == value:
        current_value = in0.voltage
    value = current_value
    sqrtI += value * value

    time_next_sample = time.monotonic() + SAMPLE_INTERVAL

# 電流値(RMS)の計算
ampere = math.sqrt(sqrtI/ads.data_rate) * 20.0
print(ampere)

特別企画 本格的なホームサーバーを構築(Vol.79記載)

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

著者:麻生 二郎

小型コンピュータボードの最上位モデルである「Raspberry Pi 4 Model B」の2G/4G/8Gバイト版と、人気のLinuxディストリビューション「Ubuntu」のサーバー版を組み合わせて、本格的なサーバーを構築しましょう。本特集では、サーバーをインターネットに公開する方法を紹介します。

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

図A3 ラズパイサーバーの初期設定(ubuntu_init1.sh)

#!/bin/sh

##日本のタイムゾーン設定
sudo timedatectl set-timezone Asia/Tokyo

##全ソフトウエア更新
sudo apt update
sudo apt -y upgrade
sudo apt -y autoremove
sudo apt clean

##ファームウエアアップデート
sudo apt -y install rpi-eeprom
sudo rpi-eeprom-update

##完了後の再起動
read -p "再起動しますか [y/N]:" YN
if [ " $YN" = " y" ] || [ " $YN" = " Y" ]; then
  sudo reboot
fi

図A4 ラズパイサーバーの初期設定(ubuntu_init2.sh)

#!/bin/sh

##固定IPアドレスとルーターのIPアドレス
IP_ADDRESS="192.168.10.100"
ROUTER_IP="192.168.10.1"

##旧設定バックアップ
mkdir -p ~/old_settings
sudo mv /etc/netplan/50-cloud-init.yaml ~/old_settings/.

##新ネットワーク設定作成
cat << EOF | sudo tee /etc/netplan/50-cloud-init.yaml > /dev/null
network:
  ethernets:
    eth0:
      dhcp4: false
      addresses: [ip_address/24]
      gateway4: router_ip
      nameservers:
        addresses: [8.8.8.8]
  version: 2
EOF
sudo sed -i -e "s%ip_address%$IP_ADDRESS%" /etc/netplan/50-cloud-init.yaml
sudo sed -i -e "s%router_ip%$ROUTER_ip%" /etc/netplan/50-cloud-init.yaml

##ネットワーク設定反映
sudo netplan apply

特集3 ユニケージ開発のシステム(Vol.79記載)

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

著者:松浦 智之

システム開発手法「ユニケージ」では、データ保存用に「ファイル」を使い、ユニケージ専用コマンド群「usp Tukubai」と「シェルスクリプト」で業務システムを開発します。usp Tukubaiは有償ソフトですが、無償のオープンソース版「Open usp Tukubai」もあります。このOpen usp Tukubaiを使って、ユニケージ開発を無料で始めてみましょう。

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

図6 Apache HTTP Serverの郵便番号・住所検索システム用設定ファイル(/etc/apache2/sites-available/zip2addr.conf)

<IfModule alias_module>
    Alias /zip2addr /home/ユーザー名/ZIP2ADDR/public_html
    <Directory /home/ユーザー名/ZIP2ADDR/public_html>
         AddHandler cgi-script .cgi
         Options all
         Require all granted
    </Directory>
</IfModule>

図10 MK_ZIPTBL.SHのソースコード

#!/bin/sh -u
(略)
homd=$(d=${0%/*}/; [ "_$d" = "_$0/" ] && d='./'; cd "$d.."; pwd)
datd=$homd/DATA
shld=$homd/SHELL
webd=$homd/public_html

url_ken=https://www.post.japanpost.jp/zipcode/dl/oogaki/zip/ken_all.zip
url_jig=https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip

export LC_ALL=C
(略)
nocmds=''
type wget   >/dev/null 2>&1 || { nocmds="$nocmds,wget"  ; }
type gunzip >/dev/null 2>&1 || { nocmds="$nocmds,gunzip"; }
type iconv  >/dev/null 2>&1 || { nocmds="$nocmds,iconv" ; }
if [ -n "$nocmds" ]; then
  echo "${0##*/}: ${nocmds#,} not found. Install them in advance." 1>&2
  exit 1
fi
(略)
wget -q -O - "$url_ken"           |
gunzip                            |
tr -d '\r'                        |
iconv -c -f Shift_JIS -t UTF-8    |
tr -d '"'                         |
awk -F , '{print $3,$7,$8,$9}'    > $datd/ziptbl_ken.txt

if [ ! -s $datd/ziptbl_ken.txt ]; then
  echo "${0##*/}: Failed to make zip_ken.txt" 1>&2; exit 1
fi
(略)
wget -q -O - "$url_jig"           |
gunzip                            |
tr -d '\r'                        |
iconv -c -f Shift_JIS -t UTF-8    |
tr -d '"'                         |
awk -F , '{print $8,$4,$5,$6 $7}' > $datd/ziptbl_jig.txt

if [ ! -s $datd/ziptbl_jig.txt ]; then
  echo "${0##*/}: Failed to make zip_ken.txt" 1>&2; exit 1
fi
(略)
exit 0

図12 ZIP2ADDR.AJAX.cgiのコード

#!/bin/sh -u
(略)
homd=$(d=${0%/*}/; [ "_$d" = "_$0/" ] && d='./'; cd "$d.."; pwd)
datd=$homd/DATA
shld=$homd/SHELL
webd=$homd/public_html

export LC_ALL=C
(略)
exit_trap() {
  set -- ${1:-} $?  # $? is set as $1 if no argument given
  trap '' EXIT HUP INT QUIT PIPE ALRM TERM
  [ -d "${tmpd:-}" ] && rm -rf "$tmpd"
  trap -  EXIT HUP INT QUIT PIPE ALRM TERM
  exit $1
}

error500_exit() {
  echo 'Status: 500 Internal Server Error'
  echo 'Content-Type: text/plain'
  echo
  echo '500 Internal Server Error'
  echo "($@)"
  exit 1
}

error400_exit() {
  echo 'Status: 400 Bad Request'
  echo 'Content-Type: text/plain'
  echo
  echo '400 Bad Request'
  echo "($@)"
  exit 1
}
(略)
trap 'exit_trap' EXIT HUP INT QUIT PIPE ALRM TERM
tmpd=$(mktemp -d -t "_${0##*/}.$$.XXXXXXXXXXX")
[ -d "$tmpd" ] || error500_exit 'Failed to mktemp'
(略)
printf '%s\n' "${QUERY_STRING:-}" |
cgi-name                          > $tmpd/cgivars

zip=$(nameread zipcode $tmpd/cgivars)
printf '%s\n' "$zip" | grep -qE '^[0-9]{7}$' || error400_exit 'Invalid zipcode'
(略)
echo $homd/DATA/ziptbl* | grep -qF '*' && error500_exit 'No table files exist'

cat $homd/DATA/ziptbl*                 |
awk '$1=="'"$zip"'"{print "pref",$2;
                    print "city",$3;
                    print "town",$4;}' > $tmpd/address123
[ -s $tmpd/address123 ] || error400_exit 'No address found'
(略)
echo 'Content-Type: text/html; charset=utf-8'
echo 'Cache-Control: private, no-store, no-cache, must-revalidate'
echo 'Pragma: no-cache'
echo

formhame $webd/ZIP2ADDR.html $tmpd/address123 |
sed -n '/BEGIN ADDRESS123/,/END ADDRESS123/p'
(略)
[ -d "${tmpd:-}" ] && rm -rf "$tmpd"
exit 0

図13 ZIP2ADDR.htmlのコード

<!DOCTYPE html>
(略)
<script type="text/javascript" src="ZIP2ADDR.js"></script>
(略)
</head>

<body>
<h1>郵便番号→住所検索 デモ</h1>
<form action="#dummy">
<table border="0" id="addressform">
  <tr>
    <td>
      <dl>
        <dt>郵便番号</dt>
        <dd><input id="zipcode1" type="text" name="zipcode1" value="" size="3" maxlength="3" />-<input id="zipcode2" type="text" name="zipcode2" value="" size="4" maxlength="4" /></dd>
        <dd><input id="run" type="button" name="run" value="検索実行!" onclick="zip2addr();"></dd>
      </dl>
    </td>
  </tr>
  <tr>
    <td>
      <dl id="adress123">
        <!-- BEGIN ADDRESS123-->
        <dt>住所(都道府県名)</dt>
        <dd>
          <select id="pref" name="pref">
            <option value="(未選択)">(未選択)</option>
(略)
            <option value="沖縄県"  >沖縄県</option>
          </select>
        </dd>
        <dt>住所(市区町村名)</dt><dd><input id="city" type="text" size="60" name="city" value="" /></dd>
        <dt>住所(町名以降)</dt><dd><input id="town" type="text" size="60" name="town" value="" /></dd>
        <!-- END ADDRESS123-->
      </dl>
    </td>
  </tr>
</table>
</form>
</body>
</html>

図14 ZIP2ADDR.jsのコード

(略)
function zip2addr() {
  var url;
  var zipcode;
  var xhr;
(略) 
  if (! document.getElementById('zipcode1').value.match(/^([0-9]{3})$/)) {
    alert('郵便番号(前の3桁)が正しくありません');
    return;
  }
  zipcode  = RegExp.$1;
  if (! document.getElementById('zipcode2').value.match(/^([0-9]{4})$/)) {
    alert('郵便番号(後の4桁)が正しくありません');
    return;
  }
  zipcode += RegExp.$1;
(略)
  xhr = createXMLHttpRequest();
  if (xhr) {
    url  = 'ZIP2ADDR.AJAX.cgi?zipcode='+zipcode;
    url += '&dummy='+parseInt((new Date)/1);

    xhr.open('GET', url, true);
    xhr.onreadystatechange = function(){zip2addr_callback(xhr)};
    xhr.send(null);
  }
(略)
  return;
}
(略)
function zip2addr_callback(xhr) {

  var e;
(略)
  if (xhr.readyState != 4) {return;}
  if (xhr.status == 0    ) {return;}
  if      (xhr.status == 400) {
    alert('郵便番号が正しくありません');
    return;
  }
  else if (xhr.status != 200) {
    alert('アクセスエラー(' + xhr.status + ')');
    return;
  }
(略)
  e = document.getElementById('adress123');
  if (!e) {alert('エラー: 住所欄が存在しない!'); return;}
  e.innerHTML = xhr.responseText;
(略)
  return;
}

特集2 FlutterでGUIアプリを開発しよう(Vol.79記載)

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

著者:三好 文二郎

「Flutter」は、米Google社がOSS(オープンソースソフトウエア)として提供する、GUI アプリ開発用のSDK(Software Development Kit)です。単一のコードで複数のプラットフォーム向けのGUIアプリを作成できるほか、標準で用意されるUIコンポーネントが豊富、Hot Reloadによる開発者体験が素晴らしいことなどから開発者の間で人気が高まっています。Flutterの概要と、Flutterを利用したアプリ開発方法について紹介します。

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

図18 ウィジェットに関する記述の例

children: <Widget>[
  const Text(
    'You have pushed the button this many times:',
  ),
  Text(
    '$_counter',
    style: Theme.of(context).textTheme.headline4,
  ),
],

図19 ボタンウィジェットを追加するコードの例

children: <Widget>[
  const Text(
    'You have pushed the button this many times:',
  ),
  Text(
    '$_counter',
    style: Theme.of(context).textTheme.headline4,
  ),
  MaterialButton (
    color: Colors.cyan.withOpacity(0.7),
    shape: RoundedRectangleBorder(borderRadius:BorderRadius.circular(30.0)),
    onPressed: () {},
    child: const Text('this is a button widget'),
  ),
],

図21 my_first_appプロジェクトの「pubspec.yaml」ファイルの内容

name: my_first_app
description: A new Flutter project.
publish_to: "none"
version: 1.0.0+1
environment:
  sdk: ">=2.16.2 <3.0.0"
dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2
dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^1.0.0
flutter:
  uses-material-design: true

図22 go_routerパッケージを利用する場合の記述例

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2
  go_router: ^3.1.1

図23 画面を追加するためのコード

class NavigatedPage extends StatelessWidget {
  const NavigatedPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('navigated page'),
      ),
      body: const Center(
        child: Text('navigated with go_router'),
      ),
    );
  }
}

図24 画面遷移のためのコード

class MyApp extends StatelessWidget {
  MyApp({Key? key}) : super(key: key);
  final _router = GoRouter(
    routes: [
      GoRoute(
        path: '/',
        builder: (context, state) =>
          const MyHomePage(title: 'Flutter Demo Home Page'),
      ),
      GoRoute(
        path: '/navigated',
        builder: (context, state) => const NavigatedPage(),
      ),
    ],
  );

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
    ),
    routeInformationParser: _router.routeInformationParser,
    routerDelegate: _router.routerDelegate);
  }
}

図25 ボタンウィジェットに画面遷移処理を割り当てるコード

MaterialButton (
  color: Colors.cyan.withOpacity(0.7),
  shape: RoundedRectangleBorder(borderRadius:BorderRadius.circular(30.0)),
  onPressed: () {
    GoRouter.of(context).go('/navigated');
  },
  child: const Text('Navigate'),
),

図26 main()関数のコードを変更

void main() {
  runApp(MyApp());
}

レポート 「Raspberry Pi Zero 2 W」国内版発売(Vol.79掲載)

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

著者:末安 泰三

超小型コンピュータボード「Raspberry Pi Zero」シリーズの最新版、「Raspberry Pi Zero 2 W」の国内版が2022年6月に発売された。Raspberry Pi財団が2021年10月に発売した製品だが、国内版には技適マークが付く。同シリーズの従来製品と比べ、マルチスレッド性能が4~5倍程度向上した。

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

図2 LinuxカーネルのRaspberry Pi Zero 2 W用のDTSファイルの内容

(略)
       compatible = "raspberrypi,model-zero-2-w", "brcm,bcm2837";
        model = "Raspberry Pi Zero 2 W";

        memory@0 {
                device_type = "memory";
                reg = <0 0x20000000>;
        };

        chosen {
                /* 8250 auxiliary UART instead of pl011 */
                stdout-path = "serial1:115200n8";
        };
(略)

レポート テキストエディタ「Vim 9.0」リリース(Vol.79掲載)

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

著者:末安 泰三

テキストエディタ「Vim」の最新版「Vim 9.0」が2022年6月28日に公開された。前版「Vim 8.2」の公開は2019年12月のため、約2年半ぶりのリリースとなる。Vim 9.0の目玉となる新機能は、文法を見直して大幅な高速化を実現したスクリプト言語「Vim9 Script」のサポートである。

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

図2 新旧のコードで定義した関数の実行結果と実行時間を表示するコードの例

command! -bar TimerStart let start_time = reltime()
command! -bar TimerEnd echo reltimestr(reltime(start_time))
                       \ | unlet start_time

function Add_old()
  let a = 0
  for i in range(1, 1000000)
    let a += i
  endfor
  return a
endfunction

def Add_new(): number
  var a = 0
  for i in range(1, 1000000)
    a += i
  endfor
  return a
enddef

TimerStart
echo Add_old()
TimerEnd
TimerStart
echo Add_new()
TimerEnd

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

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

004 レポート テキストエディタ「Vim 9.0」リリース コード掲載
005 レポート 「Raspberry Pi Zero 2 W」国内版発売 コード掲載
006 製品レビュー イヤホン「LinkBuds」
007 NEWS FLASH
008 特集1 仮想化ソフト「VirtualBox」 徹底活用/麻生二郎
020 特集2 FlutterでGUIアプリを開発しよう/三好文二郎 コード掲載
030 特集3 ユニケージ開発のシステム/松浦智之 コード掲載
042 特別企画 本格的なホームサーバーを構築 インターネット公開編/麻生二郎 コード掲載
051 Hello Nogyo!
052 Raspberry Piを100%活用しよう/米田聡 コード掲載
056 Pythonあれこれ/飯尾淳
064 マルウエア/桑原滝弥、イケヤシロウ
066 中小企業手作りIT化奮戦記/菅雄一
070 タイ語から分かる現地生活/つじみき
076 法林浩之のFIGHTING TALKS/法林浩之
078 香川大学SLPからお届け!/岩本和真 コード掲載 
084 AWKでデジタル信号処理/斉藤博文 コード掲載
090 Bash入門/大津真
098 Techパズル/gori.sh
099 コラム「こうしてユニケージは生まれた」/シェル魔人

Vol.79

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

 LinuxやWindows 11を少し使ってみたい、気になるアプリケーションを試してみたいなど、パソコンを使い続けていると、このような考えを持つことがよくあります。そのようなときに便利なのが「パソコンハードウエア仮想化ソフト」です。この仮想化ソフトを使うと、パソコン内に仮想的なパソコンを構築できます。
 特集1では、無償で使えるパソコンハードウエア仮想化ソフト「Oracle VM VirtualBox」の導入方法や基本操作を解説します。便利な機能、人気のLinuxやWindows 11を試すためのイメージファイルなども紹介しています。
 特集2では、米Google社が開発するGUIアプリ開発環境「Flutter」を使い始めたい人向けに解説します。Flutterでは、AndroidやiPhoneなどのモバイル端末向けアプリから、WindowsやLinux、macOSのデスクトップマシン向けアプリまで、同一のコードで開発できます。
 特集3では、本格的な業務システム開発で利用されている手法「ユニケージ」の専用コマンド群「usp Tukubai」のオープンソース版である「Open usp Tukubai」を利用したシステム開発を紹介します。Open usp Tukubaiなら有償ではなく無償でユニケージ開発を体験でき、さらに開発したシステムをそのまま実運用できます。
 特別企画では、以前から本誌で継続中の、小型コンピュータボード「Raspberry Pi Model 4」と、人気のLinuxディストリビューション「Ubuntu Server」でホームサーバー構築方法を解説しています。今回は、ホームサーバーをインターネットに公開する方法を紹介しました。
 このほか、新連載として「AWKでデジタル信号処理」が始まりました。プログラミング言語「AWK」とシェルスクリプトを用いて、デジタル信号からノイズを取り除くなどの方法を、仕組みを含めながら解説していきます。
 今回も読み応え十分のシェルスクリプトマガジン Vol.79。お見逃しなく!

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

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

Vol.79 補足情報

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

特集3 ユニケージ開発のシステム

 p.30の中央右段に「163mm」の不要な文字が入り込み、本文と重なってしまいました。お詫びして訂正いたします。

特別企画 本格的なホームサーバーを構築 インターネット公開編

 p.46の左段にある「$ wget -O /home/pi/DDNSNow_update.log “https://f5.si/update.php?domain=ユーザー名&password=パスワード”」の「pi」は「Ubuntu Serverのユーザー名」の誤り、右段にある「0-59 * * * * wget -O DDNSNow_update.log “https://f5.si/update.php?domain=ユーザー名&password=パスワード”」の「 -O DDNSNow_update.log」は「 -O /home/Ubuntu Serverのユーザー名/DDNSNow_update.log」の誤りです。お詫びして訂正いたします。

IPアドレスの調べ方

 ルーターのDHCP(Dynamic Host Configuration Protocol)のリース情報から、Raspberry Piに割り当てられたIPアドレスを、次のように調べます。
 パソコンのWebブラウザを開いて、ルーターの管理画面にログインします。ログイン方法は、ルーターのマニュアルや、インターネットの情報で調べてください。
 管理画面が開いたら、DHCPのリース情報を表示します。こちらもルーターの機種によって操作方法や名称が異なりますが、一般的な家庭用ルーターには必ずあります。例にしたルーターでは、「詳細設定」から「LAN」「DHCPリース」でネットワーク機器に割り当てられているIPアドレスを表示できます(図1)。

図1 リース情報

 リース情報を表示した状態で、Raspberry Piを起動するとRaspberry Piに割り当てられたIPアドレスの情報が追加されます(図2の赤枠)。IPアドレスを使ってリモートからアクセスできます。

図2 Raspberry Piの情報が追加された

 ちなみに、このリース情報画面でRaspberry PiのMACアドレスと、割り当てたいIPアドレスを設定すれば、Raspberry Pi側のネットワーク設定を変更せずとも常に同じIPアドレス、固定IPアドレスを設定できます。

The Poetry and Art Collection

 p.64の右上に前号で掲載した詩の一部(複雑のひと 単純のこころ 唯一のひかり 無限のやみ)が入ってしまいした。お詫びして訂正いたします。

情報は随時更新致します。

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

  • -->