備忘メモ(実行ユーザで動かすと問題ないがJP1経由だとcore吐く)
オンプレ(Solaris)のクラウド移行(RHEL)にアドバイザ的ポジションで関わってるんだけど、移行先で(意図不明ながら)でっかいサイズの配列を関数内で定義していたプログラムがSIGSEGVでcore吐いてた。
ulimit見てみたらstacksizeがデフォルトの8Mで、件の配列サイズ見てみたらそれ以上使ってる&移行元のサイズに遠く及ばない設定だったのでインフラの人に指摘して設定して貰い、JP1ジョブの実行ユーザで動かしたらエラーなく動いたので安心してJP1でジョブ流してもらったらまたコケたと。
んーそれって/etc/security/limits.confだけ変えたとかかなー・・・と思ってこのサイトを紹介したらビンゴだったよ。 自動起動設定だったので注意事項に記載してある方法をやって貰ったけどユーザ共通環境設定的な意味も含めてrootユーザの.profileにも書いて貰ったよ。
以下引用。エッセンスだけ抽出するとこんなところだけどあんま長くないのでリンク先の全文読むのを推奨。
(略)
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にも書いて貰ったよ。
以下引用。エッセンスだけ抽出するとこんなところだけどあんま長くないのでリンク先の全文読むのを推奨。
(略)
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入れて貰って、お客さんの希望でcshとSJISロケールをセットアップして貰ったらバックスラッシュ('\')のエスケープが効かなくなってコマンド複数行分割ができなくなったので、Windows-31JじゃなくてSHIFT_JIS使ってんじゃねーの?と思い検証してみた。
環境
セットアップ
# yum install glibc-locale-source
# yum install glibc-langpack-ja
# yum install csh
一応、SHIFT_JISとWindows-31Jが入っていることを確認
# ls /usr/share/i18n/charmaps
SHIFT_JISを使ってja_JP.SJIS、Windows-31Jを使ってja_JP.SJIS2を作成
# localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
# localedef -f WINDOWS-31J -i ja_JP ja_JP.SJIS2
# localectl set-locale LANG=ja_JP.SJIS
# source /etc/locale.conf
テスト。
# csh
0: イベントが見つかりません.
# ls \
ls: '\' にアクセスできません: そのようなファイルやディレクトリはありません
エスケープが効いてないことを確認。 因みにcsh切り替えで"0: イベントが見つかりません." と出ているのはおそらくこれ(↓)が原因。チルダやバックスラッシュが誤認識されるのだろう。
erattaだとこの辺?(https://access.redhat.com/errata/RHEA-2021:0170) RedHatがSJISをサポートしない方針に変わったのは、この辺の対応が面倒になったからだろうと推測。
# 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環 開発境セットアップ)
マシン入れ替えたので備忘録兼作業メモ
作業の流れ
- VSCode インストール
- Homebrew インストール
- anyenv & nodenv インストール
- nodenv-default-packages 設定
- nodenv 個別バージョンインストール
- 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に変更。 コケない場合は作業不要。
ダウングレードは以下参考。二行目の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
作業の流れ
- Homebrewインストール
- VirtualBoxインストール
- Vagrantインストール
- Vagrantプラグインインストール
- Vagrant設定
- Mutagenインストール
- Mutagen設定
- docker-composer作成
- 確認用PHP作成
- ssh config作成(無い場合)
- Vagrant起動
- Vagrant接続(terminal)
- Docker起動
- アクセス確認
- Docker停止
- Vagrant切断
- Vagrant接続(Visual Studion Code)
- 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; }
うぇーい。