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

test

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

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

著者:飯尾淳

本連載では「Pythonを昔から使っているものの、それほど使いこなしてはいない」という筆者が、いろいろな日常業務をPythonで処理することで、立派な「蛇使い」に育つことを目指します。その過程を温かく見守ってください。皆さんと共に勉強していきましょう。第1回は、アンケート結果から非定型なデータを取り出して集計します。

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

図5 形態素解析の処理をするPythonコード

#!/usr/bin/env python
import spacy
import sys

nlp = spacy.load('ja_ginza')

for line in sys.stdin:                 # 一行ずつ処理
  for sent in nlp(line.strip()).sents: # 一文ずつに分解
    for token in sent:                 # さらに文中のトークンごとに処理
      # i:トークン番号, orth_:表層形, lemma_:基本形,
      # pos_:品詞(英語), tag_:品詞細分類(日本語)
      sys.stdout.write(f'{token.i}\t{token.orth_}\t{token.lemma_}\t'
                       f'{token.pos_}\t{token.tag_}\n')
    sys.stdout.write('EOS\n')

図7 名詞の連接処理と抽出をするPythonコード

#!/usr/bin/env python

import sys
import re

def sequence_gen():
  sequence = []
  for line in sys.stdin:
    if line == 'EOS\n':
      yield sequence
      sequence = []
      continue
    word_info = line.strip().split('\t')
    pos = word_info[4].split('-')
    sequence.append({'surface': word_info[1],
                     'base': word_info[2],
                     'pos': pos[0]})

pattern = re.compile('N+')

for seq in sequence_gen():
  encode_str = ''.join('N' if w['pos'] in ('名詞')
                       else '?' for w in seq)
  for m in pattern.finditer(encode_str):
    print(''.join(w['surface'] for w in seq[m.start():m.end()]))

図9 データを分析してプロットするPythonコード

#!/usr/bin/env python

import sys
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import spacy

from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro',
    'Yu Gothic', 'Meiryo', 'Takao', 'IPAexGothic', 'IPAPGothic',
    'VL PGothic', 'Noto Sans CJK JP']
nlp = spacy.load('ja_ginza')
with open(sys.argv[1]) as f:
  texts = [s.strip() for s in f.readlines()]
vectors = [nlp(t).vector for t in texts]
pca = PCA(n_components=2).fit(vectors)
trans = pca.fit_transform(vectors)
pc_ratio = pca.explained_variance_ratio_
plt.figure()
plt.scatter(trans[:,0], trans[:,1])
i = 0
for txt in texts:
  plt.text(trans[i,0]+0.02, trans[i,1]-0.02, txt)
  i += 1
plt.hlines(0, min(trans[:,0]), max(trans[:,0]),
            linestyle='dashed', linewidth=1)
plt.vlines(0, min(trans[:,1]), max(trans[:,1]),
            linestyle='dashed', linewidth=1)
plt.xlabel('PC1 ('+str(round(pc_ratio[0]*100,2))+'%)')
plt.ylabel('PC2 ('+str(round(pc_ratio[1]*100,2))+'%)')
plt.tight_layout()
plt.show()

特別企画 ゼロから始めるEthereum(Vol.71記載)

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

著者 志茂博、高畑祐輔

「インターネット誕生以来の革命」と称されることもあるブロックチェーン。そのブロックチェーン技術を利用したものの中で、幅広い用途での活用が注目されている「Ethereum(イーサリアム)」という分散アプリケーション基盤について解説します。後半では、実際に自分専用のブロックチェーンを立ち上げて操作する方法を紹介します。Ethereumとブロックチェーンの世界を体験してみてください。

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

図4 「genesis.json」ファイルに記述する内容

{
  "config": {
    "chainId": 15
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}

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

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

著者:樋口史弥

COVID-19の流行により、香川大学でもサークル活動に制限がかかっています。そこで、ICカードと非接触ICカードリーダーを用いて、部室の入退室をモニタリングするシステムを作成しました。部室の利用状況をリアルタイムに確認できれば密を避ける目安になりますし、何かあったときのための記録としても有用です。

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

図6 IDmを読み取って表示するPythonコード

import nfc
import binascii

def on_connect(tag):
  data={'idm': binascii.hexlify(tag.idm).decode('utf-8')}
  print(data)
  return True

def main():
  with nfc.ContactlessFrontend('usb:ベンダーID:プロダクトID') as clf:
    while clf.connect(rdwr={'targets': ['212F'],
                            'on-connect': on_connect}):
      pass

if __name__ == "__main__":
  main()

図7 サーバーと連携させるために挿入するPythonコード

import json
from os import getenv
import urllib.request

def post_data(data):
  headers = { 'Content-Type': 'application/json', }
  req = urllib.request.Request(getenv('REQUEST_URI'),
                               data=json.dumps(data).encode('utf-8'),
                               headers=headers, method='POST')
  try:
    with urllib.request.urlopen(req) as res:
      if res.code == 200:
        result = json.loads(res.read().decode('utf-8'))['result']
        if result == 'in':
          print('IN')
        else:
          print('OUT')
  except urllib.error.HTTPError as err:
    print("err: ", err.read())

図12 退出かどうかを調べるSQL 文

$sql = 'SELECT * '.
        'FROM log INNER JOIN user '.
        'ON log.user_id=user.id '.
        'WHERE exit_time IS NULL '.
        'AND enter_time >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY) '.
        'AND user.idm=? '.
        'ORDER BY log.enter_time DESC LIMIT 1';

図13 入室情報を表示するコード(index.js)により追加される情報の例

<div class="use_now">
  <div>
    <div class="time">2021-03-12 12:54:31</div>
    <div class="name">guest</div>
  </div>
  <div>
    <div class="time">2021-03-12 12:42:27</div>
    <div class="name">user1</div>
  </div>
</div>

図15 音を鳴らすために挿入するPythonコード

from gpiozero import TonalBuzzer
from gpiozero.tones import Tone
from time import sleep

def beep(hertz):
  bz = TonalBuzzer(4)
  bz.play(Tone(frequency=hertz))
  sleep(0.2)
  bz.stop()

特集3 ラズパイでQ&Aサイトを構築(Vol.71記載)

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

著者 麻生二郎

小型コンピュータボード「Raspberry Pi」(ラズパイ)の最大の特徴(Picoを除く)は、LinuxなどのOSが動作することです。そのOSとして「Ubuntu」という、パソコンやサーバー向けで人気の高いLinuxディストリビューションが利用できます。本特集では、ラズパイとUbuntuを組み合わせて、Stack Overflowに似たサービスを提供できるQ&Aサイトを構築します。

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

図20 無線LANの設定

    wifis:
        wlan0:
            access-points:
                SSID:
                    password: パスワード
            dhcp4: true

図27 固定IPアドレスを割り当てる

wifis:
  wlan0:
    dhcp4: false
    addresses: [192.168.10.100/24]
    gateway4: 192.168.10.1
    nameservers:
      addresses: [192.168.10.1]
    access-points:
            SSID:
              password: パスワード

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

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

004 レポート Linuxシス管向け日本語講座
005 レポート Windows 10用無償RPAツール
006 NEWS FLASH
008 特集1 はじめてのExcel VBA/松井元
018 特集2 1Rでも快適なテレワーク環境/北谷明日香
030 特集3 ラズパイ4でQ&Aサイトを構築する/麻生二郎 コード掲載
040 特別企画 ゼロから始めるEthereum/志茂博、高畑祐輔 コード掲載
051 Hello Nogyo!
052 Raspberry Piを100%活用しよう/米田聡
056 レッドハットのプロダクト/田中司恩
065 MySQLのチューニング/稲垣大助
064 Webhook/桑原滝弥、イケヤシロウ
074 香川大学SLPからお届け!/樋口史弥 コード掲載
080 法林浩之のFIGHTING TALKS/法林浩之
082 中小企業手作りIT化奮戦記/菅雄一
086 Pythonあれこれ/飯尾淳 コード掲載
092 Bash入門/大津真
098 Techパズル/gori.sh
100 コラム『ユニケージの作法は「生き方」に通じる』/シェル魔人

Vol.71

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

 社会人になって最も使っているソフトウエアといえば、「表計算ソフト」でしょう。その表計算ソフトの代表ともいえるのが「Micrsoft Excel」です。
 それでは、「Microsoft Excelが備える『マクロ』を利用したことはありますか」という質問には、多くの人がノー(NO)と答えるでしょう。マクロは、表の作成や計算に伴う手作業を自動化し、業務効率を大幅に向上できる大切な機能です。
 特集1では、Microsoft Excelのマクロを利用するためのプログラミング言語である「VBA」を紹介します。VBAを使い始めたい人向けの内容で、プログラミングスキルがない人でも理解しやすいように解説しています。
 特集2では、一人暮らしの人向けに、テレワーク時代におけるインテリアコーディネーションのポイントを解説しました。コロナ禍によって在宅勤務を強いられ、自宅でのテレワークが一般的になっています。ただ、ワンルームや1Kといった1部屋の空間では、仕事とプライベートを分けることが難しく、「仕事がぜんぜん進まない」「休憩がまったく取れない」のような状況に陥ることが多いでしょう。インテリアの観点からそのような状況に陥らない工夫を紹介しています。
 特集3では、小型コンピュータボード「Raspberry Pi」(ラズパイ)と、人気のLinuxディストリビューション「Ubuntu」を組み合わせて、実用性の高いサーバーを構築する方法を紹介しました。Stack Overflowライクな「Q&Aサイト」が簡単に立ち上げられるので、ぜひ試してみてください。
 特別企画は、グロックチェーンの「Ethereum」(イーサリアム)を解説しました。ビットコインのような仮想通貨だけではなく、企業間取引の中核システムにも活用できるEthereumなので、ぜひこの機会にEthereumを学んでみましょう。
 このほかに、2本の連載が始まりました。一つは、プログラミング言語「Python」をさまざまなことを利用する「Pythonあれこれ」、もう一つは、Linuxの標準シェル「Bash」の入門です。今回も読み応え十分のシェルスクリプトマガジン Vol.71。お見逃しなく!

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

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

Vol.71 補足情報

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

目次

 p.3の先頭の行にあるページ数の「44」は「56」の誤りです。お詫びして訂正いたします。

レポート

 p.4で紹介した20%割引クーポンは、Linux30周年に伴って30%割引に変更されました。

連載 Red Hatのプロダクト

 p.62の右上にある『を実行して「oc」コマンドを入手します』は、『を実行して「oc」コマンドのパスを確認します』の誤りです。お詫びして訂正いたします。

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

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

  • -->