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

test

Linux定番エディタ入門(Vol.84掲載)

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

著者:大津 真

文章の作成やプログラミングに欠かせないのがテキストエディタ(以下、エディタ)です。この連載では、Linuxで利用できる定番エディタの特徴と使い方を解説していきます。第1回に取り上げるのは、CU(I Character User Interface)環境で利用できるシンプルで扱いやすい「GNU nano」です。

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

図12 nanoの設定ファイル「~/.nanorc」の記述例

# バックアップファイルを作成
set backup 
# 各行の左に行番号を表示
set linenumbers
# 文字列検索時に大文字小文字を区別
set casesensitive
# 長い行を画面の右端で折り返す 
set softwrap
# オートインデント
set autoindent
# タブサイズを「4」に(デフォルトは「8」)
set tabsize 4
# マウスのサポートを有効に
set mouse

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

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

著者:斉藤 博文

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

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

図5 ecg.awk内のlpf()関数

# low pass filter
function lpf(arr_x, arr_y, idx_x, idx_y, ord, len_x, len_y,     _ret, _gain) {
    _ret = 0.0;
    _gain = 1.0 / (ord * ord);

    _ret += 2.0 * get_buffer(arr_y, idx_y - 1, len_y);
    _ret -= 1.0 * get_buffer(arr_y, idx_y - 2, len_y);
    _ret += 1.0 * _gain * arr_x[idx_x];
    _ret -= 2.0 * _gain * get_buffer(arr_x, idx_x - ord, len_x);
    _ret += 1.0 * _gain * get_buffer(arr_x, idx_x - 2 * ord, len_x);

    return _ret;
}

図6 ecg.awk内の最終結果を出力するprintf()文で群遅延を補正

    # print results
    printf("%f,%f,%f,%f,%f,%f,%f,%f\n",
            get_buffer( \
                    arr_data_raw,
                    idx_data - (val_gd_lpf + val_gd_hpf + val_gd_dif + val_gd_sma) - 2 * val_fs,
                    len_data),
            get_buffer( \
                    arr_data_lpf,
                    idx_data - (val_gd_hpf + val_gd_dif + val_gd_sma) - 2 * val_fs,
                    len_data),
            get_buffer( \
                    arr_data_hpf,
                    idx_data - (val_gd_dif + val_gd_sma) - 2 * val_fs,
                    len_data),
            get_buffer( \
                    arr_data_dif,
                    idx_data - val_gd_sma - 2 * val_fs,
                    len_data),
            get_buffer( \
                    arr_data_squ,
                    idx_data - val_gd_sma - 2 * val_fs,
                    len_data),
            get_buffer( \
                    arr_data_sma,
                    idx_data - 2 * val_fs,
                    len_data),
            cnt_rri_curr * 0.005 * 1000,
            get_buffer( \
                    arr_data_flg,
                    idx_data - (val_gd_dif + val_gd_sma) - 2 * val_fs,
                    len_data));
}

図12 ecg.awk内のしきい値(val_data_sma_threshold)を設定している箇所

# update threshold every interval
if (num_data % tap_interval == 0) {
    val_data_sma_threshold = val_data_sma_max * val_peak_rate;
    val_data_sma_max = 0;
} else {
    if (val_data_sma_max < arr_data_sma[idx_data]) {
        val_data_sma_max = arr_data_sma[idx_data];
    }
}

図13 ecg.awk内のval_data_flgを「1」に設定している箇所

if (val_data_sma_curr > val_data_sma_threshold && val_data_sma_threshold >= val_data_sma_last) {
    val_data_hpf_max = 0;
    idx_data_hpf_max = 0;
    val_data_flg = 1;
}

図14 ecg.awk内のidx_data_hpf_maxを求めている箇所

# search maximum index
if (val_data_flg == 1) {
    val_data_hpf_curr = get_buffer(arr_data_hpf, idx_data - (val_gd_dif + val_gd_sma), len_data);
    idx_data_hpf_curr = idx_data - (val_gd_dif + val_gd_sma);
    idx_data_hpf_curr = idx_data_hpf_curr >= 0 ? idx_data_hpf_curr : idx_data_hpf_curr + len_data;

    if (val_data_hpf_max < val_data_hpf_curr) {
        val_data_hpf_max = val_data_hpf_curr;
        idx_data_hpf_max = idx_data_hpf_curr;
    }
}

図15 ecg.awk内のarr_data_flg[idx_data_hpf_max]を「1」に設定している箇所

# end point to detect main peak
if (val_data_sma_curr < val_data_sma_threshold && val_data_sma_threshold <= val_data_sma_last) {
    arr_data_flg[idx_data_hpf_max] = 1;

図18 ecg.awk内のRRIを求めている箇所

# calculate peak to peak interval
if (idx_data - idx_data_hpf_max >= 0) {
    cnt_peak_curr = num_data - (idx_data - idx_data_hpf_max);
} else {
    cnt_peak_curr = num_data - (idx_data - idx_data_hpf_max + len_data);
}

cnt_rri_curr = cnt_peak_curr - cnt_peak_last;
cnt_peak_last = cnt_peak_curr;

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

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

著者:三井 颯剛

SLPでは、Webページの公開などに使用しているサーバーを立て直す計画が進行中です。再建後のサーバーでは、「Traefik(トラフィック) 」というコンテナ環境向けのリバースプロキシソフトウエアを採用する予定です。今回は、Dockerでサーバーコンテナを稼働させて、それに対するアクセスをTraefikで制御する場合を例に、Traefikの利用方法について紹介します。

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

図3 「docker-compose.yml」ファイルに記述する設定

services:
  reverse-proxy:
    image: traefik:latest
    restart: always
    ports:
      - "80:80"
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command:
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"

  whoami:
    image: traefik/whoami
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=PathPrefix(/whoami)"
      - "traefik.http.routers.whoami.entrypoints=web"

図6 ダッシュボードを有効にする場合の「docker-compose.yml」ファイルの記述

services:
  reverse-proxy:
    image: traefik:latest
    restart: always
    ports:
      - "80:80"
      - "8080:8080"
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command:
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.dashboard.address=:8080"
      - "--api.dashboard=true"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.entrypoints=dashboard"
      - "traefik.http.routers.api.rule=Host(localhost)"
      - "traefik.http.routers.api.service=api@internal"

  whoami:
    image: traefik/whoami
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=PathPrefix(/whoami)"
      - "traefik.http.routers.whoami.entrypoints=web"

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

providers:
  docker:
    exposedByDefault: false
entryPoints:
  web:
    address: ":80"
  dashboard:
    address: ":8080"
api:
  dashboard: true

図10 設定を分離した場合の「docker-compose.yml」ファイルの記述例

services:
  reverse-proxy:
    image: traefik:latest
    restart: always
    ports:
      - "80:80"
      - "8080:8080"
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.yml:/etc/traefik/traefik.yml
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.entrypoints=dashboard"
      - "traefik.http.routers.api.rule=Host(localhost)"
      - "traefik.http.routers.api.service=api@internal"

  whoami:
    image: traefik/whoami
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=PathPrefix(/whoami)"
      - "traefik.http.routers.whoami.entrypoints=web"
   - "traefik.http.services.myservice.loadbalancer.server.port=80"

中小企業手作りIT化奮戦記(Vol.84掲載)

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

筆者:菅 雄一

自社サーバーからレンタルサーバーへの移行が世の流れだ。本連載の第58回「PHP+MySQL環境にシステムを移行」に書いたが、筆者の勤務先でも保守作業の軽減や故障回避のためにレンタルサーバーに移行する方針になった。2023年1月に、四苦八苦しながら顧客向けWeb検索システムを移行し、ようやくレンタルサーバーへの移行が一段落した。今回は、この難航した移行作業について書くことにする。

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

図2 バックアップファイル内の文字コード設定を変更

--
-- PostgreSQL database dump
--

SET client_encoding = 'EUC';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;
(略)

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

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

著者:飯尾 淳

本連載では「Pythonを昔から使っているものの、それほど使いこなしてはいない」という筆者が、いろいろな日常業務をPythonで処理することで、立派な「蛇使い」に育つことを目指します。その過程を温
かく見守ってください。皆さんと共に勉強していきましょう。第14回では、話題のAIチャットボット「ChatGPT」を使ったPythonプログ「ラムの作成にチャレンジします。ChatGPTは、どの程度のプログラムを生成してくれるのでしょうか。

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

図2 1回目にChatGPTが生成したPythonプログラム

import sys

if len(sys.argv) < 3:
    print("Usage: python program_name.py num1 num2")
else:
    num1 = float(sys.argv[1])
    num2 = float(sys.argv[2])
    result = num1 + num2
    print("Result:", result)

図3 2回目にChatGPTが生成したPythonプログラム

import sys
from fractions import Fraction

if len(sys.argv) < 3:
    print("Usage: python program_name.py num1 num2")
else:
    try:
        num1 = float(sys.argv[1])
        num2 = float(sys.argv[2])
        if num1.is_integer() and num2.is_integer():
            num1, num2 = int(num1), int(num2)
        elif '/' in sys.argv[1] and '/' in sys.argv[2]:
            num1 = Fraction(sys.argv[1])
            num2 = Fraction(sys.argv[2])
        result = num1 + num2
        print("Result:", result)
    except ValueError:
        print("Please enter numbers only.")

図4 3回目にChatGPTが生成したPythonプログラム

import sys
from fractions import Fraction

if len(sys.argv) < 3:
    print("Usage: python program_name.py num1 num2")
else:
    try:
        num1 = 0
        if '/' in sys.argv[1]:
            num1 = Fraction(sys.argv[1])
        else:
            num1 = float(sys.argv[1])
        num2 = 0
        if '/' in sys.argv[2]:
            num2 = Fraction(sys.argv[2])
        else:
            num2 = float(sys.argv[2])
        result = num1 + num2
        print("Result:", result)
    except ValueError:
        print("Please enter numbers only.")

図5 4回目にChatGPTが生成したPythonプログラム

import sys
from fractions import Fraction

def check_arg_validity(arg):
    try:
        if '/' in arg:
            num = Fraction(arg)
        else:
            num = float(arg)
        return num
    except ValueError:
        return None

if len(sys.argv) < 3:
    print("Usage: python program_name.py num1 num2")
else:
    try:
        num1 = check_arg_validity(sys.argv[1])
        num2 = check_arg_validity(sys.argv[2])
        if num1 is None or num2 is None:
            print("Please enter numbers only.")
        else:
            result = num1 + num2
            print("Result:", result)

図6 5回目にChatGPTが生成したPythonプログラム

import sys
from fractions import Fraction

def check_number(num_str):
    try:
        float(num_str)
    except ValueError:
        try:
            Fraction(num_str)
        except ValueError:
            print(f"{num_str} is not a valid number.")
            return None
    return num_str

def add2(num1, num2):
    result = Fraction(num1) + Fraction(num2)
    print(f"{num1} + {num2} = {result}")

if __name__ == '__main__':
    num1 = check_number(sys.argv[1])
    num2 = check_number(sys.argv[2])

    if num1 and num2:
        add2(num1, num2)

特別企画 Raspberry Piを100%活用しよう 拡大版(Vol.84記載)

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

著者:米田 聡

小型コンピュータボード「Raspberry Pi」(ラズパイ)向けにさまざまな拡張ボードが発売されています。その拡張ボードとラズパイを組み合わせれば、ラズパイでいろいろなことが簡単に試せます。本企画では、前回に引き続き、ラズパイと連携して使用するマイコンボードを扱います。

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

図8 I★2★CアドレスとGPIOピン番号の設定(ADRS2040U_i2c.h)

 // ADRS2040U I2Cアドレス
 #define I2C0_SLAVE_ADDR 0x41
 
 // I2Cで使うGPIO
 #define GPIO_SDA0 0
 #define GPIO_SCK0 1

図9 I2CとI2C Slaveライブラリの初期化

#include <stdio.h>
#include <pico/stdlib.h>
#include "hardware/i2c.h" ← hardware_i2cライブラリのヘッダーファイル
#include "pico/i2c_slave.h" ← I2C Slaveライブラリのヘッダーファイル
(略)
#include "ADRS2040U_i2c.h"
(略)
static void i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event) ← I★★2C割り込みコールバック関数
{
(略)
}

void i2c_setup(void)
{
    i2c_init(i2c0, 100 * 1000); ← I★2★Cコントローラの初期化(通信速度100Kビット/秒)
    gpio_set_function(GPIO_SDA0, GPIO_FUNC_I2C); ← I★2★Cで利用するGPIOピンの設定
    gpio_set_function(GPIO_SCK0, GPIO_FUNC_I2C);
    // ADRS2040Uでは基板上でプルアップされているので
    // プルアップを無効化する
    gpio_disable_pulls(GPIO_SDA0);
    gpio_disable_pulls(GPIO_SCK0);
(略)
    // I2Cスレーブ初期化
    i2c_slave_init(i2c0, I2C0_SLAVE_ADDR, &i2c_slave_handler);
}

図10 コールバック関数「i2c_slave_handler()」

static void i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event)
{
(略) 
    switch(event) {
        // I2Cデータ受信
        case I2C_SLAVE_RECEIVE:
(略)
            break;
        
        // I2Cデータ要求
        case I2C_SLAVE_REQUEST:
(略)
            break;
        // STOP or RESTARTコンデション
        case I2C_SLAVE_FINISH:
            break;
        
        default:
            break;
    }
}

図11 ADCの初期化で呼び出す関数

adc_init();
adc_gpio_init(26);
adc_select_input(0);

図12 adc_fifo_setup()関数の引数パラメータ

adc_fifo_setup(
    en,
    dreq_en,
    dreq_threash,
    error_in_fifo,
    byte_shift
);

図13 ADCの受信FIFOバッファ割り込み処理のサンプルコード

uint16_t adc_buffer[1024];
static int p = 0;
(略)
// ADC FIFO割り込み関数
void adc_interrupt(void)
{
    // FIFOが空になるまでデータをadc_bufferに読み取る
    while(! adc_fifo_is_empty()) {
        adc_buffer[p++] = adc_fifo_get() & 0xFFF;
    }
}

void main(void)
{
(略)
    adc_fifo_setup(true, false, 1, true, false);
(略)
    // 排他的割り込みの設定
    irq_set_exclusive_handler(ADC_IRQ_FIFO, adc_interrupt);
    // 割り込みの有効化
    irq_set_enabled(ADC_IRQ_FIFO, true);
    // フリーランスタート
    adc_run(true);
(略)
}

図14 サンプリングレート設定のサンプルコード

int sample_rate = 1000;  // 1000 サンプリング/秒

adc_clk = clock_get_hz(clk_adc);
adc_set_clkdiv(adc_clk/sample_rate);

図15 リングバッファのサンプルコード

uint16_t buffer[0x100];
int write_pointer, read_pointer;

write_pointer = read_pointer = 0;

// バッファの読み出し
data = buffer[(read_pointer++) & 0xFF];
// バッファへの書き込み
buffer[(write_pointer++) & 0xFF] = data;

図16 クリティカルセクションの保護

mutex_enter_blocking(&my_mutex);

ここがクリティカルセクション

mutex_exit(&my_mutex);

図17 サンプルファームウエアのレジスタ番号定義(ADRS2040U_i2c.h)

// I2Cレジスタ
enum ADRS2040_CMD {
    ADRS2040_CMD_INVALID,       // 無効
    ADRS2040_CMD_ADC_START,     // ADCフリーラン開始
    ADRS2040_CMD_ADC_STOP,      // ADCフリーラン停止
    ADRS2040_CMD_SET_RATE,      // サンプリングレート設定
    ADRS2040_CMD_GET_COUNT,     // バッファデータ数
    ADRS2040_CMD_GET_VALUE,      // ADCデータ読み取り
};

図18 I2Cスレーブ動作時に使えるFIFOバッファ読み書き関数

// 1バイト読みだし
i2c_read_byte_raw(i2c_inst_t *);
// 指定バイト数の読み出し
i2c_read_raw_blocking(i2c_inst_t *, uint8_t *, size_t);
// 1バイト書き込み
i2c_write_byte_raw(i2c_inst_t *, uint8_t);
// 指定バイト数の書き込み
i2c_write_raw_blocking(i2c_inst_t *, uint8_t *, size_t);

図19 サンプルファームウエアのi2c_slave_handler()関数とその関連個所(main.cpp)

// ADCドライバ
ADC_Driver adcd;


typedef union {
    uint16_t d;
    uint8_t  b[2];
} I2C_WORD_t;


static void i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event)
{
    static uint8_t ADRS2040U_cmd = ADRS2040_CMD_INVALID;

    switch(event) {
        // I2Cデータ受信
        case I2C_SLAVE_RECEIVE:
            if(ADRS2040U_cmd == ADRS2040_CMD_INVALID) {
                ADRS2040U_cmd = i2c_read_byte_raw(i2c);
            }
            if(ADRS2040U_cmd == ADRS2040_CMD_ADC_START) {
                DEBUG_PRINT("ADC START\n");
                adcd.run(true);
                ADRS2040U_cmd = ADRS2040_CMD_INVALID;
            }
            else if(ADRS2040U_cmd == ADRS2040_CMD_ADC_STOP) {
                DEBUG_PRINT("ADC STOP\n");
                adcd.run(false);
                ADRS2040U_cmd = ADRS2040_CMD_INVALID;

            }
            else if(ADRS2040U_cmd == ADRS2040_CMD_SET_RATE) {
                I2C_WORD_t rate;
                i2c_read_raw_blocking(i2c, rate.b, sizeof(I2C_WORD_t));
                DEBUG_PRINT("Rate = %d\n", rate.d * 10);
                adcd.set_sample_rate(rate.d * 10);
                ADRS2040U_cmd = ADRS2040_CMD_INVALID;
            }
            break;
        
        // I2Cデータ要求
        case I2C_SLAVE_REQUEST:
            I2C_WORD_t sdata;
            sdata.d = 0;

            if(ADRS2040U_cmd == ADRS2040_CMD_GET_COUNT) {
                sdata.d = adcd.count();
            }
            else if(ADRS2040U_cmd == ADRS2040_CMD_GET_VALUE) {
                int value = adcd.get_value();

                if( value >= 0) {
                    sdata.d = value & 0xFFF;
                }
                else {
                    sdata.d = 0xFFFF;
                }
            }
            i2c_write_raw_blocking(i2c, sdata.b, sizeof(I2C_WORD_t));
            ADRS2040U_cmd = ADRS2040_CMD_INVALID;

            break;
        // STOP or RESTARTコンデション
        case I2C_SLAVE_FINISH:
            break;
        
        default:
            break;
    }
}
(略)
int main(void)
{
    stdio_init_all();
    i2c_setup();
    while (true)
    {
        ;
    }
}

図20 受信FIFOバッファからデータを取り出すための前処理

i2c_hw_t *i2chw = i2c_get_hw(i2c0);
uint32_t datacmd = i2chw->data_cmd; // FIFOからデータを取り出す
uintu_t value = datacmd & I2C_IC_DATA_CMD_DAT_BITS; // 下位8ビットがデータ本体
if(datacmd & I2C_IC_DATA_CMD_FIRST_DATA_BYTE_BITS) {
    // I2Cアドレスに続く最初の書き込みバイト
    // つまりレジスタ番号
}

図22 ADCへアクセスするサンプルプログラム(adcsample.py)

from smbus2 import SMBus

ADRS2040_ADDR=0x41
ADRS2040_CMD_INVALID      = 0
ADRS2040_CMD_ADC_START    = 1
ADRS2040_CMD_ADC_STOP     = 2
ADRS2040_CMD_SET_RATE     = 3
ADRS2040_CMD_GET_COUNT    = 4
ADRS2040_CMD_GET_VALUE    = 5

with SMBus(1) as i2c:
    # 500 spsで初期化・スタート
    self.i2c.write_word_data(ADRS2040_ADDR, ADRS2040_CMD_SET_RATE, 50)
    self.i2c.write_byte(ADRS2040_ADDR, ADRS2040_CMD_ADC_START)

    while True:
        nod = 0
        nod = self.i2c.read_word_data(ADRS2040_ADDR,ADRS2040_CMD_GET_COUNT)
        for i in range(nod):
            value = self.i2c.read_word_data(ADRS2040_ADDR,ADRS2040_CMD_GET_VALUE)
            print(value)

図23 ADCから取得したデータをグラフ化するサンプルプログラム(adctest.py)

from smbus2 import SMBus
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
import sys
import time

# 定数
ADRS2040_ADDR=0x41
ADRS2040_CMD_INVALID      = 0
ADRS2040_CMD_ADC_START    = 1
ADRS2040_CMD_ADC_STOP     = 2
ADRS2040_CMD_SET_RATE     = 3
ADRS2040_CMD_GET_COUNT    = 4
ADRS2040_CMD_GET_VALUE    = 5

class ADCGraph:
    def __init__(self):
        # グラフウィンドウ
        self.win = pg.GraphicsWindow()
        self.win.setWindowTitle('ADC Input')
        self.plt = self.win.addPlot()
        self.plt.setYRange(0,1024)
        self.curve = self.plt.plot(pen=(0, 0, 255))

        # グラフデータを用意
        self.data = np.zeros(100)

        self.i2c = SMBus(1)
        # 500 spsで初期化・スタート
        self.i2c.write_word_data(ADRS2040_ADDR, ADRS2040_CMD_SET_RATE, 50)
        self.i2c.write_byte(ADRS2040_ADDR, ADRS2040_CMD_ADC_START)

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.update)
        # 10msごとに更新
        self.timer.start(10)

    # グラフ更新
    def update(self):
        nod = 0
        nod = self.i2c.read_word_data(ADRS2040_ADDR,ADRS2040_CMD_GET_COUNT )
        for i in range(nod):
            value = self.i2c.read_word_data(ADRS2040_ADDR,ADRS2040_CMD_GET_VALUE)
            self.data = np.delete(self.data, 0)
            self.data = np.append(self.data, value)
        self.curve.setData(self.data)

if __name__ == "__main__":
    graphWin = ADCGraph()

    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

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

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

004 レポート オープンソースLLM「MPT-7B」登場
005 レポート メタバースファッションフェア初開催
006 製品レビュー 調理家電「コーヒー豆焙煎機 MR-F60A」
007 NEWS FLASH
008 特集1 pandasを使いこなそう/鶴長鎮一
020 特集2 AutoML徹底解説 応用編/田村孝、山口武彦、新田陸、細野友基
034 特別企画 Raspberry Piを100%活用しよう 拡大版/米田聡 コード掲載
046 注目技術「XR BASE」/井上香
048 Pythonあれこれ/飯尾淳 コード掲載
054 法林浩之のFIGHTING TALKS/法林浩之
056 中小企業手作りIT化奮戦記/菅雄一 コード掲載
060 ツールキット/桑原滝弥、イケヤシロウ
062 タイ語から分かる現地生活/つじみき
068 香川大学SLPからお届け!/三井颯剛 コード掲載
075 Hello Nogyo!
076 行動経済学と心理学で円滑に業務を遂行/請園正敏
080 Linux定番エディタ入門/大津真 コード掲載
086 AWKでデジタル信号処理/斉藤博文 コード掲載
094 Techパズル/gori.sh
095 コラム「ユニケージにおける独特なドキュメント」/シェル魔人

Vol.84

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

 世の中には、さまざまなデータが存在します。それらのデータを分析して課題解決や意思決定につなげていく「データサイエンティスト」という職業が近年注目されています。特集1では、プログラミング言語「Python」における人気のデータ分析ライブラリ「pandas」の使い方を紹介します。このpandasは、データサイエンティストにとって、とても有用なライブラリです。
 特集2では、前回に引き続き、AI(人工知能)の機械学習において最近話題の「AutoML」(Automated Machine Learning)を解説します。AutoMLは、機械学習モデルに係る作業を完全に自動化し、機械学習の知識がなくても簡単にAIの実装を可能にする技術です。データサイエンティストなどの専門家でなくてもAIが扱えます。今回の応用編では、IBM Cloudの「AutoAI」上で、データの収集から、AutoMLの活用、業務への適用、運用までの利用事例を紹介します。
 特別企画は、2023年3月10日にビット・トレード・ワンから発売された拡張ボード「ラズベリーパイ接続 RP2040エッジアクセラレータ」の使い方の後編です。同ボードは、Raspberry Pi Picoに搭載されているArmプロセッサ「RP2040」を備えていて、Raspberry Pi Pico以外のRaspberry Piと連携して利用します。後編では、C++言語で拡張ボードのファームウエアを開発し、同ボードに搭載されているアナログ/デジタルコンバータ(ADC)からの出力をラズパイに渡してグラフ化します。
 このほか、新連載として「Linux定番エディタ入門」が始まりました。初回は「nano」エディタです。「Vim」や「Visual Studio Code」なども紹介する予定です。
 今回も読み応え十分のシェルスクリプトマガジン Vol.84。お見逃しなく!

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

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

Vol.84 補足情報

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

製品レビュー コーヒー豆焙煎機 MR-F60A

p.6に記した発売日の「2023年3月30日」は誤りでした。正しくは「2023年4月4日」です。お詫びして訂正いたします。

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

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

  • -->