Get-Counterについてメモ

先日プロセスモニターを作った。

その中でGet-Counterを使ってCPUの使用率や空きメモリの情報を取得しているのだが、ふんいきで使っていた。
挙動について少しわかってきたので、メモに残しておく。

CPUの使用率や空きメモリの情報を取得の例:

#CPU使用率(全体)
(Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue

 #空きメモリ(MB単位)
(Get-Counter '\Memory\Available MBytes').CounterSamples.CookedValue

指定の仕方として、.以降以下の方法がある。

$result = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples[0].CookedValue(or .RawValue)
$result = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue(or .RawValue)

これらの挙動についてまとめておく。

Get-Counterの戻り値の構造:

Get-Counterの返す値は、配列である(コレクションオブジェクト)。
→PerformanceCounterSampleオブジェクト

※配列はコレクションオブジェクト(オブジェクトをまとめたオブジェクト。配列中の要素もオブジェクトになる。)
※要素数は指定したカウンター数(Get-Counterの引数で指定)

記号の意味について:

[0]
・配列の 0番目の要素を1つ取り出す
・結果:単一オブジェクト

.CookedValue
・オブジェクトのプロパティ
・ただし 配列に対して書く(「配列.プロパティ」の形式)と自動展開が起きる
→ここでは、CounterSamplesは配列で、.CounterSamples[0]は単一オブジェクト(PerformanceCounterSample)となるので注意

※自動展開の処理イメージ:

CounterSamples | ForEach-Object { $_.CookedValue }


カウンターが1つの場合:

例:_Total

(Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples

状態
・配列
・要素数:1(カウンターが1つであることからわかる)

a.
.CounterSamples[0].CookedValue

処理の流れ
1.CounterSamples → 配列(1要素)
2.[0] → PerformanceCounterSample を1つ取得
3..CookedValue → そのプロパティを参照

結果
・数値1つ

b.
.CounterSamples.CookedValue

処理の流れ
1.CounterSamples → 配列(1要素)
2..CookedValue → 自動展開
 ・各要素の CookedValue を取得

結果
・数値1つ(自動展開して全取得するが、配列の要素数が1つしかない)

カウンターが複数の場合:

例:(*)(全コア)

(Get-Counter '\Processor(*)\% Processor Time').CounterSamples

状態
・配列
・要素数:複数(コア数分)

a.
.CounterSamples[0].CookedValue

処理の流れ
1.CounterSamples → 配列(複数要素)
2.[0] → 最初の1要素だけ
3..CookedValue → そのプロパティを参照

結果
・数値1つ(1コア分)

b.
.CounterSamples.CookedValue

処理の流れ
1.CounterSamples → 配列(複数要素)
2..CookedValue → 全要素に対して自動展開

結果
・数値の配列(全コア分)

参考情報:

Get-Counter (Microsoft.PowerShell.Diagnostics) - PowerShell | Microsoft Learn

about_Member-Access_Enumeration - PowerShell | Microsoft Learn

about_Operators - PowerShell | Microsoft Learn

Select the values of one property on all objects of an array in PowerShell - Stack Overflow

パスワード生成器を作ってみる

前書き:

電卓作成の記事更新時にも書いたが、今年から数年離れていたPythonを学習し始めた。
ふだんがコーディングをすることがないのと、趣味で学習しているのがPowerShell,Gleamなので、ポピュラーな言語を一つ以上ある程度使える様にしておけばなにかと便利だろうという程度の考えである。

PythonJPの入門記事のようなものを一通り読んだので、プログラムを書いていく。
よくあるお題のようなものをまずは作っていく。

パスワード生成器作成:

import string
import random

def generate_password(length,include_symbols):

    all_chars = string.ascii_lowercase + string.ascii_uppercase + string.digits

    if include_symbols == True:
        all_chars += string.punctuation

    password = ""
    for i in range(int(length)):
        password = password + random.choice(all_chars)

    return password


symbol_choice = input("記号を含めますか?(y/n):")
length = input("パスワードの長さを入力してください:")

if symbol_choice == "y":
    password = generate_password(int(length),True)
else:
    password = generate_password(int(length),False)

print(password)

参考:

Pythonを使ってランダムな文字列を生成 #Python - Qiita

  • ワンライナーでも書けるらしい
  • rangeに可変の入力値を与えるときはそれを関数化すればよいみたい
>>> import random, string
>>> ''.join(random.choices(string.ascii_letters + string.digits, k=10))
'ILl93j9Hdc'

参考サイト:

string --- 一般的な文字列操作 — Python 3.13.5 ドキュメント
Pythonのfor文によるループ処理(range, enumerate, zipなど) | note.nkmk.me
Python | range関数の使い方(開始から終了までの連続した数値を要素として持つrange型オブジェクトを作成する)

シート間の差分を出すやつ

先日Excelを購入したこともあり、vbaを最近使用している。
シート間の差分を出すコードを書いてみた。差分があった行をマーキングするようにした。
※コードの中には、途中経過を把握するためにイミディエイトウィンドウに表示する情報もそのまま残している。

Option Explicit

Sub sample()
    
    Application.ScreenUpdating = False


    Dim num As Long
    num = Cells(Rows.Count, 2).End(xlUp).Row


    Dim i As Integer
    i = 0
    
    Dim j As Integer
    j = 0

    Dim k As Integer
    k = 0


    Dim m As Variant
    m = 0
    
    i = 8
    j = 3
    k = 4
    
    Dim ans As Variant
    ans = 0
    

    Dim arr() As Variant
    ReDim arr(100)
    
    
    Dim l As Integer
    l = 0
    
    
For i = 8 To 12
    With ActiveSheet
        Debug.Print i - 7
        Debug.Print "-----"
             
        For k = 4 To 10
            On Error GoTo Err_Label
            m = WorksheetFunction.Match(Cells(i, j), Worksheets(.Previous.Name).Cells(3, 3).EntireColumn, 0)
            ans = WorksheetFunction.Index(Worksheets(.Previous.Name).Range("$A$1:$Z$20"), m, k)
            arr(k - 4) = WorksheetFunction.CountIf(Worksheets(.Previous.Name).Cells(m, k), Cells(m, k))

            If arr(k - 4) >= 1 Then
                l = l + 1
            ElseIf arr(k - 4) = 0 Then
                '
            End If

            Debug.Print ans
            Debug.Print "arr:" & arr(k - 4)
            Debug.Print "wwww"
          
        Next
        
        Debug.Print "-----"
        
        If l = 7 Then
            Debug.Print "完全一致"
            l = 0
        Else
            For k = 4 To 11
                Cells(i, k - 1).Interior.Color = RGB(255, 255, 0)
                Debug.Print "新規"
            Next
            l = 0
        End If
       
    End With
Next

Exit Sub

Err_Label:
    MsgBox "見つかりませんでした。エラーコードは次の通りです。" & Err.Number & "," & Err.Description

    On Error GoTo 0
    
    Resume Next

End Sub

電卓作成した(2025年更新)

新たなことをということで2025年から以前少し扱って離れていたPythonを再度入門した。
とりあえず放置してた電卓作成終わらせた。

STEP1:関数を使った電卓

  • whileで回しながら関数の呼び出しを行っている
def add(x,y):
    return x + y

def subtract(x,y):
    return x - y

def multiply(x,y):
    return x * y

def divide(x,y):
    if y == 0:
        return "ゼロで割ることはできません"
    return x / y

def calculator():
    print("簡単なプログラム")
    print("演算を選択:")
    print("1.足し算")
    print("2.引き算")
    print("3.掛け算")
    print("4.割り算")

    while True:

        choice = input("演算番号を入力(1/2/3/4):")

        num1 = float(input("最初の数値:"))
        num2 = float(input("2番目の数値:"))

        if choice == '1':
            print(f"結果:{num1} + {num2} = {add(num1,num2)}")
        elif choice == '2':
            print(f"結果:{num1} - {num2} = {subtract(num1,num2)}")
        elif choice == '3':
            print(f"結果:{num1} * {num2} = {multiply(num1,num2)}")
        elif choice == '4':
            print(f"結果:{num1} / {num2} = {divide(num1,num2)}")
        else:
            print("無効な入力です")

        another_calculation = input("別の計算を行いますか?(はい/いいえ):")
        if another_calculation.lower() != 'はい':
            break

    print("電卓を終了します")

if __name__ == "__main__":
    calculator()

STEP2:classを使った逆ポーランド記法(Reverse Polish Notation)での電卓

class RPNCalculator:
    def __init__(self):
        self.stack = []

    def push(self,value):
        """スタックに値をプッシュする"""
        self.stack.append(value)

    def pop(self):
        """スタックから値をポップする"""
        if not self.stack:
            raise ValueError('スタックが空です')
        return self.stack.pop()

    def add(self):
        """足し算"""
        b = self.pop()
        a = self.pop()
        self.push(a + b)

    def subtract(self):
        """引き算"""
        b = self.pop()
        a = self.pop()
        self.push(a - b)

    def multiply(self):
        """掛け算"""
        b = self.pop()
        a = self.pop()
        self.push(a * b)

    def divide(self):
        """割り算"""
        b = self.pop()
        a = self.pop()
        if b == 0:
            raise ValueError("ゼロで割ることはできません")
        self.push(a / b)

    def calculate(self,tokens):
        """トークンを処理して計算を行う"""
        for token in tokens:
            if isinstance(token,(int,float)):
                self.push(token)
            elif token == '+':
                self.add()
            elif token == '-':
                self.subtract()
            elif token == '*':
                self.multiply()
            elif token == '/':
                self.divide()
            else:
                raise ValueError(f"無効な演算子: {token}")

        return self.stack[-1] if self.stack else None


def main():
    calculator = RPNCalculator()
    
    print("逆ポーランド記法電卓")
    print("数値と演算子を空白区切りで入力してください")
    print("例: 3 4 + (3 + 4)") 
    print("終了するには 'q' を入力")

    while True:
        try:
            user_input = input("入力:")

            if user_input.lower() == 'q':
                break

            # 入力を解析
            tokens = []
            for item in user_input.split():
                try:
                    # 数値に変換できるか試みる
                    tokens.append(float(item))
                except ValueError:
                    # 数値でない場合は演算子
                    tokens.append(item)
            
            result = calculator.calculate(tokens)
            print(f"結果: {result}")
        
        except Exception as e:
            print(f"エラー: {e}")


if __name__ == "__main__":
    main()

STEP3:classを使ったShunting-yard algorithmでの電卓

具体的なアルゴリズム

  1. 数式を左から順に読んでいく
  2. 数値だったら出力
  3. 「(」だったらスタックに積む
  4. 「)」だったらスタック上の演算子を「(」が出てくるまで出力する。「(」と「)」は捨てる
  5. 演算子だったらスタックに積む
    →スタックトップの演算子の優先順位が高ければそれを出力する
  6. 数式を読み終わったらスタック上の演算子を最後まで順に出力する

※「#優先順位の高い演算子を先に出力」の箇所が分かりづらいがスタックの動きをイメージすれば分かる
→例)×が先に積まれている状況で、+が積まれに来た場合は、優先順位の高い演算子は×なので×を先に出力している

class AdvancedCalculator:
    def __init__(self):
        #演算子の優先順位
        self.precedence = {
            '+':1,
            '-':1,
            '*':2,
            '/':2,
            '^':3 #べき乗
        }

    def tokenize(self,expression):
            """
            数式を字句解析してトークンに分解
            スペースを無視し、数値と演算子を分離
            """
            tokens = []
            i = 0
            while i < len(expression):
                char = expression[i]
                
                #数値の処理
                if char.isdigit() or char == '.':
                    num = char
                    while(i + 1 < len(expression) and (expression[i+1].isdigit() or expression[i+1] == '.')):
                        i += 1
                        num += expression[i]
                    tokens.append(float(num))

                #演算子とかっこの処理
                elif char in '+-*/^()':
                    tokens.append(char)
                
                #スペースは無視
                elif not char.isspace():
                    raise ValueError(f"不正な文字: {char}")

                i += 1

            return tokens

    def infix_to_postfix(self,tokens):
                """
                中置記法(通常の数式)から後置記法(逆ポーランド記法)への変換
                """
                output = []
                operator_stack = []

                for token in tokens:
                    #数値はそのまま出力
                    if isinstance(token, float):
                        output.append(token)

                    #左括弧はスタックに追加
                    elif token == '(':
                        operator_stack.append(token)
                    
                    #右括弧が来たら、左括弧まで演算子を出力
                    elif token == ')':
                        while operator_stack and operator_stack[-1] != '(': 
                            output.append(operator_stack.pop())
                    
                        #左括弧を取り除く
                        if operator_stack and operator_stack[-1] == '(':
                            operator_stack.pop()
                        else:
                            raise ValueError("括弧の対応が不正です")
                
                    #演算子の処理
                    elif token in self.precedence:
                        #優先順位の高い演算子を先に出力
                        while(operator_stack and self.precedence.get(operator_stack[-1], 0) >= self.precedence[token]):
                            output.append(operator_stack.pop())
                        operator_stack.append(token)


                #残りの演算子を出力
                while operator_stack:
                    if operator_stack[-1] == '(':
                        raise ValueError("括弧の対応が不正です")
                    output.append(operator_stack.pop())

                return output

    def evaluate_postfix(self,postfix):
        """
        後置記法の式を計算
        """
        stack = []

        for token in postfix:
            if isinstance(token,float):
                stack.append(token)
            else:
                #二項演算子
                b = stack.pop()
                a = stack.pop()

                if token == '+':
                    stack.append(a + b)
                elif token == '-':
                    stack.append(a - b)
                elif token == '*':
                    stack.append(a * b)
                elif token == '/':
                    if b == 0:
                        raise ValueError("ゼロ除算エラー")
                    stack.append(a / b)
                elif token == '^':
                    stack.append(a ** b)

        return stack[0]

    def calculate(self,expression):
        """
        メイン計算メソッド
        """
        #字句解析
        tokens = self.tokenize(expression)

        #中間記法から後置記法への変換
        postfix = self.infix_to_postfix(tokens)

        #後置記法の式を計算
        return self.evaluate_postfix(postfix)

def main():
    calculator = AdvancedCalculator()

    print("高度な電卓")
    print("数式を入力してください(例: 3 + (4 * 2) - 1)")
    print("サポートされる演算: +, -, *, /, ^")
    print("終了するには 'q' を入力")

    while True:
        try:
            user_input = input("数式を入力: ").replace(' ','')

            if user_input.lower() == 'q':
                break

            result = calculator.calculate(user_input)
            print(f"結果:{result}")

        except Exception as e:
            print(f"エラー: {e}")

if __name__ == "__main__":
    main()

FizzBuzzに関する5つの問題を解いた

Qiitaを眺めていたら、面白い記事を見つけた。 qiita.com ということで、僕も解いてみた(発展質問はまだ解いてない)

[質問1] 1から100までの数をプリントするプログラムを書けるか?

#include<stdio.h>

int main(void)
{
        int i;
        for (i=1;i<=100;i++)
        {
                printf("%d\n",i);
        }
return 0;
}

[質問2] 3の倍数なら「Fizz」 5の倍数なら「Buzz」 両方の倍数なら「FizzBuzz

  1 #include<stdio.h>
  2 
  3 int main(void)
  4 {
  5 
  6         int i=1;
  7 
  8         while(i<100)
  9         {
 10                 if((i%3 == 0)&&(i%5 == 0)) printf("FizzBuzz\n");
 11                 else if(i%3 == 0) printf("Fizz\n");
 12                 else if(i%5 == 0) printf("Buzz\n");
 13                 else printf("%d\n",i);
 14                 i++;
 15         }
 16 return 0;
 17 
 18 }

[質問3] FizzBuzzを関数に分割できるか?

  1 #include<stdio.h>
  2 
  3 void toFizzBuzz(int n);         
  4 
  5 int main(void)
  6 {
  7         int i = 1;
  8 
  9         while(i<=100) 
 10         {
 11                 toFizzBuzz(i);
 12                 i++;
 13         }
 14         return 0;
 15 }
 16 
 17 
 18 
 19 void toFizzBuzz(int n)
 20 {       
 21   if ((n%3 == 0)&&(n%5 == 0)) printf("FizzBuzz\n");
 22   else if(n%3 == 0) printf("Fizz\n");
 23   else if(n%5 == 0) printf("Buzz\n");
 24   else printf("%d\n",n);
 25 }

[質問4] FizzBuzzユニットテストを書けるか?

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>

#define N 256
char fizzbuzz[30]="FizzBuzz";
char fizz[30]="Fizz";
char buzz[30]="Buzz";

char *toFizzBuzz(int n);

int main(void)
{
         int i = 1;
         while(i<=100)
          {
             assert(toFizzBuzz(2)=="FizzBuzz");
             toFizzBuzz(i)
             printf("%s\n",toFizzBuzz(i)); 
         i++;
          }
    return 0;
 }
  
  
  
char *toFizzBuzz(int n)
{
    
    if ((n%3 == 0)&&(n%5 == 0)){      
       return "FizzBuzz";

    }else if(n%3 == 0){
       return  "Fizz";
   
    }else if(n%5 == 0){
       return  "Buzz";
   
    }else{
        static int tes;
        tes = n;
        static char s1[N] = {'\0'};
        sprintf(s1,"%d",tes);
        return s1;

    }
   
}

[質問5] HTML出力とテキスト出力を簡単にスイッチできるようにできるか?

これに関しては、元の記事の関数の処理のsprintfの出力文字列に指定してある記法で表記できることをゴールとした。 また、実行した際に、scanfでどちらにスイッチするか聞けるようにした。

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>

#define N 256

static  int flag1=0;
static  int flag2=0;
static  int flag3=0;
//char ans[30]={'\0'};
char fizzbuzz[30]="FizzBuzz";
char fizz[30]="Fizz";
char buzz[30]="Buzz";

//int num = 0;

char *toFizzBuzz(int n);
char *html_printer(char *elements);
char *text_printer(char *elements);

int main(void)
{
         int i = 1;
     char s[N];
     char text[50] = {'\0'};

     printf("html出力?:Y/N");
     scanf("%s",text);
      while(i<=100)
          {
        if(text[0] == 'Y')
        {
            char *ans = toFizzBuzz(i); //ここはhtml出力用
            printf("%s\n",html_printer(ans)); 
            }else{
            char *ans = toFizzBuzz(i); //ここはtext出力用
            printf("%s\n",text_printer(ans)); 
        }
        i++;
          }
    return 0;
 }
  
  
  
char *toFizzBuzz(int n)
{
    
    if ((n%3 == 0)&&(n%5 == 0)){      
       return "FizzBuzz";

    }else if(n%3 == 0){
       return  "Fizz";
   
    }else if(n%5 == 0){
       return  "Buzz";
   
    }else{
    static int tes;
        tes = n;
    static char s1[N] = {'\0'};
    sprintf(s1,"%d",tes);
    return s1;
    }
}


char *html_printer(char *elements)
{
    static char s[] = {'\0'};
        int len = 0;
    int i = 0;

    len = strlen(elements);//文字列の要素数取得
    
    for(i=0; i<len; i++)
    {
        sprintf(s,"<li>%s</li>\n",elements);       
    }
    
    return s;
}

char *text_printer(char *elements)
{
    static char s2[] = {'\0'};
        int len = 0;
    int i = 0;

    len = strlen(elements);//文字列の要素数取得
    
    for(i=0; i<len; i++)
    {
        sprintf(s2,"{%s}\n",elements);     
    }
    
    return s2;
}

ひとこと掲示板作成(PDO接続編)

前回http://ma-swan.hatenablog.com/entry/2019/02/22/013654、パーフェクトPHPの6章の「ひとこと掲示板作成」をlaravelのクエリビルダを用いて作成した。
ところで、僕が読んでいるパーフェクトPHP(第5刷)ではPHP5.3.2を使用することを前提に書かれている。
そのため、この「ひとこと掲示板作成」では、mysql_connect()を用いてDBに接続するようにコーディングされている。
しかし、mysql_ で始まる関数は、PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除された。現在では生PHPでDBに接続するためには、PDOまたはMySQLiを使用する。
そこで今回は、laravel使用環境だが勉強のためあえてPDO接続でDB接続をしてみた。
(※勿論、第5刷の時点でPDOについては11章で触れている。サンプルプログラムではmysql_connect()を使用しているという意味。最新版は未確認。)
また、PDOのクラスが存在しないというエラーが表示されることがあり、調べていると、php.iniを編集して、extension=php_pdo.dllを追記すべきという記事が多々見つかる。しかし、PHP 5.3 以降はこの工程が不要となっている。PHP公式マニュアル参照:

http://php.net/manual/ja/pdo.installation.php このエラーはOnelinebbsController2.phpのnamespaceの後にuse PDO;を追記することで解決した。

使用言語:PHP
使用フレームワーク:laravel

C:\xampp\htdocs\laravelapp>php --version
PHP 7.1.9 (cli) (built: Aug 30 2017 18:37:35) ( ZTS MSVC14 (Visual C++ 2015) x86 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
C:\xampp\htdocs\laravelapp>php artisan --version
Laravel Framework 5.5.12
OnelinebbsController2.php

<?php
//OnelinebbsControllerのデータベースPDO接続版

namespace App\Http\Controllers;
use PDO;
use Illuminate\Http\Request;
use App\Http\Requests\RubihuriRequest;
use Validator;
use Illuminate\Support\Facades\DB;
use App\Http\Requests\OnelinebbsRequest;

class OnelinebbsController2 extends Controller
{
    public function bbs_index2(Request $request)
    {
        //echo phpinfo();
        try{
            $dbh = new PDO(
                'sqlite:C:\xampp\htdocs\laravelapp\database\keijiban_database.sqlite',
                '',
                '',
                array(
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_EMULATE_PREPARES => false,
                )
            );

        //全体表示処理
            $prepare = $dbh->prepare('SELECT * FROM bbs');
            $prepare->execute();
            $result = $prepare->fetchAll(PDO::FETCH_ASSOC);

        } catch (PDOException $e) {

            $error = $e->getMessage();

        }
        //var_dump($result); 
        return view('layouts.bbs2',['items'=>$result]); 
        
        $dbh = null;
    }

    public function bbs_post(OnelinebbsRequest $request)
    {   
        /*
         bbs_postでは実際の画面表示はしない。画面遷移の処理である。
            最終的にリダイレクトして全体表示している。
        */
        date_default_timezone_set('Asia/Tokyo');
        
        try{
            $dbh = new PDO(
                'sqlite:C:\xampp\htdocs\laravelapp\database\keijiban_database.sqlite',
                '',
                '',
                array(
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_EMULATE_PREPARES => false,
                )
            );

            $date= date("Y/m/d H:i:s");
        //insert処理
            $prepare = $dbh->prepare('INSERT INTO bbs VALUES(:name,:comment,:date)');
            $prepare->bindValue(':name',(int)$request->name,PDO::PARAM_STR);
            $prepare->bindValue(':comment',(int)$request->comment,PDO::PARAM_STR);
            $prepare->bindValue(':date',(int)$date,PDO::PARAM_INT);
            $prepare->execute();
            $result = $prepare->fetchAll(PDO::FETCH_ASSOC);

        } catch (PDOException $e) {

            $error = $e->getMessage();

        }

        return redirect('/onelinebbs');
        
        $dbh = null;
    }
}
bbs2.blade.php

<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>ひとこと掲示板</title>
    </head>
    <body>
        <h1>ひとこと掲示板</h1>

        @if(count($errors)>0)
        <p>入力に問題があります。再入力してください。</p>
        @endif

        <table>
            <form action="/onelinebbs2" method="post">
                {{ csrf_field() }}
                @if($errors->has('name'))
                    <tr><th>ERROR</th><td>{{$errors->first('name')}}</td></tr>
                @endif

                <tr><th align="left" valign="middle">名前:</th><td><input type="text" name="name" value="{{old('name')}}"></td></tr><!--入力値はnameとして扱われる-->

                @if($errors->has('comment'))
                    <tr><th>ERROR</th><td>{{$errors->first('comment')}}</td></tr>
                @endif

                <tr><th align="left" valign="middle">ひとこと:</th><td><input type="text" name="comment" size="60" value="{{old('comment')}}"></td></tr>
                <tr><th></th><td><input type="submit" name="submit" value="送信"></td></tr>
            </form>
        </table>
        
        <table border="0">
            @foreach ($items as $key => $value)
                <ul>
                    <li>
                    {{$value['id']}} : {{$value['name']}} {{$value['comment']}} - {{$value['date']}};
                    </li>
                </ul>
            @endforeach
        </table>

    </body>
</html>
web.php

Route::get('onelinebbs_pdo','OnelinebbsController2@bbs_index2');

参考文献

qiita.com

Outlookで選択したアイテムを任意のフォルダ作成して格納したい

表題通り。普段メーラーOutlookを使っている。ファイルを別ディレクトリの中に分別して格納することがあるのだが、これを自動化した。

Sub sample()

 '   Application.ScreenUpdating = False

    Dim path As String
    Dim fso As Object
    Dim sunday As Date
    Dim monday As Date
    Dim foldername As String
    Dim inumber As Integer
    Dim i As Integer
    'Dim oFolder As Outlook.Folder 'フォルダ
    Dim nowitem As MailItem 'メールアイテム
    Dim nowdate As String
    Dim nowsbjct As String
    Dim ary As Variant '不可文字削除用配列
    Dim r As Integer
    Dim flname As String
    Dim PathAry As Variant 'path用配列

    Dim outlookObj As Outlook.Application 'サブフォルダの設定
    Dim myNameSpace, objmailItem As Object
    Dim InboxFolder, subfolder As Long


'    Set outlookObj = CreateObject("Outlook.Application")
'    Set myNameSpace = outlookObj.GetNamespace("MAPI")
'    Set InboxFolder = myNameSpace.GetDefaultFolder(6)
'    Set subfolder = InboxFolder.Folders("******")



    ary = Array("RE: ", "FW: ", "\", "/", ":", "*", "?", "<", ">", "|", """", "[", "]", ",")

    'Date減算
    monday = now - 7
    sunday = now - 1


    foldername = Format(monday, "yyyy年mm月dd日") & "~" & Format(sunday, "yyyy年mm月dd日")
'    Debug.Print foldername

    Set fso = CreateObject("Scripting.FileSystemObject") 'フォルダを作成するための専用のオブジェクト(インスタンス)
'
'
    PathAry = Array("test", "\test", "\test", "\test", "\test", "test", "\", "")
    PathAry(UBound(PathAry)) = foldername

' 
    path = Join(PathAry, "")

    'Debug.Print path
    fso.CreateFolder path 'フォルダの作成


'
    inumber = Application.ActiveExplorer.Selection.Count '選択中のアイテム数を取得

    'Debug.Print inumber

    For i = 0 To inumber - 1 
'
        Set nowitem = Application.ActiveExplorer.Selection.Item(i + 1) 'i番目のアイテムの定義
'
        nowsbjct = nowitem.Subject '件名(?)
        'nowdate = nowitem.ReceivedTimeここは関係ない

        'Debug.Print nowsbjct

        For r = 0 To UBound(ary)
            nowsbjct = Replace(nowsbjct, ary(r), "")
        Next r

        flname = nowsbjct & ".msg" 'ファイル名生成

'        Debug.Print flnam    

        'nowitem.SaveAs path & flname, olMSG

        nowitem.SaveAs path & "\" & flname, olMSG 'ファイル保存




    Next i

        Set fso = Nothing
        Set nowitem = Nothing

End Sub