ngtokuの日記

主に雑記帳です。SNSではngtokuのID取れなかったんで、別のIDでやってます。

備忘メモ(実行ユーザで動かすと問題ないがJP1経由だとcore吐く)

オンプレ(Solaris)のクラウド移行(RHEL)にアドバイザ的ポジションで関わってるんだけど、移行先で(意図不明ながら)でっかいサイズの配列を関数内で定義していたプログラムがSIGSEGVでcore吐いてた。

ulimit見てみたらstacksizeがデフォルトの8Mで、件の配列サイズ見てみたらそれ以上使ってる&移行元のサイズに遠く及ばない設定だったのでインフラの人に指摘して設定して貰い、JP1ジョブの実行ユーザで動かしたらエラーなく動いたので安心してJP1でジョブ流してもらったらまたコケたと。

んーそれって/etc/security/limits.confだけ変えたとかかなー・・・と思ってこのサイトを紹介したらビンゴだったよ。 自動起動設定だったので注意事項に記載してある方法をやって貰ったけどユーザ共通環境設定的な意味も含めてrootユーザの.profileにも書いて貰ったよ。

UNIXジョブ実行時のリソース制限値についての注意事項

以下引用。エッセンスだけ抽出するとこんなところだけどあんま長くないのでリンク先の全文読むのを推奨。

(略)
AIXおよびLinuxの場合limitsファイルの設定が有効になるのはtelnet接続などで起動されるloginコマンド経由のプロセスだけです。
JP1/AJS2から起動されるジョブはサービスから起動されるプロセスであるためlimitsファイルの設定が有効になりません。
(略)
AIXおよびLinuxで実行するジョブに対してリソースの制限値を設定したい場合はJP1/AJS2の起動ユーザーであるrootユーザーに対して設定してください。
(略)
注意事項
    JP1/AJS2サービスを自動起動している場合rootユーザーのログインプロファイルは読み込みません。
    この場合,ジョブ実行環境の環境設定パラメーターでリソース制限値を設定してください。
    (略)

備忘メモ(実行ユーザで動かすと問題ないがJP1経由だとcore吐く)

オンプレ(Solaris)のクラウド移行(RHEL)にアドバイザ的ポジションで関わってるんだけど、移行先で(意図不明ながら)でっかいサイズの配列を関数内で定義していたプログラムがSIGSEGVでcore吐いてた。 ulimit見てみたらstacksizeがデフォルトの8Mで、件の配列サイズ見てみたらそれ以上使ってる&移行元のサイズに遠く及ばない設定だったのでインフラの人に指摘して設定して貰い、JP1ジョブの実行ユーザで動かしたらエラーなく動いたので安心してJP1でジョブ流してもらったらまたコケたと。

んーそれって/etc/security/limits.confだけ変えたとかかなー・・・と思ってこのサイトを紹介したらビンゴだったよ。 自動起動設定だったので注意事項に記載してある方法をやって貰ったけどユーザ共通環境設定的な意味も含めてrootユーザの.profileにも書いて貰ったよ。

UNIXジョブ実行時のリソース制限値についての注意事項

以下引用。エッセンスだけ抽出するとこんなところだけどあんま長くないのでリンク先の全文読むのを推奨。

(略)
AIXおよびLinuxの場合limitsファイルの設定が有効になるのはtelnet接続などで起動されるloginコマンド経由のプロセスだけです。
JP1/AJS2から起動されるジョブはサービスから起動されるプロセスであるためlimitsファイルの設定が有効になりません。
(略)
AIXおよびLinuxで実行するジョブに対してリソースの制限値を設定したい場合はJP1/AJS2の起動ユーザーであるrootユーザーに対して設定してください。
(略)
注意事項
    JP1/AJS2サービスを自動起動している場合rootユーザーのログインプロファイルは読み込みません。
    この場合,ジョブ実行環境の環境設定パラメーターでリソース制限値を設定してください。
    (略)

備忘メモ(SQL*PlusでORACLE_SID環境変数が効かない)

ベンダーさんにお願いしてクラウド上にDBサーバとクライアントサーバ(Linux)を構築してもらった際、環境変数ORACLES_SIDを設定しているにもかかわらずSQL*PlusでSID指定でないと接続できないと報告したら「DBサーバとクライアントサーバが別になっている場合はコマンド上でSIDを明示しないと動かない」と返信貰ったので、

ん?つまり環境変数ORACLE_SIDを設定していてもこれではだめで

$ sqlplus scott/tiger

これに置き換えないと動かないと?そんなアホな。

$ sqlplus scott/tiger@SID

と思ったので「SQLPlus 環境変数」で検索してみたら、検索1ページ目のトップに回答が。 docs.oracle.com

パラメータまたは変数 説明
TWO_TASK 接続文字列を指定するUNIX環境変数。データベースを指定しない接続は、TWO_TASKに指定したデータベースに接続されます。


TWO_TASK=MYDB
export TWO_TASK
sqlplus hr
これは、次のように解釈されます。
sqlplus hr@MYDB

公式のユーザーガイドにズバリ回答書いてあるやん。しかもOracle12のユーザーズガイドだから随分前から存在する、即ち枯れた情報みたいですな。
UNIX系で環境変数ORACLE_SIDが効かない場合は環境変数TWO_TASKを設定するのがお作法なのかな。
設定したらSQL*PlusのコマンドにSIDを指定しなくても繋がりました。

備忘メモ(RHEL 9.5でcsh入れてロケールSJISにしたらバックスラッシュのエスケープが効かなくなった)

ベンダーさんにRHEL9.5入れて貰って、お客さんの希望でcshSJISロケールをセットアップして貰ったらバックスラッシュ('\')のエスケープが効かなくなってコマンド複数行分割ができなくなったので、Windows-31JじゃなくてSHIFT_JIS使ってんじゃねーの?と思い検証してみた。

環境

  1. OS:Linux (rhel 9.5) on Azure
  2. その他HW諸々設定:デフォルト
  3. 作業ユーザ:簡易性の為終始 root

セットアップ

# yum install glibc-locale-source
# yum install glibc-langpack-ja
# yum install csh

一応、SHIFT_JISWindows-31Jが入っていることを確認

# ls /usr/share/i18n/charmaps

SHIFT_JISを使ってja_JP.SJISWindows-31Jを使ってja_JP.SJIS2を作成

# localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
# localedef -f WINDOWS-31J -i ja_JP ja_JP.SJIS2

まずSHIFT_JISの方をロケールにセット

# localectl set-locale LANG=ja_JP.SJIS
# source /etc/locale.conf

テスト。

# csh
0: イベントが見つかりません.
# ls \
ls: '\' にアクセスできません: そのようなファイルやディレクトリはありません

エスケープが効いてないことを確認。 因みにcsh切り替えで"0: イベントが見つかりません." と出ているのはおそらくこれ(↓)が原因。チルダやバックスラッシュが誤認識されるのだろう。

atmarkit.itmedia.co.jp

erattaだとこの辺?(https://access.redhat.com/errata/RHEA-2021:0170) RedHatSJISをサポートしない方針に変わったのは、この辺の対応が面倒になったからだろうと推測。

ともあれ一旦cshを抜けてbashに戻る。

# exit

引き続きWindows-31Jの方をセット。こちらの場合はイベントが見つかりません的なエラーメッセージは出ない。

# localectl set-locale LANG=ja_JP.SJIS2
# source /etc/locale.conf
# csh
# ls \
? /usr/
bin  games  include  lib  lib64  libexec  local  sbin  share  src  tmp

そしてエスケープが効いており、/usr/の内容が表示されていることを確認。

うぇーい。

補足

以下によるとWindows-31J判定できないアプリもあるらしいぞ。適度に使い分け推奨の様だ。 access.redhat.com

備忘メモ(React.js環 開発境セットアップ)

マシン入れ替えたので備忘録兼作業メモ

作業の流れ

  1. VSCode インストール
  2. Homebrew インストール
  3. anyenv & nodenv インストール
  4. nodenv-default-packages 設定
  5. nodenv 個別バージョンインストール
  6. create-react-app 実行

VSCode インストール

普通にここから。Visual Studio Code – コード エディター | Microsoft Azure

Homebrew インストール

これまんまで。macOS(またはLinux)用パッケージマネージャー — Homebrew

anyenv & nodenv インストール

Big Surなのでzshのはずだけど念のため確認。

$ echo $SHELL
/bin/zsh

確認できたのでインストール。

$ brew install anyenv
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc
$ anyenv install --init
$ exec $SHELL -l
$ anyenv install nodenv
$ exec $SHELL -l

nodenv-default-packages インストール

$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
$ mkdir -p "$(nodenv root)"/plugins
$ git clone https://github.com/nodenv/nodenv-default-packages.git "$(nodenv root)/plugins/nodenv-default-packages"

nodenvのdefault-packages は以下。

$ vi $(nodenv root)/default-packages
yarn
typescript
ts-node
typesync

nodenv 個別バージョンインストール

14.5で挙動変わるから、初心者は14.4.0入れとけって言われたので今もそれに倣っているが、そろそろ最新版にしてもいい気がする。

$ nodenv install -l
$ nodenv install 14.4.0
$ nodenv global 14.4.0

create-react-app 実行

作業フォルダ作ってテストプロジェクト作成。

$ mkdir -p work/ReactJS
$ cd work/ReactJS
$ npx create-react-app hello-world --template typescript
$ cd hello-world
$ yarn start

備忘メモ(Vagrant + VirtualBox + Docker + VisualStudioCode on Mac)

そのうち手順を整理することになりそうなのでメモ。

参考

Vagrantを使う「Mac最速のDocker環境」を初心者向けに解説【遅いMac for Dockerを卒業】 - Qiita

Vagrant+VirtualBoxでUbuntu環境構築 - Qiita

Vagrantバージョン

Big Surだとバージョン2.2.14はvagrant upがコケるので、2.2.13に変更。 コケない場合は作業不要。

Getting 'no implicit conversion of nil into String' from hostsupdater · Issue #2112 · geerlingguy/drupal-vm · GitHub

ダウングレードは以下参考。二行目のversionと三行目のsha256 だけ変更。

Downgrade homebrew (cask) package · GitHub

$ brew edit vagrant --cask
cask "vagrant" do
  version "2.2.13"
  sha256 "b65adb59bef5b69be61bd79a34e3532533a172491b307718d1c4a5a46209e81f"

  url "https://releases.hashicorp.com/vagrant/#{version}/vagrant_#{version}_x86_64.dmg",
      verified: "hashicorp.com/vagrant/"
  appcast "https://github.com/hashicorp/vagrant/releases.atom"
  name "Vagrant"
  desc "Development environment"
  homepage "https://www.vagrantup.com/"

  pkg "vagrant.pkg"

  uninstall script:  {
    executable: "uninstall.tool",
    input:      ["Yes"],
    sudo:       true,
  },
  pkgutil: "com.vagrant.vagrant"

  zap trash: "~/.vagrant.d"
end

作業の流れ

  1. Homebrewインストール
  2. VirtualBoxインストール
  3. Vagrantインストール
  4. Vagrantプラグインインストール
  5. Vagrant設定
  6. Mutagenインストール
  7. Mutagen設定
  8. docker-composer作成
  9. 確認用PHP作成
  10. ssh config作成(無い場合)
  11. Vagrant起動
  12. Vagrant接続(terminal)
  13. Docker起動
  14. アクセス確認
  15. Docker停止
  16. Vagrant切断
  17. Vagrant接続(Visual Studion Code)
  18. Vagrant停止

Homebrewインストール

これまんまで。macOS(またはLinux)用パッケージマネージャー — Homebrew

VirtualBoxインストール

$ brew install --cask virtualbox

セキュリティとプライバシーの設定でコケたら設定してやり直し。 設定したら再起動をする必要があるので注意。

Vagrantインストール

$ brew install --cask vagrant

Vagrantプラグインインストール

$ vagrant plugin install vagrant-disksize vagrant-hostmanager vagrant-mutagen vagrant-docker-compose

Vagrant設定

Box調査。Discover Vagrant Boxes - Vagrant Cloud 今回はubuntu/xenial64を選択。

作業フォルダ作成&移動。以後はcdしない限りここにずっと居て、各種ディレクトリ、ファイルもここに作成。 おっと、Macだとフォルダだったかな。

$ mkdir  ~/Documents/Vagrant
$ cd ~/Documents/Vagrant

Vagrantfile作成。

$ vagrant init ubuntu/xenial64

編集

$ vi Vagrantfile

Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/xenial64"
    config.vm.hostname = "vagrant-ubuntu"
    config.vm.network "private_network", ip: "192.168.33.10"
    config.vm.provider "virtualbox" do |vb|
        vb.gui = false
        vb.cpu = 1
        vb.memory = "2048"
        vb.customize ['modifyvm', :id, '--natdnsproxy1', 'off']
        vb.customize ['modifyvm', :id, '--natdnshostresolver1', 'off']
    end
    config.disksize.size = '10GB'
    config.mutagen.orchestrate = true
    config.vm.synced_folder './', '/home/vagrant/app', type: "rsync",
        rsync_auto: true,
        rsync__exclude: ['.git/', 'node_modules/', 'log/', 'tmp/']
    config.vm.provision :docker, run: 'always'
    config.vm.provision :docker_compose
end

Mutagenインストール

brew install mutagen-io/mutagen/mutagen

Mutagen設定

vi mutagen.yml

sync:
  app:
    mode: "two-way-resolved"
    alpha: "./"
    beta: "vagrant-ubuntu:/home/vagrant/app"
    ignore:
      vcs: true
      paths:
        - "/node_modules"
        - "/log"
        - "/tmp"

docker-composer作成

$ vi docker-composer.yml
version: '3'
services:
  web:
    image: php:7.4-apache-buster
    ports:
      - "80:80"
    volumes:
      - ./public:/var/www/html:cached

確認用PHP作成

$ mkdir public
$ vi public/index.php
 <?php
 phpinfo();
$ vi public/.htaccess
DirectoryIndex index.php
$ chmod -R 755 public                 

ssh config作成(無い場合)

まっさらな環境の場合、ファイルが無いので作る。中身は空でOK。

$ mkdir ~/.ssh
$ touch ~/.ssh/config

Vagrant起動

$ vagrant up

Vagrant接続(terminal)

$ vagrant ssh
Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 4.4.0-198-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

1 package can be updated.
1 of these updates is a security update.
To see these additional updates run: apt list --upgradable

New release '18.04.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Docker起動

vagrant@vagrant-ubuntu:~$ cd app
vagrant@vagrant-ubuntu:~/app$ docker-compose up

アクセス確認

ブラウザで http://192.168.33.10/ にアクセス。 この場合のIPアドレスはVagrantfileで指定したもの。

Docker停止

Ctrl-C

Vagrant切断

vagrant@vagrant-ubuntu:~$ exit

Vagrant接続(Visual Studio Code)

Visual Studio Codeにremote developmentを追加。 ssh configにvagrant用のエントリ追加。

$ vagrant ssh-config  >> ~/.ssh/config 

後は繋ぐのみ。 Macの場合はシステム環境設定のセキュリティとプライバシーでVisual Studio Codeにフォルダのアクセス権を設定してあげる必要があるかも。

Vagrant停止

$ vagrant halt

SAP HANAにoData via olingo(V2) with ベーシック認証でアクセス(POST)

以下はエントリー読むだけだったんで、今度はPOSTでデータ作成。
SAP HANAにoData via olingo(V2) with ベーシック認証でアクセス - ngtokuの日記


以下にあるサンプルコードだとHTTPステータスコードがBad Requestだったんで、試しにデータ本体だけ突っ込んだらレコード作成できました。
my-car-service/OlingoSampleApp.java at master · qinhaizong/my-car-service · GitHub


夜も遅いので中途半端だけど変更メソッドだけログ的に記載。

	  private ODataEntry writeEntity(Edm edm, String absolutUri, String entitySetName, 
	      Map<String, Object> data, String contentType, String httpMethod) 
	      throws EdmException, MalformedURLException, IOException, EntityProviderException, URISyntaxException {

	    HttpURLConnection connection = initializeConnection(absolutUri, contentType, httpMethod);
	    
        OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
        // 本当はここをパラメータdataからJsonに変更する。MapでなくてJacksonを使ってBeanから変換したほうがいいかなって
        out.write("{\"ID\":\"GV006\",\"NAME\":\"'NEW DATA TOKU NG2'\",\"GROUP\":\"'POST DATA'\",\"CREATE_DATE\":\"\\/Date(1587911931893)\\/\"}");
        out.close();
        connection.connect();
        final int status = connection.getResponseCode();
        print("response code=" + status);
	    ODataEntry entry = null;
	    EdmEntityContainer entityContainer = edm.getDefaultEntityContainer();
	    EdmEntitySet entitySet = entityContainer.getEntitySet(entitySetName);
        if (status == 201) {
  	      InputStream content = connection.getInputStream();
  	      content = logRawContent(httpMethod + " request on uri '" + absolutUri + "' with content:\n  ", content, "\n");
  	      entry = EntityProvider.readEntry(contentType,
  	          entitySet, content, EntityProviderReadProperties.init().build());
        }

	    connection.disconnect();

	    return entry;
	  }

うぇーい。