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

test

特集2 PHP超入門(Vol.60掲載)

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

著者:柏岡秀男

 「PHP」(PHP: Hypertext Preprocessor)は、Webアプリケーションの開発によく使われているプログラミング言語です。本特集では、WindowsやmacOSにPHPプログラムの実行環境やWebサーバー、DBMSサーバーをインストールできる「MAMP」というソフトウエアを使って、PHPプログラミングを手軽に体験する方法を紹介します。これを機会にぜひPHPプログラミングを始めてみてください。

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

図1 現在時刻を表示するWeb ページをPHPで作成した例

<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <title> 現在時刻</title>
</head>
現在時刻は
<?php
  echo date("H:i:s")
?>
です

図10 helloworld.php

<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
 <title>Hello world</title>
</head>
<?php echo "Hello, World!"; ?>

図11 表示したWeb ページのソースコード

<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <title>Hello world</title>
</head>
Hello, World!

図12 sample1.php

<?php
  $a = 1;
  $b = 2;
  echo $a + $b;
?>

図13 以下のサンプルコードの冒頭に付加するコード

<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <title><?php echo __FILE__; ?></title>
</head>

図14 sample2.php

<?php
  $a = " シェルスクリプト";
  $b = " マガジン";
  echo $a . $b;
?>

図15 sample3.php

<pre>
<?php
  $a = array(1,2,3,4,5);
  $b = array("a" => 1,"b" => "abc","c" => "123");
  $c[0] = 123;
  $c[1] = $b;
  var_dump($a);
  var_dump($b);
  var_dump($c);
  echo $a[1];
  echo "\n";
  echo $b["c"];
  echo "\n";
?>
</pre>

図17 if 文の基本構文

<?php
  $a = 1;
  if($a > 10) {
    echo "a は10 より大きい";
  }
?>
<?php
  $a = 1;
  if($a > 10) {
    echo "a は10 より大きい";
  } else {
    echo "a は10 以下";
  }
?>

図18 input.php

<form method="post" action="input.php">
  <input type=text name="a">
  <input type=submit>
</form>
<?php
  var_dump($_POST);
?>

図19 sample_input.php

<form method="post" action="sample_input.php">
  <input type=text name="a">
  <input type=submit>
</form>
<?php
  if($_POST["a"] > 10 ) echo "10 より大きい";
?>

図20 sample_input2.php

<form method="post" action="sample_input2.php">
  <input type=text name="a" >
  <input type=submit>
</form>
<?php
  if (isset($_POST["a"])) {
    if($_POST["a"] > 10 ) {
      echo "10 より大きい";
    } else {
      echo "10 以下";
    }
  } else {
    echo " 数字を入力してください";
  }
?>

図25 connect.php

<?php
  try {
    $dbh = new PDO(
      "mysql:host=localhost;dbname=sampledatabase;charset=utf8",
      "phpuser","testpassword"
    );
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  } catch (Exception $e) {
    die(" データベース接続失敗 ".$e->getMessage());
  }
  echo " 接続できました";
?>

図26 input.html

<!DOCTYPE html>
<head>
  <title>TODO データの入力画面</title>
</head>
<form method="post" action="add.php">
  <input type=text name="todo">
  <input type=submit>
</form>
TODO データを入力してください

図27 add.php

<?php
  var_dump($_POST);
  try {
    $dbh = new PDO(
      "mysql:host=localhost;dbname=sampledatabase;charset=utf8",
      "phpuser","testpassword"
    );
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO sample (todo) VALUES (:todo_value)";
    $stmt = $dbh->prepare($sql);
    $todo = urldecode($_POST["todo"]);
    $stmt->bindValue(":todo_value", $todo, PDO::PARAM_STR);
    $stmt->execute();
    echo " データを登録しました";
  } catch (Exception $e) {
    die(" データベース接続失敗 ".$e->getMessage());
  }
?>

図28 list.php

<?php
  try {
    $dbh = new PDO(
      "mysql:host=localhost;dbname=sampledatabase;charset=utf8",
      "phpuser","testpassword"
    );
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT * FROM sample WHERE status IS NULL";
    $res = $dbh->query($sql);
    foreach($res as $row) {
      echo htmlspecialchars($row["todo"], ENT_QUOTES);
      echo "<br />";
    }
  } catch (Exception $e) {
    die(" データベース接続失敗 ".$e->getMessage());
  }
?>

図30 list2.php

<?php
  try {
    $dbh = new PDO(
    "mysql:host=localhost;dbname=sampledatabase;charset=utf8",
    "phpuser","testpassword"
    );
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT * FROM sample WHERE status IS NULL";
    $res = $dbh->query($sql);
    foreach($res as $row) {
      $id = htmlspecialchars($row["id"], ENT_QUOTES);
      echo htmlspecialchars($row["todo"], ENT_QUOTES);
    echo "<a href='update.php?id=" . $id . "'> 完了</a><br />";
    }
  } catch (Exception $e) {
    die(" データベース接続失敗 ".$e->getMessage());
  }
?>

図31 update.php

<?php
  try {
    $dbh = new PDO(
      "mysql:host=localhost;dbname=sampledatabase;charset=utf8",
      "phpuser","testpassword"
    );
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "UPDATE sample SET status = 1 WHERE id = :id_value";

    $stmt = $dbh->prepare($sql);
    $id = (int) $_GET["id"];
    $stmt->bindValue(":id_value", $id, PDO::PARAM_INT);
    $stmt->execute();
    echo " データを更新しました";
  } catch (Exception $e) {
    die(" データベース接続失敗 ".$e->getMessage());
  }
?>

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

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

著者:山下賢治

 今回は、Webブラウザでアクセスできる予定共有アプリの作成方法を紹介します。Webアプリケーションフレームワークの「Ruby on Rails」と、JavaScriptのライブラリである「FullCalendar」を組み合わせることで、マウス操作で予定の追加や変更が可能な予定共有アプリを手軽に作成できます。

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

図2 ルーティング設定

Rails.application.routes.draw do
  resources :calendar, only: [:index]
end

図3 アプリのViewを作成する手順

<div id="calendar"></div>
$(document).on 'turbolinks:load',->
  $('#calendar').fullCalendar({})
  return
$(document).on 'turbolinks:before-cache',->
  $('#calendar').empty()
  return
/*
  *= require_tree .
  *= require_self
  *= require fullcalendar
*/
//= require moment
//= require jquery
//= require fullcalendar
//= require fullcalendar/locale-all
//= require fullcalendar/lang/ja
$(function(){
  $('#calendar').fullCalendar({});
})

図5 ルーティング設定の変更

Rails.application.routes.draw do
  resources :calendar, only: [:index]
  resources :schedules, only: [:index, :create]
end

図6 登録データをJSON形式で取り出すコードを追加

class SchedulesController < ApplicationController
  def index
    schedules = Schedule.all
    respond_to do |format|
      format.json {
        ender json:
        schedules.to_json()
      }
    end
  end
end

図7 登録済みのデータを表示するコードを追加

//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
//= require moment
//= require jquery
//= require fullcalendar
//= require fullcalendar/locale-all
//= require fullcalendar/lang/ja
$(function(){
  $('#calendar').fullCalendar({
    events: '/schedules.json'
  });
})

図9 「app/assets/javascripts/application.js」のコード改造例

$('#calendar').fullCalendar({
  selectable: true,
  selectHelper: true,
  draggable: true,
  select: function(start, end) {
    var title = prompt("予定名");
    var scheduleData;
    if ( title ) {
      scheduleData = {
        title: title,
        start: start,
        end: end
      };
      $('#calendar').fullCalendar('renderEvent', scheduleData, true);
      createSchedule(scheduleData);
    }
    $('#calendar').fullCalendar('unselect')
  },
  events: '/schedules.json'
});
createSchedule = function(scheduleData) {
  $.ajax({
    type: 'POST',
    url: "/schedules",
    data: {
      title: scheduleData.title,
      start: String(scheduleData.start),
      end: String(scheduleData.end),
      authenticity_token: $("#authenticity_token").val()
    }
  }).done(function(data) {
    alert("登録しました");
  }).fail(function(data) {
    alert("登録失敗しました");
  });
};

図10 「app/views/calendar/index.html.erb」ファイルに追加する記述

<%= hidden_field_tag "authenticity_token", form_authenticity_token %>

図11 「app/controllers/schedules_controller.rb」ファイルに追加する記述

def create
   Schedule.create(
     title: params[:title],
     start: DateTime.parse(params[:start]),
     end: DateTime.parse(params[:end])
   )
 end

ユニケージ新コードレビュー(Vol.60掲載)

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

著者:岡田健

 ユニケージでは、小さな道具の「コマンド」をシェルスクリプトで組み合わせて、さまざまな業務システムを構築しています。本連載では、毎回あるテーマに従ってユニケージによるシェルスクリプトの記述例を分かりやすく紹介します。第7回は、書き方のルールとなるお作法と分かりやすいコードの書き方について解説します。

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

図1 売上計算するシェルスクリプト

cat SALES                       |
#  1:店舗 2:商品No 3:日付 4:売数
#  5:売上 6:割引
join1 key=2 PRICE               | # 原価 / 売価を連結
#  1:店舗 2:商品No 3:原価 4:売価
#  5:日付 6:売数   7:売上 8:割引
join1 key=2 CATEGORY            | # 部門を連結
#  1:店舗 2:商品No 3:部門 4:原価
#  5:売価 6:日付   7:売数 8:売上
#  9:割引
lcalc '$3,$7,$8,$8-$7*$4'       | # 売数 / 売上 / 荒利計算
#  1:部門 2:売数 3:売上 4:粗利
msort key=1                     | # 部門でソート
sm2 1 1 2 4                     | # 売数 / 売上 / 荒利集計
sm5 1 1 2 4                     | # 合計行の付加
divsen 2 3 4                    | # 千で除算
divsen 3 4                      | # 千で再除算
lcalc '$1,$2,$3,$4,100*$4/$3'   | # 荒利率を求める
#  1:部門   2:売数 3:売上 4:粗利
#  5:粗利率
marume 5.1                      | # 四捨五入
join2 key=1 CATEGORY_NAME       | # カテゴリ名の連結
#  1:部門 2:部門名 3:売数 4:売上
#  5:粗利 6:粗利率
comma 3 4 5                     | # カンマ編集
keta                            | # 桁そろえ
keisen +e                       | # 罫線を引く
cat header -                      # 出力

図2 awkによる長いコードが挿入されたシェルスクリプト

cat ZAIKO             |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
(略)

図3 在庫を扱うシェルスクリプトの先頭部分

cat ZAIKO             |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
cjoin2 key=1 SHOHIN - |
#  1:商品CD   2:商品名      3:規格CD     4:拠点CD
#  5:サイズCD 6:産地CD      7:ブランドCD 8:仕入先CD
#  9:発注先CD 10:在庫発生日 11:製造日    12:販売日
#  13:数量
cjoin2 key=3 KIKAKU - |
#  1:商品CD   2:商品名    3:規格CD      4:規格名
#  5:拠点CD   6:サイズCD  7:産地CD      8:ブランドCD
#  9:仕入先CD 10:発注先CD 11:在庫発生日 12:製造日
#  13:販売日  14:数量
(略)

図4 各種マスターを使って在庫に名称を挿入するシェルスクリプトの一部

cat ZAIKO             |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
cjoin2 key=1 SHOHIN - |
#  1:商品CD   2:商品名      3:規格CD     4:拠点CD
#  5:サイズCD 6:産地CD      7:ブランドCD 8:仕入先CD
#  9:発注先CD 10:在庫発生日 11:製造日    12:販売日
#  13:数量
cjoin2 key=3 KIKAKU - |
#  1:商品CD   2:商品名    3:規格CD      4:規格名
#  5:拠点CD   6:サイズCD  7:産地CD      8:ブランドCD
#  9:仕入先CD 10:発注先CD 11:在庫発生日 12:製造日
#  13:販売日  14:数量
(略)

図5 図4の修正版

cat ZAIKO              |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
self 0 1               |
cjoin2 key=NF SHOHIN - |
delf NF-1              |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
#  13:商品名
self 0 3               |
cjoin2 key=NF KIKAKU - |
delf NF-1              |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
#  13:商品名    14:規格名
(略)

特集3 ユニケージ開発手法入門(Vol.60掲載)

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

著者:當仲寛哲

業務システムを開発するときの選択肢として「ユニケージ
開発手法」があります。ユニケージ開発手法は、Linux/UNIX
のコマンドを基盤としたものです。「シェル魔人」と「りな」
の会話を通して、ユニケージ開発手法で業務システムがど
う作られるのかを理解しましょう。

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

図4 ユニケージ開発手法によるシェルスクリプトの記述例

#!/bin/bash -vx
#
# JIKANTAI.CGI 時間帯別販売情報参照システムのCGI スクリプト
(略)
# POST データの受け取り
if [ ! -z "$CONTENT_LENGTH" ] ; then
dd bs=$CONTENT_LENGTH |
cgi-name -n_ -s_ > $tmp-name
ERROR_CHECK
else
(略)
# はめ込み用日付情報の作成
echo $day $cday                            |
# 1: 日付 2: 比較日コード
join1 key=2 $tmp-cdaynum -                 |
# 1: 日付 2: 比較日コード 3: 比較日
delf 2                                     |
# 1: 日付 2: 比較日
dayslash --output "yyyy 年_mm 月_dd 日" 1 2 |
cat > $tmp-day
ERROR_CHECK
# 現在時刻
curtime="$(dayslash -d $todayhms --output 'yyyy 年 mm 月 dd 日 HH:MM:SS')"
##################################################
# HTML 作成
cat $apld/HTML/JIKANTAI.HTML               |
mojihame -lSHOP_RECORDS - $tmp-data        |
mojihame -lSYOHIN_INFO - $tmp-info         |
mojihame -lSEARCH_DATE - $tmp-day          |
formhame -s_ -n_ - $tmp-name               |
calsed '###CURRENT_TIME###' "$curtime"     |
calsed '###USER###' "$USER"                |
cat > $tmp-html

図19 セールスレポートを作成するシェルスクリプト(demo)

#!/bin/bash -x
join1 key=2 PRICE SALES       | # 原価/ 売価を連結
join1 key=2 CATEGORY          | # カテゴリを連結
lcalc '$3,$7,$8,$8-$7*$4'     | # 売数/ 売上/ 荒利計算
msort -p4 key=1               | # カテゴリでソート
sm2 1 1 2 4                   | # 売数/ 売上/ 荒利集計
sm5 1 1 2 4                   | # 合計行の付加
divsen 2 3 4                  | # 千で除算
divsen 3 4                    | # 千で再除算
lcalc '$1,$2,$3,$4,100*$4/$3' | # 荒利率を求める
marume 5.1                    | # 四捨五入
join2 key=1 CATEGORY_NAME     | # カテゴリ名の連結
comma 3 4 5                   | # カンマ編集
keta                          | # 桁そろえ
keisen +e                     | # 罫線を引く
cat header -                    # 出力
exit 0

図21 コメントを入れた例

#!/bin/bash
# 商品コードに、原価/売価を連結
join1 key=2 PRICE SALES       |
# 商品コードにカテゴリーコードを連結
join1 key=2 CATEGORY          |
# [ レイアウト ]
# 1:店コード 2:商品コード 3:カテゴリコード 4:仕入価格 5:販売価格
# 6:販売日付 7:販売個数 8:販売金額 9:値引金額
# カテゴリコード、売数、売上、粗利(売上-売数x仕入価格)を計算
lcalc '$3,$7,$8,$8-$7*$4'     |
# [ レイアウト ]
# 1:カテゴリコード 2:販売個数 3:販売金額 3:粗利金額
msort -p4 key=1               | # カテゴリでソート
sm2 1 1 2 4                   | # 売数 / 売上 / 粗利集計
sm5 1 1 2 4                   | # 合計行の付加
divsen 2 3 4                  | # 千で除算
divsen 3 4                    | # 千で再除算 (売上・粗利は百万円単位)
# 粗利率を求める
lcalc '$1,$2,$3,$4,100*$4/$3' |
# [ レイアウト ]
# 1:カテゴリコード 2:販売個数 3:販売金額 4:粗利金額 5:粗利率
# 粗利率を四捨五入
marume 5.1                    |
# カテゴリ名の連結
join2 key=1 CATEGORY_NAME     |
# [ レイアウト ]
# 1:カテゴリコード 2:カテゴリ名 3:販売個数 4:販売金額 5:粗利金額
# 6:粗利率
comma 3 4 5                   | # カンマ編集
keta                          | # 桁そろえ
keisen +e                     | # 罫線を引く
cat header -                    # 出力
exit 0

図25 最新のレベル4を出力する

echo LV1.101.*      |
xargs cat           |
msort key=1@NF      |
upl key=1@NF LV4 -

Vol.60 補足情報

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

目次

連載コラム「香川大学SLPからお届け!」の回のタイトルに誤りがありました。「バーコードリーダーを使って手軽なデータ収集システム」ではなく、「Ruby on RailsとFullCalendarで予定共有アプリを作る」です。 お詫びして訂正いたします 。

読者プレゼント

右上のQRコードが誤っていました。正しいQRコードは以下です。 お詫びして訂正いたします 。

姐のNOGYO

左上の別掲記事の「1998年」は「1989年」の誤りです。 お詫びして訂正いたします 。

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

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

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

著者:米田聡

 シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)向けのセンサー搭載拡張ボード「ラズパイセンサーボード」を制作しました。第7 回では、I2C のインタフェースに接続するI/Oエキスパンダ「MCP23017」でGPIO 端子を増やす方法を紹介します。

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

図9 MCP23017のGPIOを読み書きするためのPythonライブラリ(mcpgpio.py)

from smbus import SMBus

class MCPGPIO():
  __IODIR  = [0x00, 0x01] # レジスタ番号
  __GPPU   = [0x0C, 0x0D]
  __GPIO   = [0x12, 0x13]
  __OLAT   = [0x14, 0x15]

  INPUT       = 1
  OUTPUT      = 0
  INPUTPULLUP = 3

  HIGH        = 1
  LOW         = 0

  def __init__(self,address = 0x20):
    self.bus = SMBus(1)
    self.addr = address

  def setup(self, pin, dir):
    if pin < 16:
      dir = self.bus.read_byte_data(self.addr,self.__IODIR[int(pin/8)])
      dir &= ~(0x01 << int(pin % 8))
      dir |= (dir & 1) << int(pin % 8)
      self.bus.write_byte_data(self.addr, self.__IODIR[int(pin/8)], dir)
      if (dir & 1) ==  1:
        pu  = self.bus.read_byte_data(self.addr,self.__GPPU[int(pin/8)])
        pu &= ~(0x01 << int(pin % 8))
        pu |= ((dir >> 1) & 1) << int(pin % 8)
        self.bus.write_byte_data(self.addr, self.__GPPU[int(pin/8)], pu)
    
  def input(self, pin):
    r = 0
    if pin < 16:
      gp = self.bus.read_byte_data(self.addr, self.__GPIO[int(pin/8)])
      r = (gp >> int(pin%8) & 1)
    return r

  def output(self, pin, val):
    if pin < 16:
      gp = self.bus.read_byte_data(self.addr, self.__GPIO[int(pin/8)])
      gp &= ~(0x01 << int(pin % 8))
      gp |= (val & 1) << int(pin % 8)
      self.bus.write_byte_data(self.addr, self.__GPIO[int(pin/8)], gp)

  @property
  def gpioa(self):
    return  self.bus.read_byte_data(self.addr, self.__GPIO[0])
    
  @gpioa.setter
  def gpioa(self, value):
    self.bus.write_byte_data(self.addr,self.__GPIO[0], value)
    
  @property
  def gpiob(self):
    return  self.bus.read_byte_data(self.addr, self.__GPIO[1])

  @gpiob.setter
  def gpiob(self, value):
    self.bus.write_byte_data(self.addr,self.__GPIO[1], value)

機械学習のココロ(Vol.60掲載)

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

著者:石井一夫

 今回は、機械学習を実施する際に一番問題となる過学習の問題を取り上げます。過学習というのは、機械 学習のモデルが、ある特定の状況に過剰適合してしまい、新たなサンプルに対してうまく予測ができなくなるという現象です。

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

図5 L1 正則化を実施するコード

l1_model = keras.models.Sequential([
    keras.layers.Dense(16, kernel_regularizer=keras.regularizers.l1(0.001),
                    activation=tf.nn.relu, input_shape=(NUM_WORDS,)),
    keras.layers.Dense(16, kernel_regularizer=keras.regularizers.l1(0.001),
                    activation=tf.nn.relu),
    keras.layers.Dense(1, activation=tf.nn.sigmoid)
])
l1_model.compile(optimizer='adam',
                loss='binary_crossentropy',
                metrics=['accuracy', 'binary_crossentropy'])
l1_model_history = l1_model.fit(train_data, train_labels,
                               epochs=20,
                               batch_size=512,
                               validation_data=(test_data, test_labels),
                               verbose=2)

図6 過学習の評価結果を表示するコード

plot_history([('baseline', baseline_history),
               ('l1', l1_model_history)])

連載 シェルスクリプトを書いてみよう

投稿日:2019.04.2 | カテゴリー: コード
イラスト:ヨーダヒデキ

 シェルスクリプトは、Linux/Unix系OSのコマンドのみで記述できるプログラムです。さまざまな処理を簡単に記述でき、LinuxやUnix系OSの環境があれば、すぐに実行して試せるのでとても便利です。本連載では、役立ちそうなシェルスクリプトを紹介しながら、シェルスクリプトの書き方を説明していきます(隔週更新予定)。
 なお、シェルスクリプトを開発・実行するには、Linux/Unix系OSがインストールされたパソコンが必要です。例えば、「連載 UbuntuではじめるLinuxサーバー」の第1回第4回で紹介した方法でUbuntu Serverをインストールしたパソコンを用意できます。

記事中で紹介したシェルスクリプトのコードは、以下のページから入手できます(WordPressのバグなのか、何らかのパターンで「$」などの文字が消えてしまうことがありますのでシェルスクリプト自体はこちらから入手してください)。
https://github.com/shellscript-magazine/rensai_shellscript1

目次
第1回 Amazonの商品ページURLをきれいにする
第2回 コメント行を削除する
第3回 写真を整理する
第4回 ファイルサーバーを構築する
第5回 文書をPDFファイルに変換する
第6回 DMを自動送信する(SMTPS編)
第7回 DMを自動送信する(STARTTLS編)
第8回 自動でアーカイビングする
第9回 グローバルIPアドレスを通知する
第10回 写真から場所を調べる
第11回 大切なメールだけをチャットルームに送る
第12回 コマンドを作る
最終回 不正アクセスを通知する

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

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

004 レポート Homebrew 2.0.0リリース
005 レポート runcの脆弱性問題
006 NEWS FLASH
008 特集1 Linuxパーフェクトカスタマイズ/麻生二郎 コード掲載
020 特集2 AWS Lambdaを好きな言語で使おう/岡本秀高 コード掲載
028 特別企画 リレー式コンピュータプログラミング/若菜魁、入口雄也、八木武尊
036 ラズパイセンサーボードで学ぶ 電子回路の制御/米田聡
040 試み/桑原滝弥・イケヤシロウ
042 バーティカルバーの極意/飯尾淳
046 円滑コミュニケーションが世界を救う!/濱口誠一
048 中小企業手作りIT化奮戦記/菅雄一
056 法林浩之のFIGHTING TALKS/法林浩之
058 漢のUNIX/後藤大地
064 人間とコンピュータの可能性/大岩元
066 香川大学SLPからお届け!/竹原一駿 コード掲載
071 姐のNOGYO
072 UNIXの歴史を振り返る/古寺雅弘
078 Node.js/Expressで楽々Webアプリ開発/しょっさん コード掲載
089 ユニケージ新コードレビュー/坂東勝也 コード掲載
096 Techパズル/gori.sh
098 コラム「ユニケージお作法のココロ」/シェル魔人

ユニケージ新コードレビュー(Vol.59掲載)

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

著者:坂東勝也

ユニケージでは、小さな道具の「コマンド」をシェルスクリプトで組み合わせて、さまざまな業務システムを構築しています。本連載では、毎回あるテーマに従ってユニケージによるシェルスクリプトの記述例を分かりやすく紹介します。第6回は、仕入伝票処理システムを例に最新マスターを取得するコードをレビューします。

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

図11 伝票番号で並べ替え

145 # L3取得
146 if [ -s $tmp-check_data.1 ] ; then
147 	cat $lv3d/SIRE_HEAD/SIRE_HEAD.$ymonth    |
148 	# 同じ伝票番号の情報を古い順にソート(最も新しいデータが一番下に来るように)
149 	msort key=1@NF@NF-1r                     > $tmp-sire_header_l3
150 	ERROR_CHECK
151 else
152 	:> $tmp-sire_header_l3
153 	ERROR_CHECK
154 fi

図12 更新された仕入伝票を調べる

130 # 仕入伝票ヘッダーのLV1データの取得
131 # LV1データがあるかチェック
132 ls $lv1d/$today/SIRE_HEAD_* |
133 gyo                         > $tmp-check_data.lv1
134 ERROR_CHECK

図13 指定月の仕入伝票の取得

156 # INPUT(L1)取得
157 if [ -s $tmp-check_data.2 ] ; then
158 	cat $lv1d/SIRE_HEAD_*                               |
159 	#dayslash --input yyyy/mm/dd --output yyyymmdd 2 -  |
160 	# 指定の日付の範囲内のデータを抽出
161 	uawk '$2>='$range_from' && $2<='$range_to''         |
162 	# 同じ伝票番号の情報を古い順にソート(最も新しいデータが一番下に来るように)
163 	msort key=1@NF@NF-1r                                > $tmp-sire_header_in
164 	ERROR_CHECK
165 else
166 	:> $tmp-sire-header_in
167 	ERROR_CHECK
168 fi

図14 L1とL3のデータをマージ

170 # L1とL3をマージ
171 # 同じ伝票番号の中で最も新しいもののみを残す
172 upl key=1 $tmp-sire_header_l3 $tmp-sire_header_in  |
173 # 削除フラグの立っている伝票を削除
174 delr NF-1 1                                        |
(略)
186 ERROR_CHECK

特集2 AWS Lambdaを好きな言語で使おう(Vol.59掲載)

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

著者:岡本秀高

カンファレンス「AWS re:invent 2018」にて発表された新サービス「AWS Lambda Custom Runtimes」。これまではサポートをアナウンスした言語でしか「Lambda関数」を作成できませんでした。このサービスの登場により好きな言語で作成可能となりました。本特集では、AWS Lambda Custom Runtimesの使い方から、ランタイム(実行環境)を実際に作って利用するところまでを分かりやすく紹介します。

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

図3 bootstrapファイルの内容

#!/bin/sh

set -euo pipefail

# Initialization - load function handler
source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"

# Processing
while true
do
  HEADERS="$(mktemp)"
  # Get an event
  EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
  REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

  # Execute the handler function from the script
  RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")

  # Send the response
  curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response"  -d "$RESPONSE"
done

図5 function.shファイルの内容

#!/bin/sh
function handler () {
  EVENT_DATA=$1
  echo "$EVENT_DATA" 1>&2;
  RESPONSE="Request: '$EVENT_DATA'"

  echo $RESPONSE
}

図6 template.yamlファイルの内容

AWSTemplateFormatVersion: 2010-09-09
Description: My PHP Application
Transform: AWS::Serverless-2016-10-31
Resources:
  myRuntime:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Sub ${AWS::StackName}-myRuntime
      Description: My fisrt custom runtime
      Runtime: provided
      Handler: function.handler
      MemorySize: 3008
      Timeout: 30
      Layers:
        - !Sub 作成したランタイムのLayerVersionArn

Vol.59 補足情報

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

訂正・補足情報はありません。

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

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

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

著者:竹原一駿

USB接続のバーコードリーダーを用いてバーコード化されたデータを読み取り、その結果をサーバーに送って集計するデータ収集システムを開発しました。今回は、同システムについて紹介します。クライアントはGo、集計サーバーは主にPerlで記述しています。クライアントもサーバーもDocker環境で簡単に動かせますので、ぜひ試してみてください。

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

図8 バーコードリーダーで読み取ったデータを取得する関数

func ScanStdin() string {
  stdin := bufio.NewScanner(os.Stdin)
  stdin.Scan()
  return stdin.Text()
}

図9 意見を示す数値を文字列に変換するコード

const AGREE = "100" // 賛成
 const OPPOSITE = "200" // 反対
 const NEUTRAL = "300" // 中立

 if sData == AGREE {
   sData = "agree" // 意見の文字列を代入
 } else if sData == OPPOSITE {
   sData = "opposite"
 } else if sData == NEUTRAL {
   sData = "neutral"
 }

図10 データを集計サーバーに送るためのコード

resp, err := http.Get(baseurl)
if err != nil {
  fmt.Println(err)
  return err
}
defer resp.Body.Close()

図11 HTTPサーバー機能を提供するMyWebServerパッケージの記述

#!/usr/bin/perl
{
  package MyWebServer;
  use HTTP::Server::Simple::CGI;
  use base qw(HTTP::Server::Simple::CGI); #継承
  use strict;
  use warnings;
  # 以降の処理はここに書く.
}
my $pid = MyWebServer->new(80)->run();

図12 CGIで日本語を表示するための記述

print $cgi->header(-charset=>"utf-8"),
      $cgi->start_html(-lang => 'ja','Not found'),
      $cgi->h1('Not found'),
      $cgi->end_html;

図13 ハッシュ変数にサブルーチンのリファレンスを保存

my %dispatch = (
  '/index' => \&resp_index, # index
  '/insert' => \&resp_insert, # データの挿入
  '/operate' => \&resp_operate, # 質問番号の調整
  '/analy' => \&resp_analy, # 解析
);

図14 insertページを表示するコード

sub resp_insert {
  my $cgi = shift;
  return if !ref $cgi;

  my $user = $cgi->param('user'); # ユーザーID
  my $opi = $cgi->param('opi'); # 意見
  my $dbh = DBI->connect(
            "dbi:mysql:database=opinidb;".
            "host=mysql;port=3306",
            'user','password'
            ); #データベースの接続
  my $sth = $dbh->prepare(
            "INSERT INTO
            opinidb.opinion(USER,NUM,OPI)".
            " VALUES (?,?,?);"
            );
  $sth->execute($user,$ques_num,$opi); # SQL生成,実行
  $sth->finish;
  $dbh->disconnect; #接続終了
  print $cgi->header(-charset=>"utf-8"),
        $cgi->start_html("insert"),
        $cgi->h1("Question number is $ques_num"),
        "ユーザ:$user, 意見$opi",
        $cgi->end_html;
  }

図15 analyページを表示するコード

my @opilist = ('agree','opposite','neutral');

print $cgi->header(-charset=>"utf-8");
print $cgi->start_html(-lang => 'ja',"analy");
foreach(@opilist){
  print $cgi->h2("count : ".$_);
  my $sth = $dbh->prepare(
              "SELECT NUM AS ques_num , ".
              "COUNT(*) AS countopi ".
              "FROM opinidb.opinion ".
              "WHERE OPI LIKE '\%".$_."\%' ".
              "GROUP BY ques_num"
            );
  $sth->execute(); # SQL生成,実行
  print '<table border=1>';
  print '<tr><th>質問番号</th><th>選んだ人数</th></tr>';
  while(my $datahash = $sth->fetchrow_hashref){
    print '<tr><td>'.
    $datahash->{'ques_num'}.'</td><td>'.
    $datahash->{'countopi'}.'</td></tr>';
  }
  print '</table>';
  $sth->finish;
}

特集1 Linuxパーフェクトカスタマイズ(Vol.59掲載)

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

著者:麻生二郎

Linuxには、「ディストリビューション」と呼ばれるさまざまな種類があります。しかし、その中から自分の好みに合ったものを見つけるのは意外と困難です。そこで、軽量なLinuxディストリビューション「Lubuntu」のインストールメディアをカスタマイズして、自分好みのLinuxディストリビューションを手に入れましょう。

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

図27 スライドショーの設定を書き換える箇所

    Slide {
        Image {
            anchors.centerIn: parent
            id: image1
            x:0
            y:0
            width: 810
            height: 485
            fillMode: Image.PreserveAspectFit
            smooth: true
            source: "shmag1.png"
        }
    }
    Slide {
        Image {
            anchors.centerIn: parent
            id: image2
            x: 0
            y: 0
            width: 810
            height: 485
            fillMode: Image.PreserveAspectFit
            smooth: true
            source: "shmag2.png"
        }
    }
}

Node.js/Expressで楽々Webアプリ開発(Vol.59掲載)

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

著者:しょっさん

プログラミング言語「JavaScript」の実行環境「Node.js」と「Express」フレームワークを使って、基本となるWebアプリの開発手法を習得しましょう。最終回は、サンプルの「蔵書管理アプリケーション」の課題を解決し、「SPA」(Single Page Application)として実装します。

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

図2 認証時にアクセストークンを発行する部分のプログラム

var express = require('express');
var router = express.Router();
const jwt = require('jsonwebtoken');
const models = require('../models'),
  User = models.user;

var app = express();

// パスワードハッシュ化
const hashPassword = (password, salt) => {
  if (password) {
    var bcrypt = require('bcrypt');
    return bcrypt.hashSync(password, salt);
  } else { return null; }
};

// ログイン処理
router.post('/', (req, res) => {
  const username = req.body.email;
  const password = req.body.password;
  User.findOne({ where: { email: username } })
    .then(user => {
      if (!user) {
        res
          .status(401)
          .json({ errors: { message: 'Incorrect email.' } });
      } else if (hashPassword(password, user.salt) !== user.password) {
        res
          .status(401)
          .json({ errors: { message: 'Incorrect password.' } });
      } else {
        const opts = {
          issuer: process.env.ISSUER,
          audience: process.env.AUDIENCE,
          expiresIn: process.env.EXPIRES,
        };
        const secret = process.env.SECRET;
        res
          .status(200)
          .json({ 'token': jwt.sign({ id: user.id }, secret, opts) });
      }
    });
});

図3 URLへのアクセスしたときのアクセストークンの検査部分のプログラム

const passport = require('passport');
const passportJWT = require('passport-jwt');
const ExtractJWT = passportJWT.ExtractJwt;
const JWTStrategy = passportJWT.Strategy;

// using authentication strategy
passport.use(new JWTStrategy(
  {
    jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
    issuer: process.env.ISSUER,
    audience: process.env.AUDIENCE,
    secretOrKey: process.env.SECRET
  }, (jwt_payload, done) => {
    User.findOne({ where: { id: jwt_payload.id } })
      .then(user => {
        if (user) {
          done(null, user);
        } else {
          done(null, false);
        }
      })
      .catch(err => {
        return done(err, false);
      });
  }
));

図4 カスタムコールバックを作成している部分のプログラム

// passport-jwt: custom callback
// Tokenを持っていなかったり、Invarid Tokenの場合、Json形式で返答しなかったりするので、カスタムコールバックで準備する必要がある
const jwt = (req, res, next) => {
  passport.authenticate('jwt', { session: false }, (err, user, info) => {
    if (err) { return next(err); }
    if (!user) {
      return res.status(401).json({ 'errors': { 'message': info || 'user unknown' } }).end();
    }
    req.user = user;
    next();
  })(req, res, next);
};

// ルーティング: 認証が必要なURIには、jwt関数コールを追記するだけでよい
app.use('/api/auth', auth);
app.use('/api/books', jwt, books);

図5 表現に合わせてJSON形式で返却する

  // 1冊の本の情報を取得する
  _get_book(book_id) {
    return libraries.findOne({
      where: {
        user_id: this._user_id,
        id: book_id
      },
      include: [{
        model: comments,
        required: false
      }]
    });
  }

  // 1冊の本の詳細を表示する
  find(req, res) {
    this._get_book(req.params.id)
      .then(result => {
        res
          .status(200)
          .json(result.get());
      }).catch(() => {
        res
          .status(200)
          .json({});
      });
  }

図6 エラー画面をJSON形式に変更する

// catch 404 and forward to error handler
app.use((req, res, next) => {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
app.use((err, req, res, next) => {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.json({
    success: false,
    errors: {
      message: err.message
    }
  });
});

図7 テストコードを変更する

describe('with Login', () => {
  // store a jwt token
  let jwt_token;

  beforeAll((done) => {
    request(app)
      .post('/api/auth/')
      .send(userCredentials)
      .end((err, res) => {
        jwt_token = res.body.token;
        done();
      });
  });

  describe('GET /api/books/', () => {
    it('respond with REST', (done) => {
      request(app)
        .get('/api/books/')
        .set('Accept', 'application/json')
        .set('Authorization', Bearer ${jwt_token})
        .expect('Content-Type', /json/)
        .expect(200, done);
    });
  });
});

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

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

著者:竹原 一駿
2018年秋に広島と香川で「オープンソースカンファレンス」(OSC)が開催されました。SLPは、両OSCでブースを出展し、OSC香川では3人の学生がライトニングトーク(LT)を行いました。今回は、これらの活動の内容や、それによって得られた体験などについて報告します。OSCへの一般参加や出展などを考えている読者の方の参考になれば幸いです。

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

図2 自作コンテナエンジンのソースコードの一部
unshareシステムコールによるLinux Namespaceの分離
unshare(
  CloneFlags::CLONE_NEWPID
    | CloneFlags::CLONE_NEWIPC
    | CloneFlags::CLONE_NEWUTS
    | CloneFlags::CLONE_NEWNS
    | CloneFlags::CLONE_NEWUSER,)
fork/execシステムコールによるコンテナ内子プロセス生成
match fork() {
  Ok(ForkResult::Parent { child, .. }) => {
    match waitpid(child, None).expect("waitpid faild") {
      WaitStatus::Exited(_, _) => {}
      WaitStatus::Signaled(_, _, _) => {}
      _ => eprintln!("Unexpected exit."),
    }
  }
  Ok(ForkResult::Child) => {
    sethostname(&self.name).expect("Could not set hostname");
    fs::create_dir_all("proc").unwrap_or_else(|why| {
      eprintln!("{:?}", why.kind());
    });
    println!("Mount procfs ... ");
    mounts::mount_proc().expect("mount procfs failed.");
    let cmd = CString::new(self.command.clone()).unwrap();
    let default_shell = CString::new("/bin/bash").unwrap();
    let shell_opt = CString::new("-c").unwrap();
    execv(&default_shell, &[default_shell.clone(), shell_opt, cmd]).expect("execution faild.");
  }
  Err(_) => eprintln!("Fork failed"),
}
図5 「数字に隠された真実」のソースコードの一部
数値を1桁ずつ分解して、すべての和を求める関数
function add_1(number, result_text, c) {
  var num = [];
  if (parseInt(number / 10) == 0 && (number != 6 || number != 9)) { return 0; } // 1桁になって悪魔の数字じゃなければ失敗
  num = num_split_onedigit(number); // 数値を1桁ずつ分解
  sum = num_add_onedigit(num); // すべて加算
  result_text[c] = array_value_text(num, sum, "+"); // 計算過程の文字列を作成
  var check = akumanumber_check(sum, result_text); // 悪魔の数字かどうかチェック
  if (check != 0) { return check; } // 悪魔の数字なら終了
  var result = add_1(sum, result_text, c + 1); // 処理1を実行(再帰)
  if (result != 0) { return result; } else { result_t  ext.splice(c, 1); }
  var result = mult_1(sum, result_text, c + 1); // 処理2を実行(相互再帰)
  if (result != 0) { return result; } else { result_text.splice(c, 1); }
  return 0;
}
数値を1桁ずつ分解して、すべての積を求める関数
function mult_1(number, result_text, c) {
  var num = [];
  if (parseInt(number / 10) == 0 && (number != 6 || number != 9)) { return 0; } // 1桁になって悪魔の数字じゃなければ失敗
  num = num_split_onedigit(number); // 数値を1桁ずつ分解
  sum = num_mult_onedigit(num); // すべて乗算
  result_text[c] = array_value_text(num, sum, "×"); // 計算過程の文字列を作成
  var check = akumanumber_check(sum, result_text); // 悪魔の数字かどうかチェック
  if (check != 0) { return check; } // 悪魔の数字なら終了
  var result = add_1(sum, result_text, c + 1); // 処理1を実行(相互再帰)
  if (result != 0) { return result; } else { result_text.splice(c, 1); }
  var result = mult_1(sum, result_text, c + 1); // 処理2を実行(再帰)
  if (result != 0) { return result; } else { result_text.splice(c, 1); }
  return 0;
}
図9 サーバー監視システムのソースコードの一部
int SystemAnalyzer::GetPreTick_(void)
{
  // 演算に使用されたTick値を取得
  FILE *infile = fopen("/src/proc/stat", "r");
  if (NULL == infile) {
    cout << "[GetCPUUsage]<<Cannot open /src/proc/stat"
         << endl;
    return 0;
  }
  int usr, nice, sys;
  char buf[1024]; // 文字列"cpu"の部分の入力用
  int result = fscanf(infile, "%s %d %d %d",
                      buf, &usr, &nice, &sys);
  if (result == -1) {
    cout << "[GetCPUUsage]<<Cannot read fscanf"
         << endl;
    return 0;
  }
  fclose(infile);
  return usr + nice + sys;
}

Vol.58 補足情報

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

Techパズル 第11回

「タテのカギ」の「18 現実」が抜けていました。お詫びして訂正いたします。

バーティカルバーの極意

p.73のタイトル部分の辰己先生の「己」が「巳」になっていました。お詫びして訂正いたします *

* 2019年1月25日に掲載した訂正情報にも誤りがあり、当該の先生にもご迷惑をおかけしたことをお詫び申し上げます。

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

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

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

シェルスクリプトマガジン Vol.58で掲載しているコードをまとめています。

プレゼント&アンケートページはこちら

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

004 レポート Linuxカーネル5.0
005 レポート Microsoft社のProject Mu
006 NEWS FLASH
008 特集1 オープンソースのデータベース管理システム MySQL入門/梶山隆輔
030 特集2 ラズパイでBASIC/土肥毅大、岡優樹、納富志津
040 特別企画 kintoneで作る交通費申請システム/佐山ウィリアム 明裕、ぺそ、檀原由香子
050 ラズパイセンサーボードで学ぶ 電子回路の制御/米田聡  コード掲載
055 姐のNOGYO
056 中小企業手作りIT化奮戦記/菅雄一
062 円滑コミュニケーションが世界を救う!/濱口誠一
064 「Visual Studio Code」を便利に使う/山本美穂
068 新年号/桑原滝弥・イケヤシロウ
070 バーティカルバーの極意/飯尾淳
076 法林浩之のFIGHTING TALKS/法林浩之
078 漢のUNIX/後藤大地
084 人間とコンピュータの可能性/大岩元
086 機械学習のココロ/石井一夫  コード掲載
092 Node.js/Expressで楽々Webアプリ開発/しょっさん  コード掲載
100 香川大学SLPからお届け!/竹原一駿  コード掲載
106 UNIXの歴史を振り返る/古寺雅弘
114 ユニケージ新コードレビュー/技術研究員
120 Techパズル/gori.sh
122 コラム「仕事座右の銘」/シェル魔人

Node.js/Expressで楽々Webアプリ開発(Vol.58掲載)

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

著者:しょっさん
プログラミング言語「JavaScript」の実行環境「Node.js」と「Express」フレームワークを使って、基本となるWebアプリの開発手法を習得しましょう。第4回は「蔵書管理アプリケーション」のサンプルプログラムで認証機能を実現す
る方法を解説します。

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

図3 「models/user.js」ファイルにLibrariesテーブルとの関係性を追記
user.associate = function (models) {
  // associations can be defined here
  user.hasMany(models.Library, { foreignKey: 'user_id' });
};
return user;return user;
図4 モデルファイル「models/library.js」の修正
'use strict';
module.exports = (sequelize, DataTypes) => {
  var Library = sequelize.define('Library', {
    book_title: DataTypes.STRING,
   author: DataTypes.STRING,
    publisher: DataTypes.STRING,
    image_url: DataTypes.STRING(2048),
    user_id: DataTypes.INTEGER
  },
    {
      underscored: true
    });
  Library.associate = function (models) {
    // associations can be defined here
    Library.hasMany(models.Comment, { foreignKey: 'book_id'});
  };
  return Library;
};
図5 マイグレーションファイルの追記内容
user_id: {
  type: Sequelize.INTEGER,
  allowNull: false,
  foreignKey: true,
  references: {
    model: 'users',
    key: 'id',
  },
  onUpdate: 'RESTRICT',
  onDelete: 'RESTRICT',
},
図6 作成したseed(日付-demo-user.js)
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    const models = require('../models');
    return models.user.bulkCreate([
      {
        id: 1,
        email: 'tak@oshiire.to',
        password: '$2b$10$t73WMpPlvyhkWuL.ALWe..OKbU1q1ssR4K5ezVTXLlvaDMtUuAqve',
        salt: '$2b$10$t73WMpPlvyhkWuL.ALWe..'
      },
      {
        id: 2,
        email: 'sho@oshiire.to',
        password: '$2b$10$t73WMpPlvyhkWuL.ALWe..OKbU1q1ssR4K5ezVTXLlvaDMtUuAqve',
        salt: '$2b$10$t73WMpPlvyhkWuL.ALWe..'
      },
      {
        id: 3,
        email: 'shosan@oshiire.to',
        password: '$2b$10$t73WMpPlvyhkWuL.ALWe..OKbU1q1ssR4K5ezVTXLlvaDMtUuAqve',
        salt: '$2b$10$t73WMpPlvyhkWuL.ALWe..'
      }
    ]);
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.bulkDelete('users', null, {});
  }
};
図8 passportストラテジの定義
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

const hashPassword = (password, salt) => {
  var bcrypt = require('bcrypt');
  var hashed = bcrypt.hashSync(password, salt);
  return hashed;
};

passport.use(new LocalStrategy(
  {
    usernameField: 'email',
    passwordField: 'password'
  },
  (username, password, done) => {
    models.user.findOne({ where: { email: username } }).then(user => {
      if (!user)
        return done(null, false, { message: 'Incorrect email.' });
      if (hashPassword(password, user.salt) !== user.password)
        return done(null, false, { message: 'Incorrect password.' });
      return done(null, user.get());
    });
  }
));
図9 セッション連携の関数「serializeUser」と「deserializeUser」
var session = require('express-session');

passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser((id, done) => {
  models.user.findById(id).then(user => {
    if (user) {
      done(null, user.get());
    } else {
      done(user.errors, null);
    }
  });
});
図10 ミドルウエアで認証済みか否かの判定
app.use((req, res, next) => {
  if (req.isAuthenticated())
    return next();
  if (req.url === '/' || req.url === '/login')
    return next();
  res.redirect('/');
});

app.use('/', index);
app.use('/books', books);
図11 テストコード(supertest-spec.js)の主要部分
/* eslint-env jasmine */

// routing テスト
const request = require('supertest-session');
const app = require('../app');

//let's set up the data we need to pass to the login method
const userCredentials = {
  email: 'tak@oshiire.to',
  password: 'password'
};
const wrongEmailCredentials = {
  email: 'foo',
  password: 'password'
};
const wrongPasswordCredentials = {
  email: 'tak@oshiire.to',
  password: 'foo'
};

//now let's login the user before we run any tests
const authenticatedUser = request(app);

describe('POST /login', () => {
  it('should redirect to / with unloggined user', (done) => {
    request(app)
      .get('/books/')
      .expect(302)
      .expect('Location', '/', done);
  });
  it('should success login with correct user', (done) => {
    request(app)
      .post('/login')
      .send(userCredentials)
      .expect(302)
      .expect('Location', '/books/', done);
  });
  it('should deny login with wrong email', (done) => {
    request(app)
      .post('/login')
      .send(wrongEmailCredentials)
      .expect(302)
      .expect('Location', '/', done);
  });
  it('should deny login with wrong password', (done) => {
    request(app)
      .post('/login')
      .send(wrongPasswordCredentials)
      .expect(302)
      .expect('Location', '/', done);
  });
});

describe('with Login', () => {
  beforeAll((done) => {
    authenticatedUser
      .post('/login')
      .send(userCredentials)
      .expect(302, done);
  });

  describe('GET /', () => {
    it('respond with http', (done) => {
      authenticatedUser
        .get('/')
        .set('Accept', 'text/html')
        .expect(200, done);
    });
  });
 :
(中略)
 :
});

describe('GET /logout', () => {
  beforeAll((done) => {
    authenticatedUser
      .post('/login')
      .send(userCredentials)
      .expect(302, done);
  });

  it('should go back to login', (done) => {
    authenticatedUser
      .get('/logout')
      .set('Accept', 'text/html')
      .expect(302)
      .expect('Location', '/', done);
  });
});

機械学習のココロ(Vol.58掲載)

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

著者:石井 一夫
今回は、機械学習による2値分類の方法を紹介します。映画評論のテキストを好評価な内容か悪い評価の 内容かに分類するという例題のTensorFlowのチュートリアルマニュアルに沿って、2値分類のモデリングの定番である「ロジスティック回帰分析」について解説します。

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

図4 ライブラリのインポートとIMDBデータセットの取り込み
import tensorflow as tf
from tensorflow import keras
import numpy as np
imdb = keras.datasets.imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
図5 IMDBデータセットの中身を表示するコード
print(train_labels[0])
print(train_data[0])
図6 元の単語を表示する関数を定義するコード
# 整数の索引に単語を割り当てる辞書を検索する関数
word_index = imdb.get_word_index()
# 最初の索引で変換
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0
word_index["<START>"] = 1
word_index["<UNK>"] = 2 # 不明
word_index["<UNUSED>"] = 3
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
def decode_review(text):
    return ' '.join([reverse_word_index.get(i, '?') for i in text])
図7 データをテンソル化するコード
train_data = keras.preprocessing.sequence.pad_sequences(
               train_data, value=word_index["<PAD>"],
          padding='post', maxlen=256)
test_data = keras.preprocessing.sequence.pad_sequences(
               test_data, value=word_index["<PAD>"],
               padding='post', maxlen=256)
図8 学習モデルを構築するコード
# 入力データの指定形式は、映画評論に用いられた単語数(10,000 単語)をとる
vocab_size = 10000
model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size, 16)) # 入力層
model.add(keras.layers.GlobalAveragePooling1D()) # 中間層I
model.add(keras.layers.Dense(16, activation=tf.nn.relu)) # 中間層II
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid)) # 出力層
図10 モデルをコンパイルするコード
model.compile(optimizer=tf.train.AdamOptimizer(),
              loss='binary_crossentropy',
              metrics=['accuracy'])
図11 訓練用データセットを分割するコード
x_val = train_data[:10000]
partial_x_train = train_data[10000:]
y_val = train_labels[:10000]
partial_y_train = train_labels[10000:]
図12 モデルの訓練用コード
history = model.fit(partial_x_train,
                     partial_y_train,
                     epochs=40,
                     batch_size=512,
                     validation_data=(x_val, y_val),
                     verbose=1)
図13 モデルの性能評価用コード
results = model.evaluate(test_data, test_labels)
print(results)
図14 損失のグラフを表示するコード
%matplotlib inline
import matplotlib.pyplot as plt

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(1, len(acc) + 1)

# 青点グラフ
plt.plot(epochs, loss, 'bo', label='Training loss')
# 青線グラフ
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()
図16 精度のグラフを表示するコード
plt.clf() # 図を初期化
acc_values = history_dict['acc']
val_acc_values = history_dict['val_acc']

plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()

plt.show()

ラズパイセンサーボードで学ぶ電子回路の制御(Vol.58掲載)

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

著者:米田 聡
シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)向けのセンサー搭載拡張ボード「ラズパイセンサーボード」を制作しました。第5回では、このボードを使った電子回路制御を取り上げます。具体的には、明るさ・近隣センサーに近づく物体の検出です。

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

図3 割り込みに対応したVCNL4020ライブラリ(VCNL4020.py)
import smbus
import time
import RPi.GPIO as GPIO
from threading import BoundedSemaphore

class VCNL4020():

  _ALS_OD       = 0b00010000  # オンデマンド明るさ計測スタート
  _PROX_OD      = 0b00001000  # オンデマンド近接計測スタート
  _ALS_EN       = 0b00000100  # 明るさ繰り返し計測有効
  _PROX_EN      = 0b00000010  # 近接繰り返し計測有効
  _SELFTIMED_EN = 0b00000001  # 内蔵タイマー有効
  
  _CONT_CONV    = 0b10000000  # Continue Conversion有効
  _AMBIENT_RATE = 0b00010000  # 明るさの計測レート(default:2sample/s)
  _AUTO_OFFSET  = 0b00001000  # 自動オフセットモード有効
  _AVERAGING    = 0b00000101  # 平均化(default:32conv)

  _COMMAND_REG       = 0x80  # コマンドレジスタ
  _PID_REG           = 0x81  # プロダクトIDレジスタ
  _PROX_RATE_REG     = 0x82  # 近接測定レートジスタ
  _IR_CURRENT_REG    = 0x83  # 近接測定用赤外線LED電流設定レジスタ(default=20mA)
  _AMBIENT_PARAM_REG = 0x84  # 明るさセンサーパラメータレジスタ

  _AMBIENT_MSB       = 0x85  # 明るさ上位バイト
  _AMBIENT_LSB       = 0x86  # 明るさ下位バイト

  _PROX_MSB          = 0x87  # 近接上位バイト
  _PROX_LSB          = 0x88  # 近接下位バイト

  _INT_CONTROL_REG   = 0x89  # 割り込み制御レジスタ

  _LOW_TH_MSB        = 0x8A  # Lowしきい値(MSB)
  _LOW_TH_LSB        = 0x8B  # Lowしきい値(LSB)
  _HIGH_TH_MSB       = 0x8C  # Highしきい値(MSB)
  _HIGH_TH_LSB       = 0x8D  # Highしきい値(LSB)

  _INT_STATUS_REG    = 0x8E  # 割り込みステータス

  _INT_NO            = 0x06  # int = GPIO6

  # コールバック
  __callbackfunc     = None

  def __init__(self, i2c_addr = 0x13, busno = 1):
    self.addr = i2c_addr
    self.i2c = smbus.SMBus(busno)
    
    self._write_reg(self._COMMAND_REG, self._ALS_OD  |\
                       self._PROX_OD |\
                       self._ALS_EN  |\
                       self._PROX_EN |\
                       self._SELFTIMED_EN )
                       
    self._write_reg(self._IR_CURRENT_REG, 2 )  # 20mA
                       
    self._write_reg(self._AMBIENT_PARAM_REG, self._CONT_CONV    |\
                        self._AMBIENT_RATE |\
                        self._AUTO_OFFSET  |\
                        self._AVERAGING )
    self.semaphore = BoundedSemaphore()

    # GPIO設定
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(self._INT_NO, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.add_event_detect(self._INT_NO, GPIO.FALLING, callback=self.__interruptfunc)

    time.sleep(0.6)      # 初回測定まで待つ

  def _write_reg(self, reg, value):
    self.i2c.write_byte_data(self.addr, reg, value)

  def _read_reg(self, reg):
    return self.i2c.read_byte_data(self.addr, reg)

  # 高値用レジスタ設定
  def set_high_threshold(self, value):
    self.semaphore.acquire()
    h = (value & 0xFF00) >> 8
    l = value & 0x00FF
    self._write_reg(self._HIGH_TH_MSB, h)
    self._write_reg(self._HIGH_TH_LSB, l)
    self.semaphore.release()

  # 低値用レジスタ設定
  def set_low_threshold(self, value):
    self.semaphore.acquire()
    h = (value & 0xFF00) >> 8
    l = value & 0x00FF
    self._write_reg(self._LOW_TH_MSB, h)
    self._write_reg(self._LOW_TH_LSB, l)
    self.semaphore.release()

  # 割り込み有効化
  def enable_interrupt(self, callbackfunc=None, prox=True, samples=1):
    self.semaphore.acquire()

    self.__callbackfunc = callbackfunc
    value = self._read_reg(self._INT_CONTROL_REG)

    if callbackfunc is not None:
      if prox:
        value |= 0b00000010
      else:
        value |= 0b00000011
    else:
        value &= 0b11111100

    # samples
    samples &= 0b00000111
    samples = samples << 5
    value &= 0b00011111
    value |= samples

    self._write_reg( self._INT_CONTROL_REG, value)
    self.semaphore.release()

  # 割り込み関数
  def __interruptfunc(self, ch):
    if ch != self._INT_NO:
      return
    if self.__callbackfunc is not None:
      self.__callbackfunc(self.luminance, self.proximity)


  @property
  def luminance(self):
    self.semaphore.acquire()
    d = self.i2c.read_i2c_block_data(self.addr, self._AMBIENT_MSB, 2)
    self.semaphore.release()
    return (d[0] * 256 + d[1]) / 4
  
  @property
  def proximity(self):
    self.semaphore.acquire()
    d = self.i2c.read_i2c_block_data(self.addr, self._PROX_MSB, 2)
    self.semaphore.release()
    return (d[0] * 256 + d[1])
図4 物体が近づいたら割り込みを発生させるサンプルプログラム(simpletest.py)
#!/usr/bin/env python3
import time
from  VCNL4020 import  VCNL4020

sensor = VCNL4020()

# コールバック関数
def callback(lux, prox):
  print('センサーに何かが接近しています')
  print('現在の明るさ:'+str(lux) )
  print('近接センサー:'+str(prox) )
  # 割り込み再設定
  sensor.enable_interrupt(callback)

# しきい値高を設定
sensor.set_high_threshold(2500)
# しきい値低を設定
sensor.set_low_threshold(0)
# 割り込み有効化
sensor.enable_interrupt(callback)

try:
  while True:
    time.sleep(1)

except KeyboardInterrupt:
  term = True

Python標準モジュール9選(Vol.57掲載)

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

著者:降籏洋行、西川公一朗

Pythonには、豊富な機能を備える標準ライブラリが用意されています。しかし機能豊富すぎるが故に、初心者にとっては「この標準ライブラリモジュールは、実際の開発において、こういう時に役に立つ」という情報を探しにくかったり、リファレンスの説明だけだと使用方法をイメージしづらかったりします。本特集では、知っておくと役立つ便利な標準ライブラリモジュール9個を厳選して、その活用法を紹介します。

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

 

特集1 ラズパイでセンサーを使う(Vol.57掲載)

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

著者:米田聡、麻生二郎

シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」のオリジナル拡張ボード第2弾として「ラズパイセンサーボード」を製作しました。サンプルプログラムで、搭載されている湿温度・気圧センサー、
ガスセンサー、照度センサーの使い方を紹介します。

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

漢のUNIX(Vol.57掲載)

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

著者:後藤大地

これまで、JSONデータを読み込んで処理する方法を取り上げてきた。JSONデータをパースしながら処理する方法や、メモリー上に展開したJSONデータを、指定したフォーマットで出力する方法を解説した。今回も引き続き同じ「Jansson」ライブラリを使うが、JSONデータを読み込んで処理するのではなく、生成する方法を紹介する。

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

 

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

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

シェルスクリプトマガジン Vol.57で掲載しているコードをまとめています。

プレゼント&アンケートページはこちら

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

004 レポート LPI-Japanインタビュ
005 レポート 第34回のTechLION開催
006 NEWS FLASH
008 特集1 ラズパイでセンサーを使う/米田聡、麻生二郎 コード掲載
020 特集2 Python標準モジュール9選/降籏洋行、西川公一朗 コード掲載
038 特集3 Adobe XD CCに触れてみよう/湯口りさ、北村崇
052 特別企画 セキュリティ人材不足を解決する/園田道夫
058 c人間とコンピュータの可能性/大岩元
060 UNIXの歴史を振り返る/古寺雅弘
066 法林浩之のFIGHTING TALKS/法林浩之
068 スズラボ通信/すずきひろのぶ コード掲載
073 姐のNOGYO
074 バーティカルバーの極意/飯尾淳 コード掲載
080 RESEARCHES FOR FUTURE/飯尾淳
082 中小企業手作りIT化奮戦記/菅雄一
088 円滑コミュニケーションが世界を救う!/濱口誠一
090 「Visual Studio Code」を便利に使う/山本美穂 コード掲載
094 香川大学SLPからお届け!/飯國隆志 コード掲載
098 統合/桑原滝弥・イケヤシロウ
100 アジャイル開発 Let’s Practice!/熊野憲辰
104 Node.js/Expressで楽々Webアプリ開発/しょっさん コード掲載
112 漢のUNIX/後藤大地 コード掲載
122 ユニケージ新コードレビュー/村本禎実 コード掲載
128 Techパズル/gori.sh
130 コラム「世の中の流れとは別に」/シェル魔人

「Visual Studio Code」を便利に使う(Vol.57掲載)

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

著者:山本美穂

米Microsoft 社発のオープンソースエディタ「Visual Studio Code」には「Extension」と呼ばれる機能拡張用のソフトウエアが多数提供されています。本連載では便利なExtension の使い方を中心に紹介します。第1回は、PaaS「Azure App Service」と連携できるExtension です。

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

 

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

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

著者:飯尾淳

バーティカルバー(垂直棒)の集合体「バーコード」の読み取りに挑戦します。すでに、スマートフォンのアプリなどでは、カメラでバーコードを認識する機能が当たり前になっています。この機能を自前のアプリに組み込むことができれば、いろいろな応用が考えられそうです。そのためにも、まずは、バーコード写真を読み込んで認識する基本的な機能を実現してみましょう。

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

 

Vol.57 補足情報

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

特集1「ラズパイでセンサーを扱う」

p.14の下から12行目、p.17の下から5行目、図23のキャプションの「smaple.py」は「sample.py」の誤りです。

お詫びして訂正いたします。

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

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

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

著者:飯國 隆志

前回は、我々が開発した小規模利用向けプライベートPaaS「LiPP」の概要と環境構築手順を紹介しました。LiPPは、ユーザーが開発したアプリケーションをDockerコンテナ上にリリースする機能を提供します。またLiPPは、GitHubと連携して、リポジトリにpushしたアプリケーションを自動的にデプロイできます。今回は、前回構築したLiPP環境に、サンプルWebアプリをデプロイする手順を紹介します。

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

 

スズラボ通信(Vol.57掲載)

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

著者:すずきひろのぶ

前回は、Arduino IDEを使って、中国Espressif Systems社のSoC「ESP32」を搭載する開発ボード「ESP32-DevKitC v2」で動作するサンプルプログラムを作成しました。今回は、前回作成したサンプルプログラムを省電力化してみます。

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

 

Node.js/Expressで楽々Webアプリ開発(Vol.57掲載)

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

著者:しょっさん

プログラミング言語「JavaScript」の実行環境「Node.js」と「Express」フレームワークを使って、基本となるWebアプリの開発手法を習得しましょう。第3回は「テストファースト」(最初にテストプログラムを作る)を意識したテストコードの作成方法を解説します。

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

ユニケージ新コードレビュー(Vol.57掲載)

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

著者:村本 禎実

ユニケージでは、小さな道具の「コマンド」をシェルスクリプトで組み合わせて、さまざまな業務システムを構築しています。本連載では、毎回あるテーマに従ってユニケージによるシェルスクリプトの記述例を分かりやすく紹介します。第4回は、Webブラウザからデータを参照・削除するためのサーバー側の処理です。

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

 

ラズパイ入門ボードで学ぶ電子回路の制御(Vol.56)

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

著者:米田 聡

シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)のプログラミングが楽しめる拡張ボード「ラズパイ入門ボード」を制作しました。本連載では、ラズパイ入門ボードを使った電子回路制御を取り上げていきます。第4 回は、赤外線レシーバを扱います。

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

漢のUNIX(Vol.56掲載)

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

著者:後藤 大地

プログラムでJSONデータを自動処理する場合、フォーマットはどうでもよい。ただし、人間が読むとなると、フォーマットを変換して整理する必要がある。整理されていないJSONデータは、人間にはあまりにも読みにくいからだ。自分の読みやすいようにJSONデータを変換するコマンドといったものが、Janssonライブラリを利用すると簡単に開発できる。これが今回のテーマである。

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

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

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

著者:飯國 隆志

アプリケーションの開発やデプロイを容易にするPaaS(Platform as a Service)は非常に便利なサービスです。しかし、Google App Engineや、Herokuなどのパブリッククラウドサービスは、料金体系や学習コストの面から、サークルで利用するには難がありました。そこで、プライベートで構築できるPaaS「LiPP」を開発しました。今回から数回にわたってLiPPの利用方法を紹介します。

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

 

スズラボ通信(Vol.56掲載)

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

著者:すずき ひろのぶ

今回は、開発ボード「ESP32-DevKitC v2」の省電力モードに挑戦してみた奮戦記の前半部分です。プログラミング設定から、まずWi-Fiが動くまでの流れを追ってみます。次回は、省電力のためにDeep SleepやLight Sleepに移行した際にWi-Fiはどんな動作となるのかを試行錯誤した結果を紹します。

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

Node.js/Expressで楽々Webアプリ開発(Vol.56掲載)

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

著者:しょっさん

プログラミング言語「JavaScript」の実行環境「Node.js」と「Express」フレームワークを使って、基本となるWebアプリの開発手法を習得しましょう。第2回は「蔵書管理アプリケーション」を作成しながら、少し複雑なデータベースを扱う方法を紹介します。

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

 

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

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

シェルスクリプトマガジン Vol.56で掲載しているコードをまとめています。

プレゼント&アンケートページはこちら

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

004 レポート バッファローの新無線LANブランド
005 レポート パッケージ管理システム「Flatpak 1.0」
006 NEWS FLASH
008 特集1 Zabbix入門/寺島広大、田中敦
029 姐のNOGYO
030 特集2 「HCI」に乗り遅れるな!/羽鳥正明
038 特集3 Visual Studio Codeを使おう/山本美穂 コード掲載
048 特別企画 シェルスクリプトで作るTwitter bot/Piro(結城洋志) コード掲載
056 ラズパイ入門ボードで学ぶ電子回路の制御/米田聡  コード掲載
060 スズラボ通信/すずきひろのぶ コード掲載
064 機械学習のココロ/石井一夫 コード掲載
068 中小企業手作りIT化奮戦記/菅雄一
072 人間とコンピュータの可能性/大岩元
074 バーティカルバーの極意/飯尾淳 コード掲載
080 RESEARCHES FOR FUTURE/米澤拓郎
082 香川大学SLPからお届け!/飯國隆志 コード掲載
086 円滑コミュニケーションが世界を救う!/濱口誠一
088 漢のUNIX/後藤大地 コード掲載
096 法林浩之のFIGHTING TALKS/法林浩之
098 アジャイル開発 Let’s Practice!/熊野憲辰
102 Node.js/Expressで楽々Webアプリ開発/しょっさん コード掲載
110 ユニケージ新コードレビュー/村本禎実 コード掲載
116 統合/桑原滝弥・イケヤシロウ
118 Techパズル/gori.sh
120 コラム「世の中の流れとは別に」/シェル魔人

Vol.56 補足情報

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

目次

p.2の「雄大」は「広大」の誤りです。

Node.js/Expressで楽々Webアプリ開発

p.106の10行目にある「外部キー({{ foreignKey: ‘book_id’ })」は、「外部キー({ foreignKey: ‘book_id’ })」の誤りです。

ユニケージ新コードレビュー

p.110の注釈(*1)にある「https://github.com/shellscript-magazine/newcodereview/201810/」は、「https://github.com/shellscript-magazine/newcodereview」の誤りです。

p.112の本文の最終行にある「プロセスID-name」は「プロセスID-flg」の誤りです。

 

以上、お詫びして訂正いたします。

特別企画 シェルスクリプトで作る Twitter bot(Vol.56掲載)

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

著者:結城 洋志

つぶやき投稿サイト「Twitter」に自動でつぶやくBot「Twitter bot」を、Bash
のシェルスクリプトで作ってみましょう。このTwitter botは、日経Linuxで好評
連載中の人気まんが「シス管系女子」の著者である私自身が作成し、シス管系女子宣伝用アカウントでも利用しています。

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

 

機械学習のココロ(Vol.56掲載)

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

著者:石井一夫

今回は、人工知能プラットフォーム「TensorFlow」のインストール手順と、TensorFlow を使った機械学習と画像分析の一例を紹介します。TensorFlow をベースにした機械学習環境の構築や利用には、やや難易度の高い作業がかつては必要でした。しかし最近、ニューラルネットワークライブラリの「Keras」が開発されたことで、非常に楽になっています。

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

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

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

著者:飯尾 淳

本連載の第2 回(2017 年6 月号掲載)では、SNS(Facebook)のデータを分析しました。そこでは、投稿時間別のヒストグラムを作り、自分が何時頃によく投稿しているのかを考えてみました。今回は、バーティカルバー(垂直の棒)による代表的な表現に立ち戻り、再度、ヒストグラムを描いて分析してみましょう。分析の対象は、会議録です。国会議員による発言の状況を、ざっくりと捉えてみようという試みです。

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

Visual Studio Codeを使おう(Vol.56掲載)

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

著者:山本 美穂

高機能、クロスプラットフォームで最近話題になっている、米Microsoft 社
発のオープンソースのエディタ「Visual Studio Code」。その概要、導入方法、画面構成や基本操作、カスタマイズ、デバックなど、便利な機能を含めながらVisual Studio Code を紹介します。

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

 

ユニケージ新コードレビュー(Vol.56掲載)

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

筆者:村本 禎実

ユニケージでは、小さな道具の「コマンド」をシェルスクリプトで組み合わせて、さまざまな業務システムを構築しています。本連載では、毎回あるテーマに従ってユニケージによるシェルスクリプトの記述例を分かりやすく紹介します。第3回は、Webブラウザからデータを登録するためのサーバー側の処理です。

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

 

Node.js/Expressで楽々Webアプリ開発(Vol.55掲載)

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

著者:しょっさん

プログラミング言語「JavaScript」の実行環境「Node.js」と「Express」フレームワークを使って、基本となるWebアプリの開発手法を習得しましょう。第1回は「MVC」(Model View Controller)で「見た目」と「ロジック」を分離したWebアプリの開発手順を紹介します。

記事本文掲載のシェルスクリプトマガジンvol.55は以下のリンク先でご購入できます。


 

ユニケージ新コードレビュー(vol.55掲載)

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

著者:伊藤 和正

ユニケージでは、小さな道具の「コマンド」をシェルスクリプトで組み合わせて、さまざまな業務システムを構築しています。本連載では、毎回あるテーマに従ってユニケージによるシェルスクリプトの記述例を分かりやすく紹介します。第2回は、データを分割・保存した複数のテキストファイルの抽出や読み出しです。

記事本文掲載のシェルスクリプトマガジンvol.55は以下のリンク先でご購入できます。


 

漢のUNIX JSON データを扱うJanssonライブラリ(Vol.55掲載)

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

著者:後藤 大地

C言語のJSON用ライブラリ「Jansson」の使い方を紹介する。Janssonライブラリは、使い方がかなり直感的で扱いやすい。C言語でJSONデータを扱いたいのなら最初に使っておきたいものだ。

記事本文掲載のシェルスクリプトマガジンvol.55は以下のリンク先でご購入できます。


 

ラズパイ入門ボードで学ぶ 電子回路の制御(Vol.55掲載)

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

著者:米田 聡

シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)のプログラミングが楽しめる拡張ボード「ラズパイ入門ボード」を制作しました。本連載では、ラズパイ入門ボードを使った電子回路制御を取り上げていきます。第3回は、OLEDに画像を表示します。

記事本文掲載のシェルスクリプトマガジンvol.55は以下のリンク先でご購入できます。


 

特別企画 普通のパソコンではじめる仮想通貨マイニング(Vol.55掲載)

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

著者:末安 泰三

一時期のバブルは弾けた感じはありますが、仮想通貨にはまだまだ注目が集まっています。仮想通貨の一部は、パソコンでマイニング(採掘)という作業をすることで獲得できます。ASIC 耐性が高い「yescrypt」と呼ばれるハッシュ関数を使用する仮想通貨をマイニングする方法を紹介します。

記事本文掲載のシェルスクリプトマガジンvol.55は以下のリンク先でご購入できます。


 

 

特集1 CentOSではじめるLinuxサーバー構築(Vol.55掲載)

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

著者:麻生 二郎

CentOSやUbuntuなどのLinuxディストリビューション、パソコン、インターネットに接続する環境を用意すれば、無料で実用的なサーバーを構築できます。本特集では、企業のサーバーOSとして人気のCentOSを用いて、「ファイル共有」と「ブログ」の2種類のサーバーを立ち上げる方法を分かりやすく紹介します。
記事本文掲載のシェルスクリプトマガジンvol.55は以下のリンク先でご購入できます。


Part2 リモートアクセス環境の構築

Part3 ファイル共有/ブログサーバーの構築

ラズパイ入門ボードで学ぶ 電子回路の制御(vol.54掲載)

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

著者:米田

シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)のプログラミングが楽しめる拡張ボード「ラズパイ入門ボード」を制作しました。本連載では、ラズパイ入門ボードを使った電子回路制御を取り上げていきます。第2 回は、Grove System の光センサーを扱います。

記事本文掲載のシェルスクリプトマガジンvol.54は以下のリンク先でご購入できます。


 

漢のUNIX XML2JSON のコードを整理して仕上げる(vol.54掲載)

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

著者:後藤 大地

前回までの2回で、XMLパーサーライブラリ「expat」の使い方と、expatによるXMLデータをJSONデータへ変換する方法を取り上げた。前回作成したサンプルコードはとりあえず動作するものだが、それほどきれいに整理はされていない。今回はこのサンプルコードを整理して完成させる。
記事本文掲載のシェルスクリプトマガジンvol.54は以下のリンク先でご購入できます。


 

ユニケージ新コードレビュー(vol.54掲載)

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

著者:大内 智明

ユニケージでは、小さな道具の「コマンド」をシェルスクリプトで組み合わせて、さまざまな業務システムを構築しています。本連載では、毎回あるテーマに従ってユニケージによるシェルスクリプトの記述例を分かりやすく紹介します。初回は、サーバー2重化時のデータ書き込みです。
記事本文掲載のシェルスクリプトマガジンvol.54は以下のリンク先でご購入できます。


 

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

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

著者:楠目幹

こんにちは。香川大学工学部 学部4年生の楠目です。高校時代にPCがマルウェアに感染した経験がきっかけでセキュリティに興味を持ち、マルウェア対策やペネトレーションテストに関する分野の勉強を行っています。
昨年の8月「セキュリティ・キャンプ全国大会2017」に参加しました。そこでは「Linux向けマルウェア対策ソフトを作ろう」と言う講義に参加し、「surface indicator+αなELFマルウェアの分類」というテーマに、チームで取り組みました。このテーマの目標は、機械学習や複雑な解析を用いずにELFマルウェアの亜種を素早く検出することです。今回の記事では、私が講師やチューターの方、チームのメンバーと一緒に取り組んだ内容をご紹介します。

記事本文掲載のシェルスクリプトマガジンvol.54は以下リンク先でご購入できます。

特集1 Node.js/Express入門(vol.54掲載)

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

著者:しょっさん

インターネットを介する各種サービス、ゲーム、そしてコミュニケーションツールなどの多くが「Webアプリ」として提供されています。このようにWebアプリが普及したのは、プログラミング言語「JavaScript」のおかげです。JavaScriptはフロントエンド開発が中心でしたが、サーバーサイドの実行環境「Node.js」の登場によりバンクエンドのアプリ開発にも使われています。本特集ではNode.js、フレームワークとなる「Express」について、実践しながら分かりやすく紹介します。
記事本文掲載のシェルスクリプトマガジンvol.54は以下のリンク先でご購入できます。


 

バーティカルバーの極意 第六回(vol.54掲載)

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

著者:飯尾 淳

前回は、政府統計の総合窓口「e-Stat1」から入手できるデータをダウンロードして、八王子市の町・丁目を示す境界データを地図上に可視化する準備をしました。今回は、実際に地図データを活用できるように、データをきれいに整理する作業を実施します。データをきれいにする作業、それを「クレンジング」と呼びます。
記事本文掲載のシェルスクリプトマガジンvol.54は以下のリンク先でご購入できます。


特集3 Kubernetesを知る(vol.54掲載)

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

著者:福田 潔

コンテナー型の仮想化環境を提供するソフトウエア「Docker」の普及により、その運用管理が重要になってきています。Kubernetesは、最も注目されているコンテナー運用管理/運用自動化ツールです。本特集では使い方も含めて、Kubernetesについて分かりやすく紹介します。
記事本文掲載のシェルスクリプトマガジンvol.54は以下のリンク先でご購入できます。


 

特別企画 Alexaカスタムスキル開発入門(vol.54掲載)

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

著者:岡本 秀高

2018 年3 月30 日、スマートスピーカー「Amazon Echo」の一般販売が開始されました。そのバックエンドに使用されるAIアシスタント「Amazon Alexa」を活用することで、自分のオリジナルアプリ(スキル)を簡単に作成できます。本企画で、シンプルなスキルを作りながら、スキルの開発方法を学んでいきましょう。
記事本文掲載のシェルスクリプトマガジンvol.54は以下のリンク先でご購入できます。


 

特集2 日々の仕事をちょっと便利にする シェルスクリプトスニペット集(vol.54掲載)

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

著者:今泉 光之

日々の業務でよく使い回すちょっとしたコードの羅列を「スニペット」(断片)として用意しておくと便利です。本特集では、作業の自動化に便利であろういくつかのシェルスクリプトスニペットを紹介します。

記事本文掲載のシェルスクリプトマガジンvol.54は以下のリンク先でご購入できます。


 

 

 

スズラボ通信 37 オープンソース・デザインBeagleboard

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

著者:すずきひろのぶ

今回はPocketBeagle を取り上げたいと思います。本連載だけではなくシェルスクリプトマガジンでもなんども取り上げているクレジットカードサイズのコンピュータRaspberry Pi は広く知られていますが、それ以外にもカードサイズの小さなコンピュータがあります。その中の1 つがBeagleBoard.orgFoundation が提供するBeagleBone ファミリです。
そのBeagleBone ファミリを、さらに小さくしたボードコンピュータがPocketBeagle です。

記事本文掲載のシェルスクリプトマガジンvol.53は以下のリンク先でご購入できます。


PokectBeagleのブートの様子
https://youtu.be/0dIX4gAv2ZI

ラズパイ入門ボードで学ぶ 電子回路の制御(vol.53掲載)

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

著者:米田 聡

シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)のプログラミングが楽しめる拡張ボード「ラズパイ入門ボード」を制作しました。本連載では、ラズパイ入門
ボードを使った電子回路制御を取り上げていきます。第1回はOLEDに日本語文字を表示します。
記事本文掲載のシェルスクリプトマガジンvol.53は以下のリンク先でご購入できます。


 

40歳から始める、オレとRubyプログラミング(vol.53掲載)

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

著者:しょっさん

自動的にホストが登録される部分までのプログラムは、これまでずいぶんとリファクタリングを繰り返しながら作ってきました。今回は、残りのサーバによる定期監視部分です。以前、「TaskControl」クラスを作って、将来の実装に備えました。そのTaskControlクラスの改修と、それを制御するためのメインとなる部分を準備します。
従って、今回のプログラミング作業は次の3点です。
1. 全体を制御するメインルーチンの改修
2. 死活を監視するためのTaskControlクラスの完成
3. サーバ側に合わせたエージェント側の改修
記事本文掲載のシェルスクリプトマガジンvol.53は以下のリンク先でご購入できます。


 

漢のUNIX XMLをJSONに変換するコードを書いてみよう(Vol.53掲載)

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

著者:後藤大地

今回は前回作ったサンプルコードをベースに、XMLデータをJSON(JavaScript Object Notation)形式に変換する例を紹介する。XMLデータをJSON形式に変換する、またはその逆を実施するのは需要の高い処理だ。今回紹介するのはサンプルレベルのコードだが、それなりに実用的なコードが書けることをわかってもらえるだろう。
記事本文掲載のシェルスクリプトマガジンvol.53は以下のリンク先でご購入できます。


 

機械学習のココロ(vol.53掲載)

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

著者:石井一夫(久留米大学)

今回は、機械学習においてよく耳にする正則化とスパースモデリングの話題を取り上げます。

記事本文掲載のシェルスクリプトマガジンvol.53は以下のリンク先でご購入できます。


 

訂正情報

以下の箇所に文章漏れがございました。謹んで訂正いたします。

p57 右下 下から7行目

誤り
「L2正則化の場合、パラメータの大きさをだけゼロに近づける操作を行っており、」
訂正
「L2正則化の場合、パラメータの大きさを分散の大きさだけゼロに近づける操作を行っており、」

 

参考リンク

scikit-learnオフィシャル サイト L1 ノルム正則化の解説とサンプルコード(英語・リンク先にpython用コード有り)

sklearn.linear_model.Lasso

 

MathWorks(MATLAB開発元)によるLasso 正則化の解説(日本語)

一般化線形モデルの Lasso 正則化

 

scikit-learnオフィシャル サイト L2ノルム正則化の解説とサンプルコード(英語・リンク先にpython用コード有り)

sklearn.linear_model.Ridge

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

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

著者:朝野有也

こんにちは、香川大学工学部の朝野です。普段からパソコンを使っている方ならJava というプログラミング言語の名前を一度は聞いたことがあると思います。プラットフォームに依存しないため、クライアント側、サーバ側問わず様々なシステムで使用されている言語です。さらに、Java のプログラムを実行するにあたって必要となるJava 仮想マシン(JVM) を利用したJVM 言語というものがあります。JVM 言語は、Java の資源を利用できるのに加えて、Java より後発であるため便利なライブラリや仕組みが揃っていることが多いです。

今回は、簡単な名簿アプリケーションの開発をとおして、JVM 言語の1つであるScala と、Java とScala のWeb アプリケーションフレームワークであるPlay Framework をご紹介します。

記事本文掲載のシェルスクリプトマガジンvol.53は以下リンク先でご購入できます。

 

sbt のインストール:
https://www.scala-sbt.org/1.x/docs/ja/Setup.html

 

登録:

@form(routes.HomeController.insertUser) { @inputText(userForm(“name”), ‘_label -> “名前”) @inputText(userForm(“age”), ‘_label -> “年齢”) }


@form(routes.HomeCon troller.showUser) { }

 

}

 

一覧:

 

@for(user <- users ) {     }

名前 年齢
@user.name @user.age @form(routes.HomeController.deleteUser(user.id)) { }

@form(routes.HomeController.index) { }

 

}

 

特集3 IBM Cloudで学ぶAI・機械学習・ディープラーニング(vol.53掲載)

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

著者:佐々木 敦守、古川 正宏、小薗井 康志

IBMの「Watson」が動くクラウドプラットフォーム「IBM Cloud」を使って、無料でAI、機械学習、ディープラーニングを試してみましょう。
記事本文掲載のシェルスクリプトマガジンvol.53は以下のリンク先でご購入できます。


 

英文メール・チャット 20のポイント おまけ

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

執筆:甲斐荘秀生  監修:Doorkeeper Paul McMahon

記事本文掲載のシェルスクリプトマガジンvol.53は以下のリンク先でご購入できます。


 

本誌掲載のチャットの前、クライアントとA君との間でつばぜり合いがありました。

翻訳サイトを駆使した英文

 

クライアント:The budget is decided, but can not you do this bu plugging in as well?(予算は決まってるけど、これも差し込みでお願いできません?)

 

A:We can not accept it.(できません。)

 

クライアント:I will put a color on the next month.(来月色を付けますから。)

 

A:This time only. (今回だけですよ。)

 

 

Paulさんによる訂正後の英文

 

クライアント:I know we’ve already fixed the budget, but can’t you fit this in as well?(予算が決まっていることはわかっていますが、追加でやってもらえませんか?)

“as well”には「おまけで」という意味もあります。

 

A:Sorry, we’re not able to budge on it.(申し訳ありませんが、これ以上は動けません)

“budge”は「身動きをとる」という意味です。今回のように否定形で使うと”微動だにしない”のような意味になります。

 

クライアント:How about if we add it to next month’s budget?(来月の予算にその分追加するのではどうでしょう?)

 

A:OK, just this once. (わかりました。今回だけですよ)

 

 

裏にこんなやりとりがあった後、本誌掲載のチャットの続きをご覧ください。

翻訳サイトを駆使した英文

 

A:At last only one. (さいごにひとつだけ。)

 

A:There was an additional request from the client. Can you please take action?(クライアントから追加の要望がありました。対応をお願いできますか?)

 

A:They would like to add a daytime contact to the inquiry form.(問い合わせフォームに日中の連絡先を追加したいとのことです。)

 

B:What a client. (なんてクライアントだ!)

 

Paulさんによる訂正後の英文

 

A:One more thing. (さいごにひとつだけ。)

 

A:There was a new request from the client. (クライアントから追加の要望がありました。)

 

A:They would like to add a new field for a phone number.(電話番号用のフィールドを新たに追加したいとのことです。)

「日中の連絡先」は文脈に依存した言い方なので、「電話番号」と直接伝えた方がよいでしょう。

 

B:I’m getting tired of these last minute requests. (追加要望のせいで嫌になってきた)

 

 

 

特集1 9のステップでしっかりわかる Python入門(vol.53掲載)

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

著者:西川 公一朗

機械学習やデータ解析、人工知能の需要が高まるにつれ、最近ではさまざまな分野でプログラミング言語「Python」を利用する機会が増えています。本特集では入門者や初心者を対象に、9のステップでPython の基本を分かりやすく説明します。
記事本文掲載のシェルスクリプトマガジンvol.53は以下のリンク先でご購入できます。


 

機械学習のココロ(vol.52掲載)

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

著者:石井一夫(久留米大学)

世の中は機械学習や人工知能のブームです。これに相まって、統計学や数学の価値が再認識されています。数学と聞くと学生の頃のトラウマが甦り、ついつい敬遠しがちな人もいるかもしれませんが、ある種の必要性と割り切り、ワクワクするような新しいトレンドとして再認識できると、それなりに楽しいものです。

記事本文掲載のシェルスクリプトマガジンvol.52は以下のリンク先でご購入できます。


 

「1、 円周率の計算」の参考にしているサイトへのリンク(リンク先にコード有り)

pythonで円周率を求める (Remrinのpython攻略日記)

 

「2、積分計算と確率計算」の参考にしているサイトへのリンク(リンク先にコード有り)

モンテカルロ積分 (人工知能に関する断創録)

 

「3、機械学習モデルとしての最尤推定法、最小二乗法、回帰分析への応用」の参考リンク(説明のみ)

最小二乗法と最尤法の関係 (具体例で学ぶ数学)

「4、ベイズ予測モデルを作成するためのマルコフ連鎖モンテカルロ法」の参考リンク(リンク先にコード有り)

The Bayesian t-Test (henryhhammond.com)

 

ラズパイ入門ボードの購入について

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

動画による製品紹介はこちら

プログラミング例はこちら

シェルスクリプトマガジン(Vol.52)の特集2で紹介したラズパイ入門ボードの完成品20セット組み立てキット10セットを限定発売します(日本国内のみ)。お1人様どちらか1セットになります。

完成品が3980円(税別)、組み立てキットが2780円(税別)です。送料は650円(税込み)になります(シェルスクリプトマガジン Vo.52は完売しました)。PayPalまたは銀行振り込みでのお支払いになります。

以下の購入申し込みを記入の上、「raspi@usp-lab.com」宛てにメールしてください。2~3営業日以内にメールにて支払い方法などをお送りいたします。発送はVol.52発売日の2018年1月25日以降になります。なお、売り切れの場合もご連絡いたします。

売り切れの際は、ビット・トレード・ワンの公式オンラインショップAmazon.co.jp共立エレショップおよび、シリコンハウス各店、千石電商各店、デジット各店、マルツエレック各店からご購入ください(いずれも1月25日販売開始予定)。

++++++ラズパイ入門ボード購入申し込み++++++

■購入希望商品

○完成品:4948円
○組み立てキット:3652円
※購入を希望する商品の「○」を「●」に変更してください。

■代金お支払い方法

○PayPal

○銀行振り込み

※希望する方の「○」を「●」に変更してください。

お名前:
お名前のよみがな:
郵便番号:
ご住所:
お電話番号:
+++++++++++++++++++++++++++++++++

 

ラズパイ入門ボード向けソースコード集

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

40歳から始める、オレとRubyプログラミング(vol.52掲載)

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

著者:しょっさん

前回は、インフラ管理アプリ「Reins」の今後の方針について、「プログラムを俯瞰してリファクタリングしよう」「Reins Agentを監視できるようにしよう」「データフォーマットを標準化しよう」という三つのポイントに着目して定めました。
今回は、前回定めた方針に従って、プログラムを更新します。ただし、すべての変更点を載せるとプログラムだけでも相当な分量になりそうだったので、次の二つについてのみ、プログラムと変更点を説明します。
記事本文掲載のシェルスクリプトマガジンvol.52は以下のリンク先でご購入できます。


特集2 ラズパイ入門ボードの使い方(Vol.52掲載)

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

著者:米田聡

シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)のプログラミングが楽しめる拡張ボード「ラズパイ入門ボード」を制作しました。本特集では、このラズパイ入門ボードに関する基本的な使い方の一部を紹介します。
記事本文掲載のシェルスクリプトマガジン vol.52は以下のリンク先でご購入できます。

 

漢のUNIX サードパーティ製ライブラリを使う(Vol.52掲載)

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

著者:後藤大地

これまでシステムに用意されている標準ライブラリだけを使ってソースコードを作成する例を取り上げてきたが、次のステップとしてサードパーティ製のライブラリを使う方法を紹介しよう。システムに標準で用意されているライブラリはすべての処理に対応しているわけではないので、特定の処理をしようと思ったらそれ向けに開発されたサードパーティ製ライブラリを利用することになる。
記事本文掲載のシェルスクリプトマガジンvol.52は以下のリンク先でご購入できます。


スズラボ通信 36 湿温計サーバを作ってみた(2)(本誌vol.51掲載)

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

著者:すずきひろのぶ

前回は、温湿センサーモジュールAM2320 をRaspberryPi 3 ( 以下 RPi3)に接続しI2C ( アイ・スクエアード・シー)からデータを取得しデータベースに登録していくまでのプログラムを作成しました。今回は、データベースをアクセスし表示するWeb アプリケーションを作成します。

記事本文掲載のシェルスクリプトマガジンvol.51は以下リンク先でご購入できます。

Hello World

 

hello again

 

“,row[1],” “, temp/10.0, ” “,hum/10.0,”

\r\n”
end
db.close
print “\n

以下はvol.50掲載コードのおさらいです。

以下は本誌に公開されていないお楽しみコードです。どうぞご利用ください。

 


 

 

 

ユニケージ開発手法 コードレビュー vol.40(本誌vol.51掲載)

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

著者:鮎瀬伊矩磨

今回はユニケージ開発において、ウェブブラウザ上で住所などを選択する際に用いるドリルダウン機能のスクリプトを紹介します。

記事本文掲載のシェルスクリプトマガジンvol.51は以下リンク先でご購入できます。

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

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

著者:太田圭祐

イタリアで生まれたマイコンボードArduinoで鉄道模型を動かしてみる

こんにちは。香川大学工学部 学部3 年生の太田です。高校時代にArduino と出会い、L チカやモータの制御などをして遊んできました。今回、記事を書くにあたり、改めてArduinoと向き合ってみました。
Arduino では、ハードウェアの上で動作するソフトウェアの開発用にC/C++ 言語ベースのシンプルなArduino 言語を採用しています。そのためC 言語を使っている人にとって、とても馴染みやすい文法を持っています。更に、開発環境が無料で提供されていることから、ハードウェアプログラミングの学習を始めやすいこともArduino の特徴です。
今回はこのArduino を用いて、鉄道模型を実物同様に加減速制御するコントローラを作っていきましょう。

記事本文掲載のシェルスクリプトマガジンvol.51は以下リンク先でご購入できます。

40歳から始める、オレとRubyプログラミング(vol.51掲載)

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

著者:しょっさん

 急に寒くなりましたね。雨も降り続いていて、寒い寒いと思っていたら、台風まで来ました。まったく外へ出られるような天候ではありません。こうなったら仕方ありません。家に引きこもってプログラミングはいかがですか。それでは、今月もがんばっていきましょう。

記事本文掲載のシェルスクリプトマガジンvol.51は以下リンク先でご購入できます。

漢のUNIX テストフレームワームKyua その3(Vol.51掲載)

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

著者:後藤大地

 前回はコマンド開発目的で利用できるテストフレームワーク「Kyua」(https://github.com/jmmv/kyua(https://github.com/jmmv/kyua)で、実際にどのようにデプロイして開発に利用していけばよいのかを解説した。また、make(1) の仕組みを使い、どのディレクトリにいてもmake test でテストが実行されるようにして、テストと開発を同時に進める方法についても説明した。
 今回は具体的にどんな手段で実際のコーティングとテストを実施していくのかを紹介する。
記事本文掲載のシェルスクリプトマガジンvol.51は以下リンク先でご購入できます。

バーティカルバーの極意 第五回(vol.51掲載)

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

著者:中央大学 教授 飯尾淳

秋の夜長はパズルで頭のトレーニングなんていかがでしょう?今回のバーティカルバーは、3本の縦棒に登場してもらいます。3本の棒を備えた「ハノイの塔」というパズルです。皆さんも、名前くらいは聞いたことがあるのではないでしょうか。そのパズルをシェルスクリプトで解いていくことを考えます。

記事本文掲載のシェルスクリプトマガジンvol.51は以下リンク先でご購入できます。

特集 シェルスクリプトではじめる Raspberry Pi電子工作入門(Vol.51掲載)

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

著者:麻生 二郎

パソコン、IoT(モノのインターネット)など、さまざまな用途に活用できるシングルボートのコンピュータが「Raspberry Pi」(ラズベリーパイ)です。このRaspberry Piは、Linuxコマンドを組み合わせた「シェルスクリプト」を知っていればいろいろと楽しめます。発光ダイオード(LED)、押しボタンスイッチ、型液晶パネル(LCD)の電子パーツと、簡単なシェルスクリプトを利用してRaspberry Piの電子工作を始めましょう。
記事本文掲載のシェルスクリプトマガジンvol.51は以下リンク先でご購入できます。

UNIXネイティブの電子工作塾 vol.50掲載

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

著者:金沢大学 教授 大野浩之

 さて、少し間があいてしまいましたが、UNIX ネイティブの電子工作塾 e-Badge 篇第3 回です。
 この記事で本連載を初めて目にした方もいらっしゃると思いますので、今回に至る経緯を振り返ってみましょう。

https://github.com/shmag/gc4unix 上のコードもご参照ください(編集部)

本記事掲載のシェルスクリプトマガジンvol.50は以下リンク先でご購入できます。

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

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

著者:清水赳(香川大学SLP)

Elixir製のWebアプリケーションフレームワーク Phoenixを触ってみる 後編

こんにちは。香川大学工学部 学部3 年の清水です。今回は、前回に引き続き、Elixir 製のWebアプリケーションフレームワーク Phoenix を紹介します。Elixir はRuby によく似た文法を持っています。更にPhoenix は、MVC
フレームワークを採用するなど、Ruby on Rails に大きく影響を受けています。その他にも影響を受けた点は多く、非常に近い感覚でコーディングが行えます。
前回はPhoenix の紹介として、モデルが1 つだけの簡単な掲示板アプリケーションを作成しました。今回はもう一歩踏み込んでみます。自分の蔵書を管理できるアプリケーションを作りながら、2 つ以上のモデルを関連付ける方法を紹介します。

記事本文掲載のシェルスクリプトマガジンvol.50は以下リンク先でご購入できます。

<%= for book <- @books do %>   <% end %>

<%= book.title %> <%= link ” 削除”, to: book_path(@conn, :delete,book.id), method: :delete %>

蔵書の新規登録

<%= form_for @book, book_path(@conn, :create), fn f ->%>

タイトル <%= text_input f, :title, placeholder: ” タイトル”,class: “form-control” %>

 

ISBN <%= text_input f, :isbn, placeholder: “ISBN”, class:”form-control” %>

 

蔵書の場所 <%= text_input f, :store_loc, placeholder: ” 蔵書の場所”, class: “form-control” %>

 

<%= select f, :genre_id, @genre %>

 

<%= submit ” 登録” %>

<% end %>

<%= for genre <- @genres do %>   <% end %>

<%= genre.name %> <%= link ” 削除”, to: genre_path(@conn, :delete, genre.id), method: :delete %>

 

ジャンルの作成

<%= form_for @genre, genre_path(@conn, :create), fn f-> %>

<%= text_input f, :name, placeholder: ” ジャンル名”,class: “form-control” %>

 

<%= submit ” 作成” %>

<% end %>

ユニケージ開発手法 コードレビュー vol.39(本誌vol.50掲載)

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

著者:湯本豊

今回は、固定長ファイルの変換について説明します。

記事本文掲載のシェルスクリプトマガジンvol.50は以下リンク先でご購入できます。

スズラボ通信 35 (本誌vol.50掲載)

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

著者:すずきひろのぶ

今回はRaspberry Pi 3 ( 以下 RPi3 ) で湿温度計サーバを作ってみました。製作目標は次の通りです。
1. 湿温センサーから湿度と温度の値を取り込む。
2. その値をデータベースに記録する。
3. Web インタフェースで過去の情報や変化などにアクセスできるようにする。
IoT 的な例題としてはちょうどいいサイズの内容です。

記事本文掲載のシェルスクリプトマガジンvol.50は以下リンク先でご購入できます。

バーティカルバーの極意 第四回 (vol.50掲載)

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

著者:中央大学 教授 飯尾淳

今回のテーマは、前回に引き続き、自然言語処理を応用したデータ分析です。サンプルデータの距離 | x | を利用してクラスタリングを行います。近い距離にあるデータを樹形図でまとめ、デンドログラムに表します。
さて、前回の記事では、インターネットのコラム記事をまとめてダウンロードし、各記事のファイル名を扱いやすい形式に変更するところまで説明しました。
今回は、そのデータから必要な部分を切り出してテキストファイルに変換、変換したデータを形態素解析で分析します。形態素解析の結果から単語を抽出し、出現頻度ベクトルを求めてデータ間の距離を計算します。最終的な成果物はその距離に基づいたデンドログラムです。そのデンドログラム上で最後にスパッとバーティカルバーを引くことで、データのクラスタリングが完成します。
はてさて、適切に分類することはできたでしょうか。

前回記事掲載コードもご参照ください(編集部)

記事本文掲載のシェルスクリプトマガジンvol.50は以下リンク先でご購入できます。

 

40歳から始める、オレとRubyプログラミング(vol.50掲載)

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

著者:しょっさん

 梅雨も明けて、さぁ夏本番、と思ったら雨がしとしと続く2017年夏です。梅雨が戻ってきたかのようですね。夏場は暑いから外出は控えてきたものですが、今年は、雨で外に出られない涼しい夏を過ごしています。こんな時は、部屋に引きこもってプログラミングですね。体調崩さないよう、今回も頑張ってプログラムを学んでいきましょう。
記事本文掲載のシェルスクリプトマガジンvol.50は以下リンク先でご購入できます。

漢のUNIX テストフレームワームKyua その2(Vol.50掲載)

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

著者:後藤大地

 前回はコマンド開発においてテストフレームワークを使うことの重要性を説明するとともに、そうした目的で利用できるフレームワークとして「Kyua」(https://github.com/jmmv/kyua)を紹介した。Kyuaは、特にコマンドの動作チェックに適したフレームワークなので、この連載で取り上げるには最適なものの一つといえる。
 こうしたテストフレームワークを活用してコマンドを開発していくには、最初に開発用の場所をちゃんと用意しておく方がよい。あとからフレームワークを導入しようとしても中途半端なものになったり、面倒くさくなって使わないままになったりするからだ。コーディングの初期段階からKyauを利用できる状況にしておくことで、シームレスにテストフレームワークを利用しながら開発を進めることができる。
 今回はそうしたテストフレームワークを活用した開発を実現できるように、どのようにディレクトリやファイルを配置し、初期段階からテストを取り込んだ開発をどのように実施していくのかを説明する。

記事本文掲載のシェルスクリプトマガジンvol.50は以下リンク先でご購入できます。

連載 UbuntuではじめるLinuxサーバー

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

Linuxとパソコンを使って、本格的なサーバーを無料で構築しましょう。Linuxのインストール方法、リモートアクセス環境の構築、Samba、Apache、MariaDB、WordPress、Nextcloudといったサーバーソフトの導入・起動方法などを分かりやすく紹介します。

written by シェルスクリプトマガジン編集部

スズラボ通信 34 (本誌vol.49掲載)

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

著者:すずきひろのぶ

最近、設定ファイルの名前にファイル拡張子yml がついていることが多いことに気がつきます。これはYAML というフォーマットです。プログラムの設定ファイルのフォーマットとしては簡単に使えるますが、自分のプログラムで使おうとすると意外と参考になる情報は少ないことに気がつきます。
今回はこの話題を取り上げます。

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

 

バーティカルバーの極意 第三回 (vol.49掲載)

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

著者:中央大学 教授 飯尾淳

今回は、いかにもデータ分析といった例題に取り組みます。題材は、簡単な自然言語処理。数十篇のコラム記事を対象として、記事の自動分類に挑戦します。対象とする記事群を、クラスタリングという処理で分類します。クラスタリングとは、特定の多次元空間にマップされたデータ群を、様々な方法でいくつかのまとまりに整理する方法です。
それぞれのデータは、「距離の近さに応じて」まとめられます。ここで計算される距離を、数学では絶対値の記号を用いて|x| と表します。ほら、バーティカルバーが出てきましたね。
また、近いデータを集めて樹形図としてまとめていく方法もよく用いられます。このようにして描く樹形図のことを、デンドログラムといいます。今回、描いてみようとするデンドログラムは図 1 のようなものです。ここにも多数の棒が描かれています。
今回のバーティカルバー劇場、役者は「距離」と「デンドログラム」の二人です。

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

漢のUNIX テストフレームワームKyua その1(vol.49掲載)

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

著者:後藤大地

 コマンドをたくさん作っていくと、いくつかのことに気がつくとおもう。
 たとえば作っていくうちにいろいろと思うところがでて、その都度プログラムの書き換えを実施していくと、コマンドの最初のころの動作と最近の動作が異なってしまうことがあるはずだ。こんな感じで互換性が損なわれることにはなにかと問題がある。少なくとも、業務で使おうとした場合には致命的な問題を引き起こしかねない。
 もうひとつは終端処理の確認というか、ちゃんとさまざまなケースで動作するのかの確認だ。自分で作るときは自分に都合のよいところしか動作チェックをしないものだ。想定していなかった処理をするとコアダンプが発生してコマンドが異常終了するとかはよくある話だ。こうした問題が発生しないように、ちゃんとテストを行うコードを書いて開発に組み込むというのは大切なことである。
 開発の最初の段階からテストフレームワークを入れておくというのはよいアイディアだ。こういうのは最初から導入して、テスト→実装→テスト→実装… といった流れでの開発を常におこなうようにしておきたい。今回はこうしたテストを実施するためのフレームワークとして「Kyua」を紹介しようと思う。

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

ユニケージ開発手法 コードレビュー vol.38(本誌vol.49掲載)

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

著者:大内智明

今回は、取得した固定長ファイルを元に、ユニケージ内で使用するフィールド形式ファイルに変換する方法について説明します。

記事本文掲載のシェルスクリプトマガジンvol.49以下リンク先でご購入できます。

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

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

著者:清水赳(香川大学SLP)

Elixir製のWebアプリケーションフレームワーク Phoenixを触ってみる 前編

こんにちは。香川大学工学部 学部3 年の清水です、はじめまして。

私は普段、Ruby やRailsで開発を行うことが多いのですが、サークルで「Erlang VM の上で動くRubyっぽい感じの言語があるらしいよ」と聞いて、Elixirと、Rails によく似たWebフレームワーク Phoenix を触ってみることにしました。
Elixir は、Ruby を使っている人にとって、とても馴染みやすい文法を持っています。更に特徴として、Erlangの強みである並列処理と耐障害性の機能をそのまま受け継いでいます。最近話題のチャットツールDiscordも、Elixir を採用しているそうです。
そこで、今回から次回にかけては、Elixir 製Web フレームワークであるPhoenix を紹介します。前半は,Phoenix に慣れるために簡単な掲示板アプリケーションを作ってみます。そして後半となる次回は、自宅の蔵書を管理できるようなアプリケーションを作っていきましょう。

 

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

 

40歳から始める、オレとRubyプログラミング(vol.49掲載)

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

著者:しょっさん

梅雨の季節に入ってまいりました。この号が発売される頃には、梅雨もそろそろ明け、夏間近といったところでしょうか。

子供の頃は夏は朝から晩まで真っ黒になって遊び回ったものですが、大人になったら汗をかくだけで、色々やる気が削がれてしまいますね。とても不思議な気持ちではありますが、猛暑は家で落ち着いてプログラミング!

さぁ、今号もしまってまいりましょう!

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

 

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

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

著者:辻健人(香川大学SLP)

年末なので設定ファイルやスクリプトを大掃除する

早いことにもう年の瀬、大掃除の季節です。そこで、今回のテーマは「大掃除」。部屋だけではなく設定ファイルである.zshrcや.bashrc、普段使っているスクリプトの掃除もしてしまいたい!ということで、設定ファイルの掃除方法を紹介していきたいと思います

記事本文掲載のシェルスクリプトマガジンvol.45は以下リンク先でご購入できます。

 

40歳から始める、オレとRubyプログラミング(vol.45掲載)

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

著者:しょっさん

1月号ではありますが、この号が出る頃はちょうどクリスマス。一息ついて、年末の忙しい時期に入っていく頃でしょうか。年末は大晦日まで大掃除に明け暮れて、正月の三が日はこれ以上ないほどにゆっくり過ごすことが、我が家の慣例です。年初からお仕事のないみなさまは、場所はちがえど、三が日の過ごし方は同じようなものでしょう。お雑煮とおせちをいただきながら、2017年に想いをはせつ
つ、さぁプログラミングしましょう!!

記事本文掲載のシェルスクリプトマガジンvol.45は以下リンク先でご購入できます。

 

もっと見る

新しい記事一覧へ戻る

  • カテゴリー コード のアーカイブを表示しています。

  • -->