mikan's technical note

仕事&趣味で実験した小技の備忘録です(Linux,windows,DOS等)

MENU

【ぼくのPC大改造計画】最新 Core i3-8100 で普段使いマシンを組む

普段使いのPC

メインPCはi7-8700K&GTX1080で、普段はネット見るのと音楽再生にしか使ってないので消費電力が無駄に高い・・・気がして精神衛生上もよろしくない。

パーツ選定

第8世代i3は4コア4スレッドTDP65Wで、第7世代i5同等とも言われており非常に気になる。

マザーもオーバークロック非対応の低価格版が出回ってきたので、比較的低予算で揃えることが可能になってきた。

ホントはMini-ITXが欲しかったのだが予算的に厳しかったので、ツクモで見つけた税別19,980円のCore i3-8100BOX&PRIME H370M-PLUS(Micro-ATX)のセット品を購入。

その他のパーツは手持ちのパーツを流用。

※i5-8400がジャスト2万円で売っているので、予算が許すのであればi5を強くオススメする

購入したパーツ

f:id:myerss555:20180708021103j:plain

パーツ 名称 価格
(税込)
CPU intel
core i3-8100 BOX(4C4T 3.6GHz)
11,556
マザー ASUS
PRIME H370M-PLUS
10,022
メモリ Corsair
CMK16GX4M2A2666C16(DDR4 PC4-21300 8G)
流用
グラフィック intel
内蔵GPU
-
ストレージ Crucial
MX300 CT275MX300SSD1/JP(SSD 275GB)
流用
電源 AcBel
ATX 80PLUS Bronze(400W)
流用
PCケース Thermaltake
CORE V21 Micro-ATXキューブ
流用
ケースファン Novonest
LEDホワイト 120mm 25mm厚 1300rpm
流用
ケースファン Novonest
多段階LED切替 120mm 静音タイプx2
流用
CPUクーラ サイズ
白虎 92mmファン 300~2300rpm
流用
OS Microsoft
Windows10 Pro 64bit
970
  合計 22,548

★CPU:intel Core i3-8100 BOX 4C4T 3.6GHz

4コア4スレッドの第7世代i5と同じスペック。

ベンチマークではi5-7400とi5-7500の中間。

1万円のi3が第7世代のi5を凌いでしまうという容赦無い実力。

★マザー:ASUS H370M-PLUS

Micro-ATXマザー。

オーバークロック機能が無いだけで、ほぼZ370と同じ仕様なのでK無しCPUを使うのであれば十分すぎるスペック。

★OS:Microsoft Windows10 Pro 64bit

今回もヤフオクのお世話になりました・・・

組み立て

f:id:myerss555:20180708021128j:plain

 

f:id:myerss555:20180708021201j:plain

f:id:myerss555:20180708021230j:plain

 

f:id:myerss555:20180708021353j:plain

f:id:myerss555:20180708021412j:plain

ベンチマーク結果

 i5-8400 + GeForce GTX 1050 Ti と比較するために、i3-8100 にも同じ GeForce GTX 1050 Ti を使用してベンチマークを走らせてみた。

ドラゴンクエストXベンチマーク

【i5-8400】18734

【i3-8100】17484

 f:id:myerss555:20180708021851j:plain

PSO2ベンチマーク

【i5-8400】21883

【i3-8100】20399 f:id:myerss555:20180708022036j:plain

ファイナルファンタジーXVベンチマーク(軽量品質)

【i5-8400】5089

【i3-8100】5039

f:id:myerss555:20180708022350j:plain

おまけ(内蔵GPUで計測)

f:id:myerss555:20180708022556j:plain

総括

ビデオカード無しで、デュアルディスプレイに出力しているが、普通というかめちゃめちゃ快適。

重い作業(エンコ等)をするわけでもないので、i5-8400やi7-8700Kと比べても体感的な違いは全く感じない(汗

i3-8100全然アリだと思います!

 

【shell】毎日指定時間内に動的にSQLを生成して実行する

21:00:00~23:59:59 の間、処理を繰り返したい場合の例

resident_main.sh

#!/bin/bash

############################################################
#
# 毎日指定時間内にSQL実行(常駐)
# (c) 2018 mikan
# ※使用にあたっては利用者の自己責任でお願いします。
#  使い方:
#          例)nohup bash resident_main.sh &
#
#     ログファイル名:yyyymmdd_HHMMSS_sql_main.log
#
############################################################

### ----- 初期処理
LOG_FILE_NAME=`date +%Y%m%d_%H%M%S`_sql_main.log

### ----- 終了フラグ
END_FLG="end.flg"

### ----- スリープ時間(1~60秒程度で設定)
SLEEP_TIME=2

### ----- 進捗表示用(ASCIIコードの16進) debug用
#CODE=0 #debug

SYSTEM_DATE=`date +%Y/%m/%d_%H:%M:%S`
echo "※21:00~17:59の間はスリープします" >> $LOG_FILE_NAME
echo "※中断したい場合は、touch $END_FLG" >> $LOG_FILE_NAME
echo "[$SYSTEM_DATE]: ===== SQL実行メイン(常駐) - 開始 =====" >> $LOG_FILE_NAME

# ----- 終了フラグを削除
if [ -f `pwd`/$END_FLG ]
then
  rm `pwd`/$END_FLG
fi

### ----- 処理完了日
DAY_COMPLETE=00000000

### ----- DAY_COMPLETE を外部ファイルへ出力(グローバル変数として使用)
echo "DAY_COMPLETE=$DAY_COMPLETE;export DAY_COMPLETE" > day_complete.dat

### ----- メインループ
while :
do
  # ----- ※00:00~20:59の間はスリープ
  while :
  do
    # ----- 終了チェック
    if [ -f `pwd`/$END_FLG ]
    then
      SYSTEM_DATE=`date +%Y/%m/%d_%H:%M:%S`
      echo "[$SYSTEM_DATE]: $END_FLG 検出!" >> $LOG_FILE_NAME
      echo
      echo "[$SYSTEM_DATE]: ===== SQL実行メイン(常駐) - 終了 =====" >> $LOG_FILE_NAME
      echo
      exit 0;
    fi

    # ----- 時刻チェック
    S_TIME=`date +%H` # 本番 (時)

    case $S_TIME in
      21 | 22 | 23 ) #21時~23時(21:00:00~23:59:59)の場合はループを抜ける
         break;;
      * ) #実行時間外
         sleep $SLEEP_TIME
         continue;;
    esac

    sleep $SLEEP_TIME
  done

  # ----- DAY_COMPLETE を取得
  . ./day_complete.dat

  # ----- システム日付(yyyymmdd)を取得
  DAY_TODAY=`date +%y%m%d`

  #----- 1日1回だけSQL実行を呼び出す
  if [ $DAY_TODAY != $DAY_COMPLETE ]
  then
    # ----- SQL実行呼び出し
    SYSTEM_DATE=`date +%Y/%m/%d_%H:%M:%S`
    echo "[$SYSTEM_DATE]: SQL実行を呼び出し" >> $LOG_FILE_NAME
    bash ./sqlexe.sh

    # ----- 処理完了日へシステム日付(yyyymmdd)を取得
    DAY_COMPLETE=`date +%y%m%d`

    # ----- DAY_COMPLETE を外部ファイルへ出力(グローバル変数として使用)
    echo "DAY_COMPLETE=$DAY_COMPLETE;export DAY_COMPLETE" > day_complete.dat

    SYSTEM_DATE=`date +%Y/%m/%d_%H:%M:%S`
    echo "[$SYSTEM_DATE]: DAY_COMPLETE(処理完了日)=$DAY_COMPLETE" >> $LOG_FILE_NAME
  fi

  sleep $SLEEP_TIME
done

# ----- 理論上ここを通ることはない
exit 1

resident_sql.sh

#!/bin/bash

############################################################
#
# 動的にSQLを生成して実行
# (c) 2018 mikan
# ※使用にあたっては利用者の自己責任でお願いします。
#
#   ログファイル名:yyyymmdd_HHMMSS_sql_exec.log
#
#   SQL文だけを抽出する例
#     grep -v ": " 20180515_215302_sql_exec.log
#
#   SQL文以外の実行ログを抽出する例
#     grep ": " 20180515_215402_sql_exec.log
#
############################################################

### ----- ログファイル
LOG_FILE_NAME=`date +%Y%m%d_%H%M%S`_sql_exec.log

### ----- SQL実行間隔(1~5秒程度で設定)
SLEEP_TIME=5

### ----- 終了フラグ
END_FLG="end.flg"

### ----- パラメータファイル取込
. ./param.txt

echo
SYSTEM_DATE=`date +%Y/%m/%d_%H:%M:%S`
echo "[$SYSTEM_DATE]: ===== SQL実行 - 開始 ====="

### ----- メインループ
for i in "${dateArray[@]}";
do

  # ----- 終了チェック
  if [ -f `pwd`/$END_FLG ]
  then
    echo "$END_FLG 検出!"
    echo
    SYSTEM_DATE=`date +%Y/%m/%d_%H:%M:%S`
    echo "[$SYSTEM_DATE]: ===== SQL実行 - 終了 =====" >> LOG_FILE_NAME
    echo
    exit 0;
  fi

  # ----- 時刻チェック(18,19,20時以外は終了)
  S_TIME=`date +%H` # 時

  case $S_TIME in
    21 | 22 | 23 ) #21時~23時(21:00:00~23:59:59)の場合は処理
       ;;
    * ) #実行時間外(処理終了)
       break;;
  esac

  # ----- 各項目を取得
  data=(${i[@]})
  EXEC_DAY=${data[0]}
  DATE_STR=${data[1]}
  DATE_END=${data[2]}

  # ----- インクリメント
  COUNT=$(( COUNT + 1 )) #初期値はゼロ(初期化不要)

  # ----- 処理日チェック
  S_TIME=`date +%Y%m%d`
  echo "[$COUNT]: システム日付[$S_TIME] パラメータ[$EXEC_DAY $DATE_STR $DATE_END]" >> $LOG_FILE_NAME
  if [ $S_TIME != $EXEC_DAY ]
  then
    echo "[$COUNT]: 本日対象外の処理日行($EXEC_DAY)はスキップ" >> $LOG_FILE_NAME
    continue
  fi

  # ----- 条件表示
  S_YEAR=${DATE_STR:0:4}
  S_MON=${DATE_STR:4:2}
  S_DAY=${DATE_STR:6:2}
  S_NO=${DATE_STR:8}
  E_YEAR=${DATE_END:0:4}
  E_MON=${DATE_END:4:2}
  E_DAY=${DATE_END:6:2}
  E_NO=${DATE_END:8}

  # ----- SQLファイル削除
  if [ -f `pwd`/tmp.sql ]
  then
    rm `pwd`/tmp.sql
  fi

  # ----- SQLファイル作成ループ ※SQLは目的に合わせて書き換えてください
  for j in "${tableArray[@]}";
  do
    # ----- 各項目を取得
    tableName=(${j[@]})

    # ----- SQL
    echo "DELETE from $tableName" >> tmp.sql
    echo "  WHERE 項目名1 BETWEEN '$DATE_STR' AND '$DATE_END'" >> tmp.sql
    echo "    AND 項目2 IN ('AAA','BBB','CCC');" >> tmp.sql
    echo "commit work;" >> tmp.sql
  done;

  # ----- SQL実行 ※xxDBは環境に合わせて書き換えてください
  SYSTEM_DATE=`date +%Y/%m/%d_%H:%M:%S`
  echo >> $LOG_FILE_NAME
  echo "----- SQL start [$COUNT][$SYSTEM_DATE] -----" >> $LOG_FILE_NAME
  date >> $LOG_FILE_NAME
  rdbexecsql -s xxDB -i `pwd`/tmp.sql >> $LOG_FILE_NAME
  date >> $LOG_FILE_NAME
  SYSTEM_DATE=`date +%Y/%m/%d_%H:%M:%S`
  echo "----- SQL end   [$COUNT][$SYSTEM_DATE] -----" >> $LOG_FILE_NAME
  echo >> $LOG_FILE_NAME

  # ----- 終了チェック
  if [ -f `pwd`/$END_FLG ]
  then
    echo "$END_FLG 検出!" >> $LOG_FILE_NAME
    break;
  fi

  # ----- スリープ
  sleep $SLEEP_TIME
done;

SYSTEM_DATE=`date +%Y/%m/%d_%H:%M:%S`
echo "[$SYSTEM_DATE]: ===== SQL実行 - 終了 =====" >> LOG_FILE_NAME
echo

exit 0

param.txt

### ----- 処理完了日(debug等特殊な場合を除き通常は"00000000"を設定)
DAY_COMPLETE=00000000;export DAY_COMPLETE

### ----- 対象テーブル
tableArray=(
'xxxx.テーブル1'
'xxxx.テーブル2'
'xxxx.テーブル3'
)
export tableArray

### ----- BETWEEN 条件
#
# システム日付と処理日が一致する行だけが
# 実行対象となります
# 一致しない行は、スキップします
#
#-処理日- -----開始------ -----終了------
dateArray=(
'20180516 2008010100000 2008123199999'
'20180516 2009010100000 2009123199999'
'20180517 2010010100000 2010123199999'
'20180517 2011010100000 2011123199999'
'20180518 2012010100000 2012123199999'
'20180518 2013010100000 2013123199999'
)
export dateArray