猫とコード

化学メーカーでweb開発している猫大好きエンジニアの備忘録です。

Windowsで仮想メモリを最大値に設定する

環境

  • Windows10(EP 1607/OS 14393.5006)
  • RAM8GB
  • SSD(256GB 使用率45%程度)

課題

変更前は仮想メモリ1910MBでタスクマネージャー>パフォーマンス>メモリのコミット済みは10GB未満でした. RAM8GBでセキュリティウェアが3つ動くとメモリが足りないというエラーが出て困っていました.

解決

仮想メモリを最大化することで今のところメモリ不足が起きていません. 物理メモリの使用率が減ったため,体感で多少の速度低下を感じます.

手順

  1. Win+R sysdm.cpl  システムのプロパティを開く
  2. 詳細設定>パフォーマンス>設定  パフォーマンスオプションを開く
  3. 詳細設定>仮想メモリ>変更  仮想メモリを開く
  4. 上部の「すべてのドライブのページングファイルのサイズを自動的に管理する」にチェック⇒OK

追記:

Microsoftメモリリークツール testlimitで検証してみました.

learn.microsoft.com

testlimitの使い方は下記のとおりです.末尾でMBを指定(6000MB⇒6GB)

> Testlimit64.exe -d -c 6000 

総負荷が物理メモリ未満であれば物理メモリが50%程度になるようにに分けて動かしているように見えます.

総負荷が物理メモリの最大容量に近づくにつれ,物理メモリの負荷が高まり,RAM以上の負荷をかけると物理メモリ側が90%でひっ迫するようになります. (退避は出来ているようで,explorerが停止したりは起きませんでした)

まず速度優先で物理メモリで処理して,徐々に仮想メモリに移しているような動きが見えました.

ODBC/JDBCを使ってテーブル定義を取得する(Vertica/MySQL/SQL Server)

ODBC/JDBCを介してテーブル定義を取得したい.

Vertica

\d schema_name.table_name

で出力可能だがODBCで使えないためv_catalog.columnsからSELECTする.

SELECT * FROM   v_catalog.columns WHERE  table_schema='schema_name'  AND table_name='table_name' ORDER  BY ordinal_position;

参考 https://stackoverflow.com/questions/26398989/vertica-describe-table

MySQL

SHOWコマンドはODBC経由で実行できる.

SHOW FULL COLUMNS FROM schema_name.table_name

参考 MySQLでテーブル定義を調べる方法 - Qiita

SQLServer

EXEC コマンドは通るようだが,期待した列リストが得られなかったので,sys.tablesから取得した.

SELECT s.name as schema_name, t.name as table_name, c.* FROM sys.columns AS c
INNER JOIN sys.tables AS t ON t.object_id = c.object_id
INNER JOIN sys.schemas AS s ON s.schema_id = t.schema_id
WHERE t.name = 'mytable' AND s.name = 'dbo';

参考 テーブルの定義の表示 - SQL Server | Microsoft Learn

STWEETを使う

参考 self-development.info

pip install -U stweet

import stweet as st
 
 
def try_user_scrap():
    user_task = st.GetUsersTask(['shinjo_freedom'])
    output_json = st.JsonLineFileRawOutput('output_raw_user.jl')
    output_print = st.PrintRawOutput()
    st.GetUsersRunner(get_user_task=user_task, raw_data_outputs=[output_print, output_json]).run()
 
 
if __name__ == '__main__':
    try_user_scrap()

Google Colab上でも取得できた.

Following,Followerのリストを取得したかったが,対応していないとのこと. 残念.

参考:

Can I get the tweet user's followers and followings · Issue #63 · markowanga/stweet · GitHub

Can tweet2.0 get the user's followers and followings · Issue #83 · markowanga/stweet · GitHub

論文執筆の助けになりそうなもの

論文穴埋め式作成シート

必要項目埋めれば骨子ができる

readingmonkey.blog.fc2.com

ぎりぎり合格への論文マニュアル

言い換えリスト。

あと単純に面白い

VBScriptのRecordSetから列名を抽出する

For Eachで回せばRecordsetのポインタを意識しなくて済むので良さそうです。

For Each Field In rsObj.Fields
    Response.Write "<th>"
    Response.Write  Field.name
    Response.Write  "</th>"
Next 

列名

Field.name

Field.value

Verticaで月毎にクロス集計する

Verticaでクロス集計したいときに使えそうなSQL

対象データ

salestable

salesdate prod sales return total
20221001 name 1000 -500 500
20221002 name2 800 -100 700
20221003 name 100 -100 0
20221101 name 1000 -500 500
20221201 name 1000 -500 500

というテーブルがあるときに月別にクロス集計したい

※salesdateは日付型ではなくテキスト型で持っています

集計イメージ

salesを月別に集計したい(+sale集計の千円単位も表示したい)

10月 sales sales(千) 11月 sales sales(千) 12月 sales sales(千)
... ... ... ... ... ...

SQL

SELECT
'' as '10月'
,SUM(case SUBSTRING(salesdate,1,6) when '202210' then sales end) as 'sales' --月絞り込み
,round(SUM(case SUBSTRING(salesdate,1,6) when '202210' then sales end)/1000) as 'sales(千)'
,'' as '11月'
,SUM(case SUBSTRING(salesdate,1,6) when '202211' then sales end) as 'sales'
,round(SUM(case SUBSTRING(salesdate,1,6) when '202211' then sales end)/1000) as 'sales(千)'
,'' as '12月'
,SUM(case SUBSTRING(salesdate,1,6) when '202212' then sales end) as 'sales'
,round(SUM(case SUBSTRING(salesdate,1,6) when '202212' then sales end)/1000) as 'sales(千)'
from salestable
where 20221001 <= salesdate AND salesdate <= 20221231
limit 300000 --負荷軽減

salesdate(日付)がテキスト型ではなく日付型の場合はdate_truncが使えそうです。

SUBSTRING(~)の部分下記のように書き換えでできそうです。

sum(case date_trunc('month',salesdate) when '2022-10-01 00:00:00' then ...

SQL SERVERの基本構文

SQL SERVERの基本構文

忘れまくるので忘備録

INSERT

テーブル丸コピー

INSERT INTO table1
SELECT * FROM table2

条件指定

INSERT INTO table1
SELECT * FROM table2
WHERE column1 = ''

特定のカラムに値をいれる

INSERT INTO table1(colmn1,colmn2,colmn3,...)
VALUES (value1,value2,valu3,...)

全カラムに値を手入力して挿入

INSERT INTO table1
VALUES (value1,value2,valu3,...)

UPDATE

UPDATE table1
SET column1 = ''
,  column2 = ''
WHERE column0 = ''

サブクエリ(FROM句)

SELECT column1,column2
FROM (
    SELECT columnA1,columnA2
    FROM table1
    WHERE columnB = ''
) 

CASE-WTHEN文の入れ子

CASE
    WHEN column1 = '' Then
        CASE column2
            WHEN '条件値1' THEN '入力値1'
            WHEN '条件値2' THEN '入力値2'
            WHEN '条件値3' THEN '入力値3'
            ELSE ''
        END
    ELSE ''
END

SQLSERVERではIF文なくてCASEを使う。 CASE 対象のカラム WHEN 条件値 THEN 入力値 の構文

入れ子にしても使える。

DELETE

DELETE FROM table_name
WHERE colmn = val

VBSCRIPT基本構文

忘れまくるので忘備録

IF

いつもElseIfの書き方忘れる

If 条件 Then

ElseIf 条件

Else

End If

RecordSetEOFと併せて使うDo Until

Do Until recordSetObj.EOF

    recordSetObj.MoveNext
Loop

配列(ArryaListクラスではない)と併せて使うFor

For i=0 To UBound(list)

Next

ArrayListでAddしたのちに配列に変換する

Set arraylist = CreateObject("System.Collections.ArrayList")
str = recordSetObj("name") ' 変数に格納しないとRecordsetのポインタ格納されるため
arraylist.Add str
list = arraylist.ToArray()

CASE文

Select Case string
    Case "a"   (処理)
    Case "b"   (処理)
    Case Else   (処理)
End Select

Defaultに当たるのがCase Else。 End Selectはほんとに忘れる。 この手の全部End ~にしてほしかったし、 何ならEND入れなくてもよくしてほしかった。

Replaceで大文字小文字を区別せずに変換する

SQLインジェクション対策で使った。update、UPDATE,Update,upDate.. 大文字小文字を正規表現まで使わなくて変換可能なので楽なのでは。

引数:対象String,変換元ワード、変換後ワード、1文字目から対象に変換(1)、変換個数指定なし(-1)、大文字小文字を区別しない(1)

after = Replace(before,"update","",1,-1,1)

エラーを無視して続ける

SQL文発行をエラー無視にすると問合せしつづけるようで 重くなるので注意です。

On Error Resume Next

(処理)

If Err.Number <> 0 Then
    Response.Write(Err.Description)
End If

ファイル・フォルダの有無の確認

23/07/18追記 FileSystemObjectについて

Set fso = CreateObject("Scripting.FileSystemObject")

FilderPath = "D:\folder"
FilePath = "D:\folder\file.png"

' 該当Fileが"存在する"かチェック
If fso.FileExists(FilePath) Then
 ' ファイルが存在する時の処理
End If

' 該当Folderが"存在しない"かチェック
' 存在しない場合,同名の新規フォルダを作成する
if NOT fso.FolderExists(FilderPath) Then 
  fso.CreateFolder(FilderPath)
End If

ファイルの削除の確認

fso.DeleteFile FilePath

Base64バイナリで受け取ったファイルをStreamで画像として保存する

長くなったので別記事にしました

Vertica vsqlでCOPYでlocal fileをINSERTする

データのCSV(要utf-8)を作成して、それをCOPYでロードする vsqlでログインし下記の操作

=> TRUNCATE TABLE table;

全件ロードなので古いデータは削除しました。

=> COPY table FROM '/vertica_data/~~~~/~~~.csv'
=> DELIMITER ','
=> ENCLOSED BY '"'
=> COMMIT;

Rows Loaded
-----------
       件数
(1 row)
=> SELECT column FROM table;

最後にSELECTでデータを確認して完了。

Verticaで複数のInsertはできない

Verticaで複数行(multiple)のINSERTをしたいができないらしい

vertica don't worked multiple insert.

INSERT INTO table(column1,colmun2)
VALUES 
(value1,value2,value3)
,(value4,value5,value6)
,(value7,value8,value9);

ということがしたいがsyntax errorとなっておかしいなと思ったら 一行ごとにしないといけないらしい

INSERT INTO table(column1,colmun2) VALUES(value1,value2,value3);
INSERT INTO table(column1,colmun2) VALUES(value4,value5,value6);
INSERT INTO table(column1,colmun2) VALUES(value7,value8,value9);

VSQLでUNIONで挿入したいVALUEを複数SELECTするか、 copyコマンドでローカルファイル化したCSVを投入するとのこと。

参考: https://forum.vertica.com/discussion/239512/insert-multiple-rows-with-insert-into

IIS & XAMPPのMYSQL/APACHEのサービス再起動方法

batファイルでnet stop ~ net startを設定してサービスを直接停止・起動します。

起動アカウントが違うためかXAMPP画面上からは操作できなくなります

net stop Apache2.4
net start mysql
net start Apache2.4

Windowsでポート検証

Windowsはtracertでポート指定ができない。

tracertはpingと同じicmpプロコトル通信になるそうです。

PowerShellでTest-NetConnectionを使ってポート接続検証ができます。

Test-NetConnection x.x.x.x -Port 80 -InformationLevel Detailed
ComputerName            : x.x.x.x
RemoteAddress           : x.x.x.x
RemotePort              : 80
NameResolutionResults   : x.x.x.x
MatchingIPsecRules      :
NetworkIsolationContext : Private Network
IsAdmin                 : False
InterfaceAlias          : Wi-Fi
SourceAddress           : x.x.y.y
NetRoute (NextHop)      : x.x.z.z
TcpTestSucceeded        : True

Windowsでポート検証

Windowsはtracertでポート指定ができない。 tracertはpingと同じicmpプロコトル通信になるそうです。

PowerShellでTest-NetConnectionを使ってポート接続検証ができます。

Test-NetConnection x.x.x.x -Port 80 -InformationLevel Detailed
ComputerName            : x.x.x.x
RemoteAddress           : x.x.x.x
RemotePort              : 80
NameResolutionResults   : x.x.x.x
MatchingIPsecRules      :
NetworkIsolationContext : Private Network
IsAdmin                 : False
InterfaceAlias          : Wi-Fi
SourceAddress           : x.x.y.y
NetRoute (NextHop)      : x.x.z.z
**TcpTestSucceeded        : True