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

test

Vol.66 補足情報

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

Techパズル

p.104の左下にある図は、前号(Vol.65)の解答です。

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

シェルスクリプトの書き方入門(Vol.66記載)

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

著者:大津 真

本連載ではシェルスクリプトの書き方をやさしく紹介します。対象とするシェルは、多くのLinuxディストリビューションが標準シェルとして採用する「Bash」です。第2回では、変数の概要と、シェルスクリプト内でコマンドライン引数を扱う方法について解説します。

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

図4 シェルスクリプト「 permtest1.sh 」の内容

#!/bin/bash
echo " スクリプト名: $0"
echo " 引数の数: $#"
echo " 引数1: $1"
echo " 引数2: $2"
echo " 引数3: $3"

図5 シェルスクリプト「 colon_to_comma.sh 」の内容

#!/bin/bash
fname=$1
cp "$fname" "${fname}~"
tr ":" "," < "${fname}~" > "$fname"

図6 加工対象のファイル「 customer.txt 」の内容

010: 白戸二郎: 男:39: 北海道
011: 小山田花子: 女:24: 福岡
012: 三村美子: 女:29: 東京

ユニケージ開発手法入門(Vol.66掲載)

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

著者:石崎 博之、掛本 健一

ユニケージ開発手法によるシステムの設計・実装・保守を数年以上経験したメンバーが、業務システム構築のための「ユニケージ開発手法」を解説します。我々の経験に基づきながら、具体的なシステム構築の流れを示していきます。第1回は、ユニケージ開発手法の特徴をつかむです。

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

図2 ユニケージのシェルスクリプトの例

#!/bin/bash
join0 key=1 MASTER TRAN   |
self 2 3 4 5              | 
msort key=1/2             | 
sm2 1 2 3 4               | 
sm4 1 1 2 2 3 4           | 
self 1 2 3 4              | 
sm5 1 3 4 4               | 
map num=1                 | 
sed 's/A/Sales/g'         | 
sed 's/B/Profit/g         | 
keta 4 6@NF-1             | 
comma 3/NF                | 
cat header -              | 
tocsv > result
exit 0

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

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

著者:檜垣 龍德

 今回は、Pythonとそのライブラリである「slacker」「python-crontab」を用いて、チャットサービス「Slack」にメッセージを自動投稿するbo(t Slackbot)を開発する方法を解説します。例として開発するのは、参加者からメッセージが投稿されるまで「Get Up !!」というメッセージを連続投稿するbotです。

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

図7 「.env」ファイルに記述する内容

ACCESS_TOKEN=アクセストークン
CHANNEL_ID=チャンネルID

図8 「settings.py」ファイルに記述する内容

import os
from os.path import join, dirname
from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

ACCESS_TOKEN = os.environ.get("ACCESS_TOKEN")
CHANNEL_ID = os.environ.get("CHANNEL_ID")

図9 「main.py」ファイルに記述する内容

from slacker import Slacker
import settings

slack = Slacker(settings.ACCESS_TOKEN)
slack.chat.post_message("チャンネル名", "Get Up !!")

図11 「cron.py」ファイルに記述する内容

from crontab import CronTab

cron = CronTab()
job = cron.new('python main.py')
job.setall('00 00 * * *')
for result in cron.run_scheduler():
  print("Done Job"

図12 書き換えたmain.pyファイルの内容

from slacker import Slacker
from time import sleep
import settings

slack = Slacker(settings.ACCESS_TOKEN)
channel_id = settings.CHANNEL_ID
slack.chat.post_message("チャンネル名", "Get Up !!")
history = slack.channels.history(channel_id)
start_ts = history.body["messages"][0]["ts"]
while True:
    sleep(1)
    history = slack.channels.history(channel_id, count=10000, oldest=start_ts)
    not_bot_users = [message["user"] for message in history.body["messages"] if "bot_id" not in message]
    if len(not_bot_users):
        break
     else:
        slack.chat.post_message("チャンネル名", "Get Up !!")

図14 書き換えたmain.pyファイルに追記する内容

history = slack.channels.history(channel_id, count=10000, oldest=start_ts)
ts_list = [message["ts"] for message in history.body["messages"] if 'bot_id' in message]
ts_list.append(start_ts)
for ts in ts_list:
    slack.chat.delete(channel_id, ts=ts, as_user=True)

Webアプリケーションの正しい作り方(Vol.66記載)

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

著者:しょっさん

ソフトウエアを正しく作るために、エンジニアたちはどんなことを知らなければならないでしょうか。実際のコードを使って、より良くしていくためのステップを考えてみましょう。第6回は、アプリケーションの開発やテストを実施する環境について詳しく考えます。

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

図2 モックのコード(swagger.json)

{
  "openapi" : "3.0.0",
  "servers" : [ {
    "description" : "Expense Reporter Sample API",
    "url" : "https://virtserver.swaggerhub.com/sho7650/ExpenseMockServices/0.5.0"
  } ],
  "info" : {
    "description" : "シェルスクリプトマガジン用サンプル",
    "version" : "0.5.0",
    "title" : "Expense API",
    "contact" : {
      "email" : "sho@oshiire.to"
    },
    "license" : {
      "name" : "Apache 2.0",
      "url" : "http://www.apache.org/licenses/LICENSE-2.0.html"
    }
  },
  "tags" : [ {
    "name" : "users",
    "description" : "一般利用者"
  }, {
    "name" : "approvers",
    "description" : "承認者"
  } ],
  "paths" : {
		(略)
    "/payment" : {
      "get" : {
        "tags" : [ "approvers" ],
        "summary" : "支払い待ち一覧",
        "operationId" : "findPayments",
        "description" : "一般利用者からの請求一覧を表示",
        "security" : [ {
          "bearerAuth" : [ ]
        } ],
		(略)
        "responses" : {
          "200" : {
            "description" : "success",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/ExpenseItem"
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "bad input parameter"
          }
        }
      }
    }
  },
  "components" : {
    "securitySchemes" : {
      "bearerAuth" : {
        "type" : "http",
        "scheme" : "bearer",
        "bearerFormat" : "JWT"
      }
    },
    "schemas" : {
      "id" : {
        "type" : "integer",
        "format" : "int32",
        "example" : 120
      },
	(略)
    }
  }
}

バーティカルバーの極意(Vol.66掲載)

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

著者:飯尾 淳

 計量社会学や数理社会学という学問分野があります。人々の行動や社会活動から生み出される多様なデータを定量的に分析することによって、その背景となる社会的な構造や原理を見いだそうという社会学です。筆者はそれらの専門家ではありませんが、社会情報学の文脈で似たような研究に従事しています。今回は、筆者らの研究成果の一つであるTwitterのトレンド分析について、その概要を紹介します。

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

図6 トレンドのキーワードを取得するPythonコード

#!/usr/bin/env python

from twitter import *

woeid = 23424856 # Japan
CK = 'ADD_YOUR_KEY_HERE'            # Consumer Key
CS = 'ADD_YOUR_KEY_SECRET_HERE'     # Consumer Key Secret
AT = 'ADD_YOUR_TOKEN_HERE'          # Access Token
AS = 'ADD_YOUR_TOKEN_SECRET_HERE'   # Accesss Token Secert

twitter = Twitter(auth = OAuth(AT,AS,CK,CS))
results = twitter.trends.place(_id = woeid, exclude="hashtags")

for location in results:
  for trend in location["trends"]:
    print (trend["name"])

レッドハットのプロダクト(Vol.66記載)

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

著者:平田 千浩

「Red Hat Ansible Automation Platform」は、OSS のAnsibleとAWXを基とした企業向け自動化の基盤です。RHELを含むさまざまなOS、さまざまなアプリケーション、さまざまな機器に対応し、局所的な作業からバージョン管理システムと連携した構成管理までを自動化できます。

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

図2 インベントリファイルの例(hosts)

[all:vars]
ansible_ssh_private_key_file=/home/student1/.ssh/aws-private.pem

[ios]
ios1 ansible_host=XX.XX.XX.XX

[ios:vars]
ansible_user=ec2-user
ansible_network_os=ios
ansible_connection=network_cli

図3 Cisco IOS向けの簡単なPlaybookの例(snmp.yml)

---
- name: snmp ro / rw string configuration
  hosts: ios
  gather_facts: no

  tasks:
  - name: ensure that the desired snmp strings are present
    ios_config:
      commands:
        - snmp-server community ansible-public RO
        - snmp-server community ansible-private RW

図6 Arista EOSを追加したインベントリファイル例(hosts)

[all:vars]
ansible_ssh_private_key_file=/home/student1/.ssh/aws-private.pem

[ios]
ios1 ansible_host=XX.XX.XX.XX

[ios:vars]
ansible_user=ec2-user
ansible_network_os=ios
ansible_connection=network_cli

[eos]
eos1 ansible_host=YY.YY.YY.YY

[eos:vars]
ansible_user=ec2-user
ansible_network_os=eos
ansible_connection=network_cli
ansible_become=true
ansible_become_method=enable

[control]
ansible ansible_host=AA.AA.AA.AA ansible_user=student1 ansible_password=PASSWORD

図7 Arista EOSのコンフィグをバックアップするPlaybookの例(eos_backup.yml)

---
- name: retrieve router configurations
  hosts: eos
  gather_facts: no

  tasks:
  - name: BACKUP THE CONFIG
    eos_config:
      backup: yes
    register: config_output

  - name: Save THE CONFIG
    vars:
      ansible_connection: ssh
    copy:
      src: "{{config_output.backup_path}}"
      dest: "/backup/{{inventory_hostname}}"
    delegate_to: ansible
    become: yes

図10 CISCO IOSのコンフィグをバックアップするPlaybookの例

- name: retrieve router configurations
  hosts: ios
  gather_facts: no

  tasks:
  - name: BACKUP THE CONFIG
    ios_config:
      backup: yes
    register: config_output

  - name: REMOVE NON CONFIG LINES - REGEXP
    lineinfile:
      path: "{{config_output.backup_path}}"
      line: "Building configuration..."
      state: absent

  - name: Save THE CONFIG
    vars:
      ansible_connection: ssh
    copy:
      src: "{{config_output.backup_path}}"
      dest: "/backup/{{inventory_hostname}}"
    delegate_to: ansible
    become: yes

図11 保存したArista EOSのコンフィグからリストアするPlaybookの例(eos_restore.yml)

---
- name: Restore the EOS Config
  hosts: eos
  gather_facts: no

  tasks:
  - name: RESTORE THE CONFIG
    eos_config:
      replace: config
      src: "/backup/{{inventory_hostname}}"

図12 保存したCisco IOSのコンフィグからリストアするPlaybookの例

---
- name: Restore the IOS Config
  hosts: ios
  gather_facts: no

  tasks:
  - name: RESTORE THE CONFIG
    ios_config:
      src: "/backup/{{inventory_hostname}}"

センサーボードで学ぶ電子回路の制御(Vol.66掲載)

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

著者:米田 聡

シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)向けのセンサー搭載拡張ボード「ラズパイセンサーボード」を制作しました。第13 回では、同ボードに搭載された湿温度・気圧センサー「BME280」から取得したデータをグラフ化する準備をします。

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

図2 PythonからSQLiteを操作するサンプルプログラム(test_sqlite3.py)

import sqlite3
 
DBNAME = "test.sqlite3"         # データベースファイル名
conn = sqlite3.connect(DBNAME)  # SQLite 3に接続
cur = conn.cursor()             # カーソルを得る
cur.execute("SQL文")            # SQLを発行
conn.commit()                   # コミット
data = cur.fetchall()           # 結果をdataに格納
conn.close()                    # データベースを閉じる

図3 温度、湿度、気圧のデータをSQLiteに保存するプログラム(storebme.py)

import time, os, sys, signal
import smbus2
import bme280
import sqlite3
 
BME280_ADDR = 0x76
BUS_NO = 1
DBNAME = 'weather.sqlite3'
 
def store_values(values):
  conn = sqlite3.connect(DBNAME)
  cur = conn.cursor()
  sql = "INSERT INTO bme(dt,temp,hum,press) VALUES(datetime('now', '+9 hours'),?,?,?)"
  cur.execute(sql,(values[0],values[1],values[2]))
  conn.commit()
  conn.close()
 
def signal_handler(sig, handler):
  sys.exit()
 
# テーブル作成
if not os.path.exists(DBNAME):
  conn = sqlite3.connect(DBNAME)
  cur = conn.cursor()
  cur.execute("CREATE TABLE bme(id INTEGER PRIMARY KEY AUTOINCREMENT, dt TEXT,temp REAL, hum REAL, press REAL)")
  conn.commit()
  conn.close()
 
# BME280
i2c = smbus2.SMBus(BUS_NO)
bme280.load_calibration_params(i2c, BME280_ADDR)
 
# signal
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
 
# メインループ
while True:
  data = bme280.sample(i2c, BME280_ADDR)
  store_values([data.temperature,data.humidity,data.pressure ])
  time.sleep(60)

特集1 1000円から始めるIoT(Vol.66記載)

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

著者:麻生 二郎

センサーをつないで状態を監視するだけのIoT(モノのインターネット)を
始めるには、小型コンピュータボード「Raspberry Pi」は高機能かつ高価で
す。そこで1000円以下で購入できるマイコンボード「ESP32 ESP-32S」を使
って、簡単なプログラムと共にI oTを始めてみましょう。

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

Part2 ESP32で電子回路を制御する

図2 ネットワーク接続プログラム(wlan.py)

import network
wlan_if = network.WLAN(network.STA_IF)
wlan_if.active(True)
wlan_if.ifconfig(('192.168.1.100', '255.255.255.0', '192.168.1.1', '192.168.1.1'))
wlan_if.connect('SSID', 'パスワード')
wlan_if.inconfig()

図3 簡易サーバーを立ち上げるプログラム(webserver_test.py)

import picoweb
 
app = picoweb.WebApp(__name__)
 
@app.route("/")
def index(req, resp):
  yield from picoweb.start_response(resp)
  yield from resp.awrite("こんにちは")
 
app.run(debug=True, host = "192.168.1.100")

図12 Webブラウザから湿温度・気圧を取得するプログラム(web_bme280.py)

import picoweb, machine, bme280
  
i2cpin = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21))
bme = bme280.BME280(i2c=i2cpin)
 
app = picoweb.WebApp(__name__)
 
@app.route("/")
def index(req, resp):
  bme280values = bme.values
  yield from picoweb.start_response(resp)
  yield from resp.awrite("気温:" + bme280values[0])
  yield from resp.awrite("|湿度:" + bme280values[2])
  yield from resp.awrite("|気圧:" + bme280values[1])
 
app.run(debug=True, host = "192.168.1.100")

図16 明るさによってライトの点灯を促すプログラム(web_cds.py)

import picoweb, machine
 
adc = machine.ADC(machine.Pin(36))
adc.atten(machine.ADC.ATTN_11DB)
 
app = picoweb.WebApp(__name__)
 
@app.route("/")
def index(req, resp):
  csdvalue = adc.read()
  yield from picoweb.start_response(resp)
  if csdvalue < 2500:
    yield from resp.awrite("明かりをつけましょう")
  else:
    yield from resp.awrite("十分な明るさです")
 
app.run(debug=True, host = "192.168.1.100")

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

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

004 レポート Linuxの新版「Ubuntu 20.04 LTS」リリース
005 レポート VS Codeライクな「Eclipse Theia」登場
006 NEWS FLASH
008 特集1 1000円から始めるIoT/麻生二郎 コード掲載
023 Hello Nogyo!
026 特集2 OneDriveを有効活用しよう/三沢友治
042 特別企画 Microsoft Power Platform(前編)/清水優吾
050 ラズパイセンサーボードで学ぶ 電子回路の制御/米田聡 コード掲載
054 レッドハットのプロダクト/平田千浩 コード掲載
056 バーティカルバーの極意/飯尾淳 コード掲載
062 μ(マイクロ)/桑原滝弥、イケヤシロウ
064 Webアプリの正しい作り方/しょっさん コード掲載
070 円滑コミュニケーションが世界を救う!/濱口誠一
072 MySQL Shellを使おう/梶山隆輔
079 中小企業手作りIT化奮戦記/菅雄一
084 法林浩之のFIGHTING TALKS/法林浩之
086 香川大学SLPからお届け!/檜垣龍德 コード掲載
092 ユニケージ開発手法入門/石崎博之、掛本健一 コード掲載
098 シェルスクリプトの書き方入門/大津真 コード掲載
104 Techパズル/gori.sh
106 コラム「コロナ禍の中で」/シェル魔人

Vol.66

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

 小型コンピュータボード「Raspberry Pi」(ラズパイ)が高性能になり、センサー制御などの組み込み機器の用途で違和感を感じるようになりました。また、発熱量や消費電力が大きいのも問題です。
 センサーを制御するなら、1000円以下で購入できるマイコンボードで十分です。そこで、特集1では「ESP32 ESP-32S」というマイコンボードと、プログラミング言語「Python」を組み合わせて、簡易なIoT(モノのインターネット)環境を構築します。ラズパイと同じようにPythonプログラムでセンサーを制御できるので、初心者でも十分楽しめる内容です。
 特集2では、Windows 10の標準オンラインストレージ「OneDrive」の有効活用する方法を紹介します。Windows 10のパソコンなら、無料で5Gバイトのストレージ容量が利用できるOneDriveを使うべきです。OneDriveでより快適で便利なパソコン環境を手に入れましょう。
 特別企画では、最近注目されている「ノーコーディングプラットフォーム」「ローコーディングプラットフォーム」の一つである「Microsoft Power Platform」を解説します。前後編でMicrodsoft PowerPlatformが備える機能を一つひとつ詳しく紹介します。
 このほか、業務システムを構築するための「ユニケージ開発手法」の入門連載が開始しました。同入門連載では、実際に業務システム構築の流れを示しながら、実際の経験を基にユニケージ流のやり方を分かりやすく解説していきます。
 今回も読み応え十分のシェルスクリプトマガジン Vol.66。お見逃しなく!

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

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

第2回 パソコンのストレージをバックアップする

投稿日:2020.05.18 | カテゴリー: 記事

 Linuxをパソコンにインストールする前に、元の状態に戻せるようにパソコンの内蔵ストレージ(ハードディスクやSSD)を丸ごとバックアップします。Windows 10の場合、回復ドライブを使ってイメージファイルとして丸ごとバックアップできますが、少々手順が面倒です。

 そこで、Linuxをライブで起動して「dd」コマンドを使ってイメージファイルとしてバックアップします。ddは、ストレージの書き込まれているデータを「ブロック」という単位でコピーできるコマンドです(図1)。

図1 丸ごとバックアップ

 ddコマンドなら、ストレージの一部が壊れていて読みだせないファイルも、読み出せるブロックだけを取り出してバックアップできます。そして、バックアップ時に1行のddコマンドを実行すればよく、復元時も、指定する入出力の引数が変わるだけで、同じ1行のddコマンドを実行するだけです。

第1回 Linuxのメディアを作成する

投稿日:2020.05.4 | カテゴリー: 記事

 Linuxとは、OS(基本ソフト)のコア(核)となるソフトウエア(カーネル)の名前です。WindowsやmacOSのようにパソコン上で動作させるには、このカーネルと、各種のツールやユーティリティ、ライブラリなどのソフトウエアをソースコードからビルド(コンパイル)して組み合わせる必要があります。
 ソースコードのほとんどは無償で公開されているので、それなりの知識があれば自らビルドして組み合わせることも可能です。ただし、すでにOSとして動作する状態して配布されている「Linuxディストリビューション」があります。Linuxを使いたいだけなら、こちらのLinuxディストリビューションを用います。

Linuxディストリビューションの選択方法

 Linuxディストリビューションは、一つではありません。DebianやUbuntu、Fedora、CentOSなどの複数の種類があります。これは、異なる団体が自分たちが決めたポリシーに従って構成するソフトウエアを決定し、それらをソースコードからビルドして組み合わせて配布しているからです。
 個々のLinuxディストリビューションによって、それぞれ特徴が違います。ノートパソコンやデスクトップパソコンに導入して使うなら、次の五つを満足するものがよいでしょう。

  1. 簡単に導入や削除ができるアプリケーションが豊富に存在する
  2. インターネット上に多数の情報が掲載されている
  3. 不具合対処やセキュリティ対策のソフトウエアアップデートが長期に提供される
  4. 日本語が使える
  5. デスクトップ画面が快適に操作できる


連載 ノートやデスクトップでLinuxを始めよう

投稿日:2020.05.1 | カテゴリー: 記事

 テレワークや在宅勤務というビジネススタイルが広がってきています。職場と同じように自宅で効率良く仕事をこなすためには、ある程度性能の高いパソコンが不可欠です。また、カメラやマイク付きのノートパソコンなら、そのままテレワークに使えます。これらの理由から、自宅で使っていたパソコンを買い替えた人も多いでしょう。
 買い替えによって、今まで使っていたパソコンが不要になります。それを予備機として使い続けるのもよいですが、この機会にLinuxに入れ替えて、快適で十分実用に耐え得るパソコンとして復活させてみましょう。
 本連載では、WindowsがインストールされたノートパソコンやデスクトップパソコンにLinuxを導入し、普段使えるパソコンに仕立てていきます。

第1回 Linuxのメディアを作る 
第2回 パソコンのストレージをバックアップする
第3回 Lubuntuをインストールする
第4回 日本語入力を可能にする
第5回 Chromeブラウザを導入する
第6回 外付けストレージを利用する 諸事情により公開延期

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

  • -->