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

test

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

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

著者:川本真子

 私は最近、To Doリストを管理するGU(I Graphical User Interface)アプリをPythonで作成しました。作成には、Pythonの標準GUIライブラリの「Tkinter」(https://docs.python.org/ja/3/library/tkinter.html)を用いています。今回は、そのGUIアプリの実装について紹介します。

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

図7 フレーム配置用のコード

# フレームの作成
fr_title = tk.Frame(root, width=650, height=40, bd=5, relief='solid')
fr_genre = tk.Frame(root, width=650, height=45, bd=5, relief='solid')
fr_add   = tk.Frame(root, width=650, height=70, bd=5, relief='solid')
fr_op    = tk.Frame(fr_add, width=100, height=65, bd=5, relief='solid')
fr_must  = tk.Frame(root, width=325, height=260, bd=5, relief='solid')
fr_mlist = tk.Frame(fr_must, width=315, height=190, bd=5, relief='solid')
fr_want  = tk.Frame(root, width=325, height=260, bd=5, relief='solid')
fr_wlist = tk.Frame(fr_want, width=315, height=190, bd=5, relief='solid')
# フレームのサイズを固定
fr_title.grid_propagate(False)
fr_add.grid_propagate(False)
fr_op.grid_propagate(False)
fr_genre.grid_propagate(False)
fr_must.grid_propagate(False)
fr_mlist.grid_propagate(False)
fr_want.grid_propagate(False)
fr_wlist.grid_propagate(False)
# フレームを配置
fr_title.grid(row=0, column=0, columnspan=2, sticky=tk.EW)
fr_genre.grid(row=1, column=0, columnspan=2, sticky=tk.EW)
fr_add.grid(row=2, column=0, columnspan=2, sticky=tk.EW)
fr_must.grid(row=3, column=0)
fr_want.grid(row=3, column=1)

図9 グローバル変数を定義するコード

btnge = 'sc'
color = '#A8EEFF'
la_text = '学校のTo Do'
textlist = []

図10 ウィジェット配置用のコード

# fr_genreのウィジェット
buttonsc = tk.Button(fr_genre, text="学校", state=tk.DISABLED, bg='#A8EEFF', font=font1,
                     command=lambda:genre(buttonli, buttonsc, 'sc', la_title, label_ge, label_m, label_w))
buttonli = tk.Button(fr_genre, text="生活", state=tk.NORMAL, bg='#FFF9A8', font=font1,
                     command=lambda:genre(buttonsc, buttonli, 'li', la_title, label_ge, label_m, label_w))
# fr_titleのウィジェット
la_title = tk.Label(fr_title, text="今日のTo Do", bg=color, font=font1)
# fr_addのウィジェット
label_ge = tk.Label(fr_add, text=la_text, bg=color, font=font1)
entry = tk.Entry(fr_add, width=30, font=font1)
rad = tk.StringVar()
rad.set('Must')
radio_m = tk.Radiobutton(fr_op, text='Must', font=font1, value='Must', variable=rad)
radio_w = tk.Radiobutton(fr_op, text='Want', font=font1, value='Want', variable=rad)
button_add = tk.Button(fr_add, text="追加", font=font1, command = lambda:add(rad))
# fr_mustのウィジェット
label_m = tk.Label(fr_must, text="Must", bg=color, font=font1)
de_must = tk.Button(fr_must, text="削除", font=font1, command=lambda:deletion('Must'))
# fr_wantのウィジェット
label_w = tk.Label(fr_want, text="Want", bg=color, font=font1)
de_want = tk.Button(fr_want, text="削除", font=font1, command=lambda:deletion('Want'))
# ウィジェットと残りのフレームの配置
la_title.grid()
buttonsc.grid(row=0, column=0)
buttonli.grid(row=0, column=1)
label_ge.grid(row=0, column=0)
entry.grid(row=0, column=1)
fr_op.grid(row=0, column=2)
button_add.grid(row=0, column=3)
radio_m.grid(row=0, column=0)
radio_w.grid(row=1, column=0)
label_m.grid()
fr_mlist.grid()
de_must.grid()
label_w.grid()
fr_wlist.grid()
de_want.grid()

図12 クラスと関数を定義するコード

class Text:
  def __init__(self, box, de, fr, te, ch, pr, ge):
    self.box = box # チェックボックスの変数
    self.de = de   # 完了は「fin」、未完了は「unfin」
    self.fr = fr   # チェックボックスの表示フレーム
    self.te = te   # To Doの内容
    self.ch = ch   # チェックの有無
    self.pr = pr   # MustかWantか
    self.ge = ge   # 学校か生活か

def add(rad):
  text = tk.StringVar()
  text.set((entry.get()))
  entry.delete(0, tk.END)
  check = tk.StringVar()
  check.set('0')
  if rad.get() == 'Must':
    frame = fr_mlist
    priority = 'Must'
  else:
    frame = fr_wlist
    priority = 'Want'
  box = tk.Checkbutton(frame, textvariable=text,
                       variable=check, font=font1)
  tex=Text(box, 'unfin' ,frame, text, check, priority, btnge)
  textlist.append(tex)
  todo()

def todo():
  i = 0
  for t in textlist:
    if t.de == 'unfin':
      if t.ge == btnge:
        t.box.grid(row=i, sticky = tk.W)
    i += 1

def deletion(pri):
  for t in textlist:
    if t.pr == pri:
      if t.ge == btnge:
        if t.ch.get() == '1':
          t.de = 'fin'
          t.box.destroy()
  todo()

def genre(button, buclick, gen, la_title,
          label_ge, label_m, label_w):
  button['state'] = tk.NORMAL
  buclick['state'] = tk.DISABLED
  global btnge
  global color
  global la_text
  btnge = gen
  if (gen == 'sc'):
    color = '#A8EEFF'
    la_text = '学校のTo Do'
  else:
    color = '#FFF9A8'
    la_text = '生活のTo Do'
  la_title['bg'] = color
  label_ge['bg'] = color
  label_ge['text'] = la_text
  label_m['bg'] = color
  label_w['bg'] = color
  # チェックボックスを破棄して再作成
  for t in textlist:
    t.box.destroy()
    t.box = tk.Checkbutton(t.fr, textvariable=t.te,
                           variable = t.ch, font=font1)
  todo()

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

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

著者:飯尾 淳

本連載では「Pythonを昔から使っているものの、それほど使いこなしてはいない」という筆者が、いろいろな日常業務をPythonで処理することで、立派な「蛇使い」に育つことを目指します。その過程を温かく見守ってください。皆さんと共に勉強していきましょう。第24回では、高校で学ぶレベルの数学を用いて、問題を最適にする解は何かを探索します。題材は、線形計画法と組合せ最適問題の二つです。

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

図3 図1の問題を解くPythonコード

from ortools.linear_solver import pywraplp
# ソルバーの定義
solver = pywraplp.Solver.CreateSolver('GLOP')
# 変数の準備
x = solver.NumVar(0, solver.infinity(), 'x')
y = solver.NumVar(0, solver.infinity(), 'y')
# 目的関数と制約条件の定義
solver.Maximize(400 * x + 300 * y)
solver.Add(60 * x + 40 * y <= 3200)
solver.Add(20 * x + 30 * y <= 2000)
solver.Add(20 * x + 10 * y <= 1000)
# 問題を解く
status = solver.Solve()
# 結果を出力
if status == pywraplp.Solver.OPTIMAL:
  print(f'解:')
  print(f'x = {x.solution_value()}')
  print(f'y = {y.solution_value()}')
else:
  print('最適解は存在しません')

図4 CBCソルバーを使うように書き換えた図3のPythonコード

(略)
# ソルバーの定義
solver = pywraplp.Solver.CreateSolver('CBC')
# 変数の準備
x = solver.IntVar(0, solver.infinity(), 'x')
y = solver.IntVar(0, solver.infinity(), 'y')
(略)

図6 データを準備するためのPythonコード

teachers = ['田中', '山本', '竹村', '飯島', '佐藤']
days = ['月', '火', '水', '木', '金']
periods = ['1限', '2限', '3限', '4限']

図7 lessons連想配列を作成するPythonコード

lessons = { (t, d, p): \
  model.NewBoolVar('lesson_%s_%s_%s' % (t, d, p)) \
    for t in teachers for d in days for p in periods }

図8 lessons連想配列の内容

{('田中', '月', '1限'): lesson_田中_月_1限(0..1),
 ('田中', '月', '2限'): lesson_田中_月_2限(0..1),
 ('田中', '月', '3限'): lesson_田中_月_3限(0..1),
 ('田中', '月', '4限'): lesson_田中_月_4限(0..1),
 ('田中', '火', '1限'): lesson_田中_火_1限(0..1),
 ('田中', '火', '2限'): lesson_田中_火_2限(0..1),
(略)

図9 「同時に2人以上の先生が授業することはない」制約条件を与えるPythonコード

for d in days:
  for p in periods:
    model.Add(sum(lessons[(t, d, p)] for t in teachers) == 1)

図10 「先生は1日に1コマだけ授業を担当する」制約条件を与えるPythonコード

for t in teachers:
  for d in days:
    model.Add(sum(lessons[(t, d, p)] for p in periods) <= 1)

図11 「担当時間数に偏りが出ないように配置する」制約条件を与えるPythonコード

for t in teachers:
  model.Add(sum(lessons[(t, d, p)] \
                  for d in days for p in periods) == 4)

図12 requests連想配列を定義するコードの例

requests = {
  '田中': {
    '月': {'1限': 0, '2限': 0, '3限': 1, '4限': 0},
    '火': {'1限': 0, '2限': 0, '3限': 0, '4限': 0},
    '水': {'1限': 0, '2限': 1, '3限': 0, '4限': 0},
    '木': {'1限': 0, '2限': 0, '3限': 0, '4限': 1},
    '金': {'1限': 0, '2限': 1, '3限': 0, '4限': 0} },
  '山本': {
    '月': {'1限': 1, '2限': 0, '3限': 0, '4限': 0},
    '火': {'1限': 0, '2限': 1, '3限': 0, '4限': 0},
    '水': {'1限': 0, '2限': 0, '3限': 1, '4限': 0},
    '木': {'1限': 1, '2限': 0, '3限': 0, '4限': 0},
    '金': {'1限': 0, '2限': 0, '3限': 0, '4限': 0} },
  '竹村': {
    '月': {'1限': 0, '2限': 1, '3限': 0, '4限': 0},
    '火': {'1限': 0, '2限': 1, '3限': 0, '4限': 0},
    '水': {'1限': 1, '2限': 0, '3限': 0, '4限': 0},
    '木': {'1限': 1, '2限': 0, '3限': 0, '4限': 0},
    '金': {'1限': 0, '2限': 0, '3限': 0, '4限': 0} },
  '飯島': {
    '月': {'1限': 0, '2限': 0, '3限': 0, '4限': 1},
    '火': {'1限': 0, '2限': 0, '3限': 0, '4限': 0},
    '水': {'1限': 0, '2限': 1, '3限': 0, '4限': 0},
    '木': {'1限': 0, '2限': 1, '3限': 0, '4限': 0},
    '金': {'1限': 1, '2限': 0, '3限': 0, '4限': 0} },
  '佐藤': {
    '月': {'1限': 0, '2限': 0, '3限': 0, '4限': 0},
    '火': {'1限': 0, '2限': 0, '3限': 1, '4限': 0},
    '水': {'1限': 0, '2限': 0, '3限': 1, '4限': 0},
    '木': {'1限': 0, '2限': 1, '3限': 0, '4限': 0},
    '金': {'1限': 0, '2限': 0, '3限': 0, '4限': 1} }
  }

図13 目的関数を定義するPythonコード

model.Maximize( \
  sum(requests[t][d][p] * lessons[(t, d, p)] \
    for t in teachers for d in days for p in periods))

図14 結果を表示するPythonコード

for d in days:
  print(d + "曜日:")
  for p in periods:
    for t in teachers:
      if solver.Value(lessons[(t, d, p)]) == 1:
        print(t+'先生が'+p+'の授業を担当する。', end="")
        print() if requests[t][d][p] == 1 else print('※')
  print()

図16 「先生の希望は少なくとも3コマはかなえる」制約条件を与えるPythonコード

for t in teachers:
  model.Add(sum(lessons[(t, d, p)]*requests[t][d][p] \
                for d in days for p in periods) >= 3)

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

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

著者:米田 聡

本連載では、人気のマイコンボード「Raspberry Pi Pico W/WH」を活用していきます。同ボードは、無
線LANやBluetoothの通信機能を搭載し、入手しやすく価格も手頃なので、IoT機器を自作するのに最適なハードウエアです。第8回は前回に引き続き、「Raspberry Pi Pico 2」を扱います。

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

図10 LED点滅のプログラム(blink.c)

#include <stdio.h>
#include "pico/stdlib.h"

int main()
{
    stdio_init_all();

    int flag = 0;
    const unit LED_PIN = PICO_DEFAULT_LED_PIN;

    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    while(true) {
        gpio_put(LED_PIN, flag ^= 1);
        sleep_ms(500);
    }
    return 0;
}

特集2 さくらのレンタルサーバで始める情報発信ガイド(Vol.94記載)

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

著者:前佛雅人

さくらインターネットが提供する「さくらのレンタルサーバ」を利用すれば、「WordPress」を使ったブログサイトなどの制約が少ない、自分だけの情報発信拠点をインターネット上に構築できます。ファイル共有やWikiなどのアプリケーションも思い通りにカスタマイズして利用できます。本特集では、さくらのレンタルサーバを活用した情報発信の方法を紹介します。

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

図8 サンプルHTMLファイル「index.html」の内容

<!DOCTYPE html>
<html>
  <head><title>サンプルWebページ</title></head>
  <body>
    <h1>これはサンプルWebページです</h1>
    <p>次に示すのはカワセミの写真です。</p>
    <p><img src="image.jpg" width="320"></p>
  </body>
</html>

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

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

004 レポート AIチャット「Grok」がXで無料利用
005 レポート 完全オープンなLLM「OpenCoder」
006 製品レビュー ウエアラブル「ViXion01」
007 NEWS FLASH
008 特集1 パソコン仮想化ソフトのVMware Workstation Pro/麻生二郎
019 インタビュー Infinidat Japan 山田秀樹氏
020 特集2 さくらのレンタルサーバで始める情報発信ガイド/前佛雅人 コード掲載
028 特集3 Red Hat Enterprise Linux AI/村木暢哉
034 Raspberry Pi Pico W/WHで始める電子工作/米田聡 コード掲載
038 Markdownを活用する/藤原由来
046 Pythonあれこれ/飯尾淳 コード掲載
052 香川大学SLPからお届け!/川本真子 コード掲載
058 中小企業手作りIT化奮戦記/菅雄一
064 SSHによるリモート管理入門/大津真
072 Techパズル/gori.sh
073 コラム「ユニケージ流のデータ設計法」/シェル魔人

Vol.94

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

 2024年は、仮想化ソフトウエア製品の「VMware」シリーズのライセンス変更が大きな話題となりました。それだけ仮想化技術は、現在のIT業界では重要となっています。VMwareシリーズに含まれる多くの製品は事実上値上がりしましたが、パソコンやMac向けハードウエア仮想化ソフトの「VMware Workstation Pro」と「VMware Fusion Pro」に関しては誰でも無料で使えるようになりました。特集1では、これらの中からVMware Workstation Proの入手・導入方法、仮想的なパソコンハードウエアの作り方と、(ゲスト)OSのインストール方法を解説しています。
 特集2では、国内事業者であるさくらインターネットが提供するクラウドサービス「さくらのレンタルサーバ」を紹介しています。さくらのレンタルサーバでは、月額121円や500円という低価格でWebやメールなどのサーバーをクラウド上で運用できます。サーバーのハードウエアやOSの詳しい知識がなくても運用管理ができるので、お薦めのサービスです。
 特集3では、生成AIのチューニング基盤「Red Hat Enterprise Linux AI」を解説しています。Red Hat Enterprise Linux AIは、大規模言語モデルなどの生成AIに関するチューニングを本格的に行いたいなどの目的に使える便利なソフトウエア環境です。OSのRed Hat Enterprise Linuxと、必要なツールやライブラリが一体化した状態で提供されます。
 このほか、連載「Pythonあれこれ」では、最適化問題を解くためのライブラリ「OR-Tools」について紹介しています。OR-Toolsを使うと、何をどのように割り当てたら最適になるかという問題の最適解が導き出せます。また、連載「Markdownを活用する」では、静的サイトジェネレータ「Hugo」を解説しています。静的サイトジェネレータは、サーバー側にプログラムを置かなくても見栄えの良いWebサイトが簡単に作れる便利なソフトウエアです。
 今回も読み応え十分のシェルスクリプトマガジン Vol.94。お見逃しなく!

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

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

Vol.94 補足情報

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

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

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

  • -->