なんでもぶろぐ

ゲームやプログラムなど作ったものや学習したものをまとめておくブログ

Python In Excelを導入する

※すべて自己責任でお願いします。Pythonの実行はローカルのPCではなく、すべてクラウド上で行われるため重要なデータの場合は特に注意が必要かもしれません。

環境

Microsoft 365

Excelをプレビュー版に変更する

2023/10/12 時点ではプレビューバージョンでしか使用できないためExcelをプレビュー版に変更する。

ファイル>アカウント>Microsoft 365 Insiderを選択し、
Microsoft 365 Insiderに参加を選択する。

プレビューに変更

ポップアップが開くので、チャネルを「ベータチャネル」に変更、同意をチェックしてOKボタンを押す

チャネルの選択、同意
アップデートが始まるのでExcelを閉じて待つ。
完了したらExcelを開いて数式リボンの中にPythonがあれば使用できる状態になっている
Python挿入
アップデート後すぐに開いたらPython挿入がないことがあったが何回か開きなおしていたら出てきた。出てこなければ、再起動などしてみるといいかもしれない。

エディターを追加する(おまけ)

サンプルコード
Pythonのコード入力は関数を入力する場所と同じである。
サンプルコードを挿入してみたが少し長くなると厳しそうだと感じた。
そこでPython Editorなるものがあるようなので導入してみることにした。

Excel Labsの導入

Python EditorはExcel Labsというアドインの一部のようなのでExcel Labsを導入していく。
リボンの開発からアドインし、ストアを開く
(開発がない場合はファイル>オプション>リボンのユーザー設定から開発を有効にする)

アドインの追加

ストアの検索で「Excel Labs」を入力し、追加>続行を選択する

Excel Labsの追加

リボンのホームにExcel Labsが追加されているので選択すると、サイドバーが開き、一番下にPythonEditorがあるのでOpenで開くことができる。

Editorを新しいウィンドウで開く

サイドバーのままだと使いずらいのでEditorを新しいウィンドウで開く。
Excel Labsで開くボタンを押し、移動を選択する。
マウスポインターが十字に変形し、移動するので左クリックを押したまま
マウスを大きく動かすと新しいウィンドウで開ける。
サイドバーに戻したいときはExcelの一番右端に移動すれば戻る。

新しいウィンドウで開く

Python In Excelの基本

※すべて自己責任でお願いします。Pythonの実行はローカルのPCではなく、すべてクラウド上で行われるため重要なデータの場合は特に注意が必要かもしれません。
Excelバージョン 2311 ビルド 16.0.17005.20000

環境構築

Python In Excelを使用するにはInsider版を使用する必要があります。
設定方法は以下のページで解説しています。
knut.hatenablog.jp

実行方法

Pythonの実行は関数と同じようにセルに対して設定できます。
挿入したいセルを選択し、以下のどちらかで挿入できます。

  • 数式>Pythonの挿入を選択する

Python挿入

  • 関数入力欄に入力する
=PY(

正しくは =PY() と入力するはずですが =PY( を入力した段階でPythonセルになります。

セルの値を取得する

セルの値の取得には xl() を使用します。Excel関数と同様にマウスクリックでも値を選択できます。

  • 一つのセルを取得する
xl("A1")

文字の場合はstring型、数値の場合はint型などが返されます。

  • 範囲のセルを取得する
xl("B1:C4")

DataFrame型を返します

  • テーブルの値を取得する
xl("テーブル1[#すべて]", header=True)

DataFrame型を返します
headerをTrueにすると最初の行がヘッダーとなります

出力の種類

セルの演算結果としてPythonオブジェクトかExcelの値かを選択できます。
以下の画像のように入力の左側で選択できます。

Pythonオブジェクトを選択すると出力されるPythonオブジェクトの型がセルに表示されます。
Excelの値を選ぶとデータが展開されます。以下の画像はテーブルのデータを取得し、PythonオブジェクトとExcelの値で表示している例です。

ここで注意が必要なのがExcelの値を選択しても、処理としてPythonを使用していることです。
ぱっと見ではPythonで処理したデータか打ち込んだデータかわかりずらいです。
そのため、後述する処理の順序において、はまりポイントになりがちです。

処理の順序

Python In Excelでは複数のPythonセルがあるときは既定の順序に従って処理されていきます。
このとき処理が終わっていないセルを参照してしまうと循環参照となりエラーが起きます。
そのため、処理の順序を意識することでバグを減らせると思います。

関数内の順序

Pythonセル内の処理は上から下に順番に処理されます。
また、最下行の処理の結果が返されます。

セルの処理順序

あるシート内において、Pythonセルが複数ある場合は初めにA1、B1と行の左から順番に実行されていきます。1行目が終わると2行目のA2、B2と処理されていきます。
そのため、画像のように処理が終わっていないセルを参照してしまうと循環参照のエラーとなります。

シートの処理順序

左から順番に処理が実行されていきます。
Sheet2からSheet1のデータを取得している場合、シートの位置を入れ替えてしまうと循環参照のエラーになります。

計算方法の設定

デフォルトではセルの依存値が変更されると、すべてのPythonセルは自動で再計算されます。
計算方法の設定を変更すると自動計算されなくなり、手動での再計算ができるようになります。

一部と手動の違いはわかりませんでした。

その他の注意点

Python内でネットワーク通信はできない(400エラーがでる)

google maps api でカスタマイズしたピンを表示する

目次

  • ベースの地図表示
  • 文字の変更
  • 図形の変更1
  • 図形の変更2
  • SVGによる図形と文字の変更

ベースの地図表示

以下のhtmlを基準にカスタマイズする
地図を表示してるだけ

<div id="map" style="height:400px;width:500px;"></div>
<script>
  function initMap() {
    var LatLng = {lat: 31.5835699, lng: 130.6502527};

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 12,
      center: LatLng
    });

    var marker = new google.maps.Marker({
      position: LatLng,
      map: map,
    });
  }
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=**YOUR_API_KEY**&callback=initMap">
</script>

文字の変更

google.maps.Markerのlabelを以下のようにするとテキストを変更できる

    var label = {
      text:"さくらじま", //表示する文字列
      color:"#00F", //色
      fontFamily:"Arial",//フォント指定
      fontSize:"20", //フォントのサイズ指定
      fontWeight:"bold" //文字の太さ
    };

    var marker = new google.maps.Marker({
      position: LatLng,
      map: map,
      label:label
    });

Marker  |  Maps JavaScript API  |  Google for Developers

図形の変更1

google.maps.MarkerのIconで変更できる
図形はPathで指定する。

    var icon = {
        path:google.maps.SymbolPath.CIRCLE, //必須 形状の指定
        anchor: new google.maps.Point(0,0), //シンボルの位置を設定(-左 +右 , -上 +下)
        fillColor:"#F00", //色指定
        fillOpacity:0.5, // 透過率の指定
        labelOrigin:new google.maps.Point (0,0),//pathの原点に対するラベルの原点位置(-左 +右 , -上 +下)
        rotation:0, //回転
        scale:30,// サイズの指定
        strokeColor:"#0F0", //枠線の色
        strokeOpacity:0.5,//枠線の透過率
        strokeWeight:5,//枠線の太さ
    };

    var marker = new google.maps.Marker({
      position: LatLng,
      map: map,
      icon: icon,
      label: label
    });

定義済みの図形は5種類あるのでPathを指定すれば変更できる
https://developers.google.com/maps/documentation/javascript/reference/marker?hl=ja#SymbolPath:titile

BACKWARD_CLOSED_ARROW
BACKWARD_OPEN_ARROW
CIRCLE
FORWARD_CLOSED_ARROW
FORWARD_OPEN_ARROW

var icon ={
      path:google.maps.SymbolPath.BACKWARD_CLOSED_ARROW
      //...以下略
}

図形の変更2

PathはSVG形式で指定することもできる

//縦20、横50の長方形を作る
var svg = "M -25,10 25,10 25,-10 -25,-10 z";

var icon ={
      path: svg,
      //...以下略
}

SVGによる図形と文字の変更

SVGマークアップを指定することもできる
SVGはHTML内にマークアップで記入することができる

<body>
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
        <title>810_pin_h</title><rect width="48" height="48" fill="none"/>
        <path d="M39,19c0,11-15,25-15,25S9,30,9,19a15,15,0,0,1,30,0Z" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
        <circle cx="24" cy="19" r="5" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
        <text x="24" y="19" font-size="20" text-anchor="middle" stroke-width="0.5" fill="green">test</text>
    </svg>
</body>


設定によりピンの色を変えたかったのでJavaScriptで設定できるようにする
fillで色を変更できるので設定する

    var template = [
    '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44 44" width="40px" height="40px">',
        '<path d="M39,19c0,11-15,25-15,25S9,30,9,19a15,15,0,0,1,30,0Z" fill="{{ color1 }}"/>',
        '<circle cx="24" cy="19" r="8" fill="{{ color2 }}"/>',
        '<text x="24" y="19" font-size="20" text-anchor="middle" stroke-width="0.5" fill="blue">test</text>',
    '</svg>'].join('\n');
    var svg = template.replace('{{ color1 }}','#F27398').replace('{{ color2 }}', '#58BE89');
    var icon = {
        url: 'data:image/svg+xml;charset=UTF-8;base64,' + btoa(svg)
    };

    var marker = new google.maps.Marker({
      position: LatLng,
      map: map,
      icon:icon
    });

おわり

ARK 恐竜召喚コマンド Aberration編


とりあえずわかるものだけ、落ち着いたら全部統合する予定
不明なのが3体残ってる
ネタバレ注意

Namelessはどんどんわいてくるので注意。



テイム済み
レベル指定

騎乗可能


メインコマンド
サブコマンド

ARK : Survival Evolved 恐竜 召喚 コマンドビルダ

Aberration 編 よくわからん恐竜が少し残ってる
ARK 恐竜召喚コマンド Aberration編 - ARK設定メモ

作り直したやつ
ARK:Survival Evolved 召喚コマンド

恐竜を召喚するコマンドを生成するページを作ってみました

※アルファ系、ボス系はテイムされていない状態で生成されますので気を付けてください。以下のコマンドでテイムは可能です。

admincheat forecetame

イベント系の恐竜は呼び出せませんでした。イベント期間中のみ?
1コマンドで完了できないときはサブコマンドが表示されます。


テイム済み
レベル指定

騎乗可能


v268追加フェニックス
v266追加カワウソ
メインコマンド
サブコマンド

Citadel: Forged With Fire Linux 個人サーバー設定メモ

Citadelバージョン:12342-2

最終的にGame.iniに以下の形で書き込みます。
変更しない設定も書いておいたほうがよさそうです。

[/script/citadel.socialmanager]
Password=citadel123

[/script/citadel.citadelgameinstance]
WorldCreationSettings=(ServerName="PrivateServer",Password="",ServerType=PVP,PlayerLimit=40,bPrivate=false,ExperienceMultiplier=1,InventoryCapacityMultipler=1,KnowledgePointEarnedMultiplier=1,CharacterPointEarnedMultiplier=1,bUnlimitedResources=false,PlayerDamageMultiplier=1,ArmorMultiplier=1,BaseManaRegen=0,InventoryCapacityMultiplier=1,bInventoryWeightRestrictions=true,MagicFindMultiplier=1,CraftingMagicFindChanceMultiplier=1,FlyingCostMultiplier=1,FlyingSpeedMultiplier=1,ResourceCollectionMultiplier=1,StructureDamageMultiplier=1,bRespectNoBuildZones=1,MagicStructureManaRegenerationMultiplier=1,MagicStructureManaConsumptionMultiplier=1,bFreeBuildMode=false,TimeOfDayLock=Auto,NPCPopulationMultiplier=1,StructureDecayMultiplier=1,bThronesDecay=true)

この部分は管理者パスワードの設定になります。
ゲーム内のadminコマンドを実行するときに必要になります。

[/script/citadel.socialmanager]
Password=citadel123


[/script/citadel.citadelgameinstance]以下の部分

設定名 設定例 機能
ServerName "PrivateServer" サーバーの名前
Password "" サーバーにログインするパスワード
ServerType PVP PvPかPvE
PlayerLimit 40 サーバーに入れる人数
bPrivate false 公式サーバーかどうか。機能しない
ExperienceMultiplier 1 経験値倍率 10=10倍
InventoryCapacityMultipler 1 手持ちの重量倍率?機能しないようだ
KnowledgePointEarnedMultiplier 1 レベルアップ時に貰える知識ポイント倍率
CharacterPointEarnedMultiplier 1 レベルアップ時に貰えるスキルポイント倍率
bUnlimitedResources false 資源を無制限にする。機能してないようだ
PlayerDamageMultiplier 1 プレイヤーの攻撃力倍率。高いほど威力が上がる
ArmorMultiplier 1 被ダメージ倍率。高いほど受けるダメージがあがる
BaseManaRegen 0 マナ回復量
InventoryCapacityMultiplier 1 手持ちの重量倍率?機能してないようだ
bInventoryWeightRestrictions true インベントリ重量制限。機能してないようだ
MagicFindMultiplier 1 ?機能してないようだ
CraftingMagicFindChanceMultiplier 1 機能してないようだ
FlyingCostMultiplier 1 飛行時の消費マナ。機能してないようだ
FlyingSpeedMultiplier 1 飛行速度倍率
ResourceCollectionMultiplier 1 リソースからの取得の倍率
StructureDamageMultiplier 1 建築物へのダメージ倍率。機能してないようだ
bRespectNoBuildZones 1 ?機能してないようだ
MagicStructureManaRegenerationMultiplier 1 ?機能してないようだ
MagicStructureManaConsumptionMultiplier 1 ?機能してないようだ
bFreeBuildMode false フリービルドモードを有効にする。機能してないようだ
TimeOfDayLock Auto, Midnight, Sunrise, Sunset, Noon 時間の固定
NPCPopulationMultiplier 1 NPCの出現倍率。機能してないようだ
StructureDecayMultiplier 1 建物の減衰倍率。機能してないようだ
bThronesDecay true 玉座の減衰?機能してないようだ

Citadel: Forged With Fire Linux 個人サーバー インストールメモ

※自己責任でお願いします。頻繁にいじるので自分用メモ

参考元
Dedicated Server Setup Guide [UPDATED TO INCLUDE DECAY SETTINGS] :: Citadel: Forged With Fire General Discussions

Official Unofficial Dedicated Server Setup Guide [WIP] :: Citadel: Forged With Fire General Discussions



実行環境

WebArena http://web.arena.ne.jp/vps-cloud/
こちらの6GBプラン

OS:CentOS7
Citadelバージョン:12342-2

での情報です。

サーバー要件

Windows用のものしか見つからなかった。Linuxでも同等?
4core以上のCPU(2coreフルで使う?)
最低 6GBのメモリ(最大15GB使う)
起動しただけでメモリ80%,CPU55% 複数人ログインでどうなるのか不明・・

ポートの開放

サーバーは、以下にリストされたポートで接続を待ち受けます。

ポート 目的 補足
UDP 27015 スチームサーバーブラウザーのクエリーポート 必須
UDP 7777 ゲームクライアントポート 必須?
UDP 7778 UDP Raw ポート(ゲームクライアントポート + 1) (任意)
TCP 27020 RCON用のポート (任意)


ポートを開放し、設定を反映させます。

#firewall-cmd --permanent --add-port=27015/tcp
#firewall-cmd --permanent --add-port=27015/udp
#firewall-cmd --permanent --add-port=7777/tcp
#firewall-cmd --permanent --add-port=7777/udp
#firewall-cmd --reload
'設定できているか確認
#firewall-cmd --list-all

必要なライブラリのインストール

インストールはSteamCMDを使って行います。
64ビットLinuxサーバでは、steamcmdのインストール/実行に32ビットのバイナリが必要ですのでインストールします。

#yum install -y glibc.i686 libstdc++.i686

SteamCMD、Citadelのインストール


以下の設定と想定してインストール設定を書きます。

設定名
CentOSのユーザー名 steam
SteamCMDインストールディレクト /home/steam/Steam
Citadelインストールディレクト /home/steam/Steam/Citadel

ユーザーの作成、ディレクトリの作成

#useradd steam
#passwd steam
#su - steam
$mkdir Steam
$mkdir Steam/Citadel

SteamCMDのダウンロードと起動

$cd Steam
$curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -
$./steamcmd.sh +login anonymous +force_install_dir Citadel +app_update 489650 validate +quit
匿名ログイン +login anonymous
インストールディレクトリの指定(相対パスなので別な場合はフルパス入れるなり) +force_install_dir Citadel
指定サーバーのインストール(validate付与するとファイルチェックする) +app_update 489650 validate
終了 +quit

app_update 489650 validate を実行するとダウンロードが始まります。



steamclient.soのコピー
SteamCMDのディレクトリからCitadel/Plugins/UWorks/Source/ThirdParty/Linux/内にコピー

$cp /home/steam/Steam/linux64/steamclient.so /home/steam/Steam/Citadel/Citadel/Plugins/UWorks/Source/ThirdParty/Linux/

ファイルの実行権限の設定

chmod -R a+w,a+x /home/steam/Steam/Citadel/Citadel/Saved/SaveGames
chmod -R a+w,a+x /home/steam/Steam/Citadel/Citadel/Plugins/UWorks/Source/ThirdParty/Linux


サーバーのセーブデータがないので一度起動します。

$cd Steam/Citadel/
$./CitadelServer.sh
'数分後に Ctrl+c 同時押しで停止

/home/steam/Steam/Citadel/Citadel/Saved/Config/LinuxServer内にiniファイルができているはずなので
とりあえずひつようになりそうなものの設定
8/10追記
変更したい設定のみ書いて起動したところ木、石等を拾えなくなりました。
デフォルトの設定でも下のようにすべて書いていたほうがよさそうです。

[UWorks]
ConnectionPort=7777
QueryPort=27015

[/script/citadel.socialmanager]
Password=citadel123

[/script/citadel.citadelgameinstance]
WorldCreationSettings=
(ServerName="PrivateServer",Password="",ServerType=PVP,PlayerLimit=40,bPrivate=false,ExperienceMultiplier=1,InventoryCapacityMultipler=1,KnowledgePointEarnedMultiplier=1,CharacterPointEarnedMultiplier=1,bUnlimitedResources=false,PlayerDamageMultiplier=1,ArmorMultiplier=1,BaseManaRegen=0,InventoryCapacityMultiplier=1,bInventoryWeightRestrictions=true,MagicFindMultiplier=1,CraftingMagicFindChanceMultiplier=1,FlyingCostMultiplier=1,FlyingSpeedMultiplier=1,ResourceCollectionMultiplier=1,StructureDamageMultiplier=1,bRespectNoBuildZones=1,MagicStructureManaRegenerationMultiplier=1,MagicStructureManaConsumptionMultiplier=1,bFreeBuildMode=false,TimeOfDayLock=Auto,NPCPopulationMultiplier=1,StructureDecayMultiplier=1,bThronesDecay=true)
名前 効果
Password(socialmanager) 文字列 管理者パスワード
ServerName 文字列 サーバーの名前
Password(citadelgameinstance) 文字列 ログイン時のパスワード
ServerType PvP PvE ゲームシステム(PvPにすると対人)
PlayerLimit 数値 最大接続数

ログイン方法

ゲームを起動してINTERNETを選択すると出てくると思います。


systemctlによる自動起動

サーバー再起動時、自動で起動するようにsystemctlに登録します。

まず起動設定ファイルを作ります。

#cd /etc/systemd/system/
#vim citadel-dedicated.service

ファイルの内容を以下のようにします。

[unit]
Description=Citadel Dedicated Server
Wants=network-online.target
After=syslog.target network.target nss-lookup.target network-online.target

[Service]
ExecStartPre=/home/steam/Steam/steamcmd.sh +login anonymous +force_install_dir Citadel +app_update 489650 +quit
ExecStart=/home/steam/Steam/Citadel/CitadelServer.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s INT $MAINPID
User=steam
Group=steam

[Install]
WantedBy=multi-user.target

個人の環境に合わせて変更する場合はここら辺です。

パラメータ 内容
ExecStartPre 起動前に実行される処理
ExecStart 起動処理
LimitNOFILE 上限ファイルオープン数の指定
ExecReload リロード時の処理
ExecStop 停止時の処理
User 起動するCentOSのユーザーを指定する
Group 起動するCentOSのグループを指定する

設定を反映させる。

#systemctl daemon-reload

自動起動をONにする

#systemctl enable citadel-dedicated.service

Citadelの起動

#systemctl start citadel-dedicated.service

Citadelの停止

#systemctl stop citadel-dedicated.service

サーバーのアップデート

systemctlなら起動時にアップデートする・・はず

手動でのアップデートはsteamcmd.shのあるディレクトリでこの一行

$./steamcmd.sh +login anonymous +force_install_dir Citadel +app_update 489650 +quit