Techパズル
p.104の左下にある図は、前号(Vol.65)の解答です。
情報は随時更新致します。
test
著者:大津 真
本連載ではシェルスクリプトの書き方をやさしく紹介します。対象とするシェルは、多くのLinuxディストリビューションが標準シェルとして採用する「Bash」です。第2回では、変数の概要と、シェルスクリプト内でコマンドライン引数を扱う方法について解説します。
シェルスクリプトマガジン Vol.66は以下のリンク先でご購入できます。
図4 シェルスクリプト「 permtest1.sh 」の内容
1 2 3 4 5 6 |
#!/bin/bash echo " スクリプト名: $0" echo " 引数の数: $#" echo " 引数1: $1" echo " 引数2: $2" echo " 引数3: $3" |
図5 シェルスクリプト「 colon_to_comma.sh 」の内容
1 2 3 4 |
#!/bin/bash fname=$1 cp "$fname" "${fname}~" tr ":" "," < "${fname}~" > "$fname" |
図6 加工対象のファイル「 customer.txt 」の内容
1 2 3 |
010: 白戸二郎: 男:39: 北海道 011: 小山田花子: 女:24: 福岡 012: 三村美子: 女:29: 東京 |
著者:石崎 博之、掛本 健一
ユニケージ開発手法によるシステムの設計・実装・保守を数年以上経験したメンバーが、業務システム構築のための「ユニケージ開発手法」を解説します。我々の経験に基づきながら、具体的なシステム構築の流れを示していきます。第1回は、ユニケージ開発手法の特徴をつかむです。
シェルスクリプトマガジン Vol.66は以下のリンク先でご購入できます。
図2 ユニケージのシェルスクリプトの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/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 |
著者:檜垣 龍德
今回は、Pythonとそのライブラリである「slacker」「python-crontab」を用いて、チャットサービス「Slack」にメッセージを自動投稿するbo(t Slackbot)を開発する方法を解説します。例として開発するのは、参加者からメッセージが投稿されるまで「Get Up !!」というメッセージを連続投稿するbotです。
シェルスクリプトマガジン Vol.66は以下のリンク先でご購入できます。
図7 「.env」ファイルに記述する内容
1 2 |
ACCESS_TOKEN=アクセストークン CHANNEL_ID=チャンネルID |
図8 「settings.py」ファイルに記述する内容
1 2 3 4 5 6 7 8 9 |
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」ファイルに記述する内容
1 2 3 4 5 |
from slacker import Slacker import settings slack = Slacker(settings.ACCESS_TOKEN) slack.chat.post_message("チャンネル名", "Get Up !!") |
図11 「cron.py」ファイルに記述する内容
1 2 3 4 5 6 7 |
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ファイルの内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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ファイルに追記する内容
1 2 3 4 5 |
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) |
著者:しょっさん
ソフトウエアを正しく作るために、エンジニアたちはどんなことを知らなければならないでしょうか。実際のコードを使って、より良くしていくためのステップを考えてみましょう。第6回は、アプリケーションの開発やテストを実施する環境について詳しく考えます。
シェルスクリプトマガジン Vol.66は以下のリンク先でご購入できます。
図2 モックのコード(swagger.json)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
{ "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 }, (略) } } } |
著者:飯尾 淳
計量社会学や数理社会学という学問分野があります。人々の行動や社会活動から生み出される多様なデータを定量的に分析することによって、その背景となる社会的な構造や原理を見いだそうという社会学です。筆者はそれらの専門家ではありませんが、社会情報学の文脈で似たような研究に従事しています。今回は、筆者らの研究成果の一つであるTwitterのトレンド分析について、その概要を紹介します。
シェルスクリプトマガジン Vol.66は以下のリンク先でご購入できます。
図6 トレンドのキーワードを取得するPythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/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"]) |
著者:平田 千浩
「Red Hat Ansible Automation Platform」は、OSS のAnsibleとAWXを基とした企業向け自動化の基盤です。RHELを含むさまざまなOS、さまざまなアプリケーション、さまざまな機器に対応し、局所的な作業からバージョン管理システムと連携した構成管理までを自動化できます。
シェルスクリプトマガジン Vol.66は以下のリンク先でご購入できます。
図2 インベントリファイルの例(hosts)
1 2 3 4 5 6 7 8 9 10 |
[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)
1 2 3 4 5 6 7 8 9 10 11 |
--- - 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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
--- - 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の例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
- 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)
1 2 3 4 5 6 7 8 9 10 |
--- - 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の例
1 2 3 4 5 6 7 8 9 |
--- - name: Restore the IOS Config hosts: ios gather_facts: no tasks: - name: RESTORE THE CONFIG ios_config: src: "/backup/{{inventory_hostname}}" |
著者:米田 聡
シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)向けのセンサー搭載拡張ボード「ラズパイセンサーボード」を制作しました。第13 回では、同ボードに搭載された湿温度・気圧センサー「BME280」から取得したデータをグラフ化する準備をします。
シェルスクリプトマガジン Vol.66は以下のリンク先でご購入できます。
図2 PythonからSQLiteを操作するサンプルプログラム(test_sqlite3.py)
1 2 3 4 5 6 7 8 9 |
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
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) |
著者:麻生 二郎
センサーをつないで状態を監視するだけのIoT(モノのインターネット)を
始めるには、小型コンピュータボード「Raspberry Pi」は高機能かつ高価で
す。そこで1000円以下で購入できるマイコンボード「ESP32 ESP-32S」を使
って、簡単なプログラムと共にI oTを始めてみましょう。
シェルスクリプトマガジン Vol.66は以下のリンク先でご購入できます。
図2 ネットワーク接続プログラム(wlan.py)
1 2 3 4 5 6 |
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)
1 2 3 4 5 6 7 8 9 10 |
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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") |
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 コラム「コロナ禍の中で」/シェル魔人
小型コンピュータボード「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。お見逃しなく!
※読者アンケートはこちら
Linuxをパソコンにインストールする前に、元の状態に戻せるようにパソコンの内蔵ストレージ(ハードディスクやSSD)を丸ごとバックアップします。Windows 10の場合、回復ドライブを使ってイメージファイルとして丸ごとバックアップできますが、少々手順が面倒です。
そこで、Linuxをライブで起動して「dd」コマンドを使ってイメージファイルとしてバックアップします。ddは、ストレージの書き込まれているデータを「ブロック」という単位でコピーできるコマンドです(図1)。
ddコマンドなら、ストレージの一部が壊れていて読みだせないファイルも、読み出せるブロックだけを取り出してバックアップできます。そして、バックアップ時に1行のddコマンドを実行すればよく、復元時も、指定する入出力の引数が変わるだけで、同じ1行のddコマンドを実行するだけです。
Linuxとは、OS(基本ソフト)のコア(核)となるソフトウエア(カーネル)の名前です。WindowsやmacOSのようにパソコン上で動作させるには、このカーネルと、各種のツールやユーティリティ、ライブラリなどのソフトウエアをソースコードからビルド(コンパイル)して組み合わせる必要があります。
ソースコードのほとんどは無償で公開されているので、それなりの知識があれば自らビルドして組み合わせることも可能です。ただし、すでにOSとして動作する状態して配布されている「Linuxディストリビューション」があります。Linuxを使いたいだけなら、こちらのLinuxディストリビューションを用います。
Linuxディストリビューションは、一つではありません。DebianやUbuntu、Fedora、CentOSなどの複数の種類があります。これは、異なる団体が自分たちが決めたポリシーに従って構成するソフトウエアを決定し、それらをソースコードからビルドして組み合わせて配布しているからです。
個々のLinuxディストリビューションによって、それぞれ特徴が違います。ノートパソコンやデスクトップパソコンに導入して使うなら、次の五つを満足するものがよいでしょう。
テレワークや在宅勤務というビジネススタイルが広がってきています。職場と同じように自宅で効率良く仕事をこなすためには、ある程度性能の高いパソコンが不可欠です。また、カメラやマイク付きのノートパソコンなら、そのままテレワークに使えます。これらの理由から、自宅で使っていたパソコンを買い替えた人も多いでしょう。
買い替えによって、今まで使っていたパソコンが不要になります。それを予備機として使い続けるのもよいですが、この機会にLinuxに入れ替えて、快適で十分実用に耐え得るパソコンとして復活させてみましょう。
本連載では、WindowsがインストールされたノートパソコンやデスクトップパソコンにLinuxを導入し、普段使えるパソコンに仕立てていきます。
第1回 Linuxのメディアを作る
第2回 パソコンのストレージをバックアップする
第3回 Lubuntuをインストールする
第4回 日本語入力を可能にする
第5回 Chromeブラウザを導入する
第6回 外付けストレージを利用する 諸事情により公開延期
shell-mag ブログの 2020年5月 のアーカイブを表示しています。