20211016のLinuxに関する記事は6件です。

C#とNode.jsを連携する

C#とNode.jsを連携する EdgeJsを利用する EdgeJsを利用しNode.jsからC#通信ができます。その逆もできます。.net4.6のみ。まだ.netCoreには未対応のようです。 Node.js側 const edge = require('edge-js'); const helloWorld = edge.func('cs', function () {/* async (input) => { return ".NET Welcomes " + input.ToString(); } */}); helloWorld('Node.js', function (error, result) { if (error) throw error; console.log(result); }); C#側 NodeJsからC#のメソッドを実行しデーターを渡します edgeJsライブラリ 現在は更新されていません。メンテナンスを引き継いだプロジェクトが別にあります。 npm install edge edgeで読み込む const edge = require('edge'); フォークされたもの 現在も保守されている npm install edge-js edgeの後ろに-jsを付ける const edge = require('edge-js'); 説明 Node.jsにインストールされたモジュールを表示する npm list npm -v 環境構築 DockerFileの内容をみて必要なライブラリをインストールします。 Monoは必要ないです。 RiderのエディタからedgeJSモージュールをインストールする npm install後にエディタ上で 波線をクリックするとnode_moduleフォルダが生成され、edgeモジュールがインストールされる 動作に必要な設定 コマンド 有無 値 備考 EDGE_USE_CORECLR 必須 1 .NetCore用のedgeモジュールを利用する EDGE_NATIVE 必須 edge-js/build/Release/edge_coreclr.node 相対パスで設定する 絶対パスだとエラーが出る EDGE_DEBUG オプション 1 デバッグ表示 EDGE_APP_ROOT オプション Publishフォルダへのパス 外部Dll Nugetライブラリを利用する時に使う 相対パスで設定する 環境変数の設定の仕方 ターミナルから設定し実行する EDGE_NATIVE=edge-js/build/Release/edge_coreclr.node EDGE_USE_CORECLR=1 EDGE_DEBUG=1 node test.js RiderのNode.js設定画面から設定する EnviromentValueで設定します。 JSプログラムの中に書く var path = require('path'); const baseNetAppPath = path.join(__dirname, '/bin/Release/netstandard2.0/publish/'); process.env.EDGE_USE_CORECLR = 1; process.env.EDGE_DEBUG=1; process.env.EDGE_NATIVE='edge-js/build/Release/edge_coreclr.node'; //process.env.EDGE_APP_ROOT = baseNetAppPath; var edge = require('edge-js'); サンプルを実行 node_modules/edge-jsフォルダの中にSampleファイルがあり、いろいろ試せます。 デバッグ 3種類 C#側のデバッグ 実行ボタンでデバッグ エラーが緑文字で出る。C#側のCSファイルビルド状態、Dllファイルが読み込まれたかどうか Dllファイルがあるかアセンブリが読み込まれたかどうかなどいろいろ確認できます。 Node.js側のデバッグ 虫のアイコンでNode.js側がデバッグできます。Js側でブレイクポイントなどをしてデバッグします。 edge.jsを追加するとブレイクポイントでデバッグできるようになる ブレイクポイント追加する Debugger ConsoleとProcess Consoleでエラーログを見ることができます。 よく出るエラー Uncaught TypeError: edge.initializeClrFunc is not a function 一見JavaScript側のエラーのように見えるがC#側のエラーであることが多いです。C#側を確認するとよいです。 Error occurred during CoreCLR initialization node:internal/modules/cjs/loader:1168 return process.dlopen(module, path.toNamespacedPath(filename)); パスのどれかに絶対パスが含まれていると出るエラーになります。相対パスに直すと通ります。 環境変数の設定などで起きる ダイナミックライブラリの中に外部DllやNugetライブラリを利用する設定 プロジェクトフォルダに以下の値を追加する。 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> <PreserveCompilationContext>true</PreserveCompilationContext> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> <ItemGroup> <Reference Include="EdgeJs"> <HintPath>..\..\node_modules\edge-js\lib\bootstrap\bin\Release\netcoreapp1.1\EdgeJs.dll</HintPath> <Private>true</Private> </Reference> </ItemGroup> </Project> .NET5のところをクリックしAdd FromからもDllを追加できます Publishを設定する Publishを実行すると依存ファイル(dllなど)、Nugetから入れたDLLをすべて同じフォルダに書き出せます。 Publishフォルダへパスを通す。相対がよいです。 process.env.EDGE_APP_ROOT = ''; Nugetから必要ライブラリをインストール Microsoft.NETCore.DotNetHost Microsoft.NETCore.DotNetHostPolicy このライブラリには既に依存ファイルが設定されています 現在の状態 Dllファイルへのアクセス サンプルファイルのDllへはアクセスができましたが、DLLプログラムのの中にNugetのライブラリを入れると読み込まれない状態です。 DapperやMicoroSoftのSqliteライブラリなどが読み込まれない。NewtonSoftのJesonのライブラリは読み込め使えました。 EDGE_APP_ROOTにPublishまでの相対パスを通すとエラーが起きます。 読み込み方法がわかる方ご教授ください。 参考 EdgeJsをC#のソースコードからデバッグするに続く
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

clangのオプションで便利に使ってるもの

clang で特にリリースビルドではなくてプログラムの間違いを探したいときに使っているコマンドラインオプションです。clang 13で確認。いつかgccで対応する記事を書きたい… 一般的オプション -ftrivial-auto-var-init=pattern 未初期化の自動変数や自動配列を変な値で初期化する。これで未初期化関連の誤りをかなり見つけられる -D_FORTIFY_SOURCE=2 glibcのエラーチェックを有効にする -pipe -fuse-ld=lld -fintegrated-as -fintegrated-cc1 LLVMリンカーやclang内蔵アセンブラを用いる -Wall -Wextra 警告をたくさん出す。-O1以上の最適化を指定しないと未使用変数を教えてもらえない -Wtautological-compare -Wsign-compare 変な比較に警告をする -gfull -fstandalone-debug -gdwarf-5 -gz デバッグ情報を目一杯付加する。デバッグ情報をDWARFバージョン5形式で書き出し圧縮する -O3 -mllvm -polly 最大限の最適化 -march=native または -mcpu=native clangを動作させているCPUに合わせた最適化を行う。インテル系CPUのときはmarchを用いる LTO (Link Time Optimization関連) -flto=full -fwhole-program-vtables -fforce-emit-vtables -fvirtual-function-elimination LTOを使う -ffunction-sections -fdata-sections -Wl,--gc-sections 使われていない関数や大域変数を削除する -faddrsig -Wl,--icf=all 重複している同一のコードをまとめる。LLVMリンカーでしか使えない スタック保護関連 -fstack-protector-all -fstack-clash-protection stack-clash-protectionはインテルCPUのみ -fsanitize=safe-stack アドレスサニタイザーとは同時に使えない -fsplit-stack 関数ごとにスタックを分ける。LLVMリンカーでは使えない サニタイザー関連 エラーが起きたときの動作 -fno-sanitize-recover=all サニタイザーがエラーを見つけたらプログラムを終了する。 CFI -fsanitize=cfi -fvisibility=hidden CFIの使用にはLTOが必須 未定義動作サニタイザ -fsanitize=undefined -fsanitize=integer 整数型のオーバーフロー・アンダーフローや配列範囲外アクセスを教えてくれる。実行時の環境変数として UBSAN_OPTIONS="print_stacktrace=1:abort_on_error=0" を指定するとスタックトレースを表示してくれる アドレスサニタイザー -fsanitize=address -fsanitize-address-use-after-scope -fsanitize-address-use-after-return=always -fsanitize-address-use-odr-indicator -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-common ポインタ関連の色々なエラーを実行時に教えてくれる。実行時の環境変数に ASAN_OPTIONS="detect_leaks=1:strict_init_order=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_string_checks=1:detect_invalid_pointer_pairs=2:use_odr_indicator=1:abort_on_error=0" を設定するとよりしっかり誤りを探してくれる。-D_FORTIFY_SOURCE と両立しない ため -U_FORTIFY_SOURCE を付けたほうがよい Linuxにおける実行ファイル生成 -Wl,-z,noexecstack 自動変数や自動配列がある領域をプログラムとして実行できなくする -fPIE -pie -fno-plt -Wl,-z,relro,-z,now アドレス空間配置のランダム化を行う。これらのオプションの説明はpartialRELRO/fullRELRO、あるいは-fno-pltの話を参照 静的リンク (static link) -static -static-libsan -static-pie を適当なところに付加する。アドレスサニタイザーの静的リンクをしてくれないから、コマンドラインの最後に -lasan をつける
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自作Cコンパイラ neo-c2 version 1.1.6リリース raspberry piに再対応

タイトル通りです。ちょっとコンパイルこけてました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】Qiita デイリー LGTM 数ランキング【自動更新】

他のタグ AWS Android Docker Git Go iOS Java JavaScript Linux Node.js PHP Python Rails React Ruby Swift TypeScript Vim Vue.js 初心者 集計について 期間: 2021-10-18 ~ 2021-10-19 GitHub スターをもらえるととっても励みになります LGTM 数ランキング ランキングに入る記事が見つかりませんでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxディストリビューションのミドルウェアサポートについて

Linuxディストリビューションは各々に独立しているわけではない Fedora(RHELの開発版という位置付け) -> RedHat Enterprise Linux -> (RHELの複製) CentOS / Amazon Linux / Scientific Linux CentOSはRed Hat Enterprise Linuxのクローン RHELは有償ながら、ソースは公開されている。なぜなら、RHELもLinuxだからだ。GPLのオープンソースを使っている以上、ソースは公開しないといけない。 CentOSは、そのソースを利用して、RHELとの完全互換を目指したLinuxディストリビューションだ。Red Hatとはまったく関係のないグループが、勝手に作ったディストリビューションである。今でも、Red Hatが公開したコードを元にCentOSが作られ続けている。 cf. 今更聞けない!CentOSとRed Hatの違いとは? https://eng-entrance.com/centos_redhat パッケージ側でサポートが終了してもディストリビューションがサポートしてくれることもある バックポート PHP 本体のセキュリティサポートは、例えば PHP 5.4 だと 2015/09/14 で終了4しているが、ディストリビューション側が脆弱性の対応を独自に行っている。 https://qiita.com/bezeklik/items/0823b14789d96f847d09 AWS EC2 の amazon-linux-extras amazon-linux-extras とは、Amazon Linux 2 インスタンスにある PHP、Python、Golang、MariaDB などのパッケージをより新しいバージョンで利用できるようマネジメント管理するコマンド。 パッケージを最新にアップグレードする時に使える便利なコマンドです。例えば、php のバージョンアップなどで活躍できます。 cf. https://hapicode.com/server/aws-amazon-linux-extras.html#extras-library-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB Extra Packages for Enterprise Linux (EPEL) のような位置づけで、通常はディストリビューション標準のパッケージを利用する一方で、特定のパケージではより新しいバージョンを試せます。 https://dev.classmethod.jp/articles/how-to-work-with-amazon-linux2-amazon-linux-extras/ remiリポジトリは、サードパーティリポジトリと呼ばれる、CentOSが標準で用意している以外のサードパーティが提供しているリポジトリの一種です。 remiリポジトリ PHPスタックの最新バージョン、フル機能、およびその他のソフトウェアを、FedoraおよびEnterprise Linux(RHEL、CentOS、Oracle、Scientific Linuxなど)のユーザーに提供します。 が挙げられるようです。最新のphpをインストールできるということですね。 remiが提供しているパッケージには、php以外にもApacheやMySQLも入っているので、remiのパッケージを使うことでLAMP環境を構築できます。remiの使用に際して注意点があります。最新のパッケージを入手できるものの、発見されてないセキュリティホールが残っていたりするので信頼性が不安です。また、remiはサードパーティリポジトリでCentOSのサポート対象外なので、利用は自己責任です。 https://www.geekfeed.co.jp/geekblog/centos-remi-epel-php なおremiを使うにはEPELが依存関係にあるのでEPELも使うことになる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「cURLで取得したJSONの複数フィールドを別々の変数に格納する」を1行で

やりたいこと あるAPIが{"name": "hoge", "age": 23}のようなJSON形式のレスポンスを返すとして,「cURLでAPIを叩き,シェル変数nameにhogeを,ageに23を格納する」ということをワンライナーでやりたい。 今回は例として郵便番号検索APIを使います。 郵便番号検索API - zipcloud なんの捻りもないですが,address1,address2,address3をそれぞれ別の変数に格納します。 $ curl -X GET "http://zipcloud.ibsnet.co.jp/api/search?zipcode=1000014" { "message": null, "results": [ { "address1": "東京都", "address2": "千代田区", "address3": "永田町", "kana1": "トウキョウト", "kana2": "チヨダク", "kana3": "ナガタチョウ", "prefcode": "13", "zipcode": "1000014" } ], "status": 200 } 一応bashとzshで動作を確認しています。 やり方 # 1-1.別の変数に格納 $ add1= add2= add3= $ read add1 add2 add3 < <(curl -X GET "http://zipcloud.ibsnet.co.jp/api/search?zipcode=1000014" | jq -r '.results[]|.address1,.address2,.address3' | perl -pe 's/\n/ /g') $ echo "$add1-$add2-$add3" >>> 東京都-千代田区-永田町 # 1-2.perlを使わずに $ add1= add2= add3= $ read add1 add2 add3 < <(curl -X GET "http://zipcloud.ibsnet.co.jp/api/search?zipcode=1000014" | jq -r '.results[]|[.address1,.address2,.address3]|@tsv') $ echo "$add1-$add2-$add3" >>> 東京都-千代田区-永田町 # 2.配列にまとめて格納 $ address= $ read -a address < <(curl -X GET "http://zipcloud.ibsnet.co.jp/api/search?zipcode=1000014" | jq -r '.results[]|.address1,.address2,.address3' | perl -pe 's/\n/ /g') $ echo ${address[@]} >>> 東京都 千代田区 永田町 $ echo ${address[0]} >>> 東京都 ポイント cURLでAPIを叩いてjqでフィールドを抽出するまでは特に問題ないと思いますが,抽出したフィールドをreadに渡して変数に格納する部分が多少厄介かなと思います。特に重要なのは以下の点です。 パイプで渡さない コマンドの出力をreadにパイプで渡しても,以下のように意図する結果になりません。 $ echo "hoge" | read fuga $ echo $fuga >>> これはパイプラインのコマンドがそれぞれ固有のサブシェル内で実行されるため,readで定義されたシェル変数を元のシェルから参照できないことが原因です。関数Aで定義された変数はグローバル宣言しない限り関数Bから参照できない,みたいなことですね。詳しくは以下の記事をご覧ください。 bash: readとパイプと環境変数 - TIM Labs なので,readコマンドは必ず元のシェルで実行されなければならず,そのためにはプロセス置換を標準入力にリダイレクトしてreadに渡す必要があります。その結果,read ... < <(curl...)という構造を取ることになるわけです。 プロセス置換はコマンドの実行結果をファイルのように扱うため,実質read [変数名] < [ファイル名]と同じことをしています。私もプロセス置換をちゃんと触るのは初めてなので,より詳しくは以下の記事をご参照ください。 Linuxでのプロセス置換 - Qiita 改行を含めない readは標準入力から1行読むというコマンドなので,入力ストリームに改行かEOFがあればそこで終了します。 しかし,cURLの結果からjqで複数フィールド抽出する場合,何もしなければ以下のようにそれぞれのフィールドは末尾に改行文字が挿入された状態で出力されます。 $ curl -X GET "http://zipcloud.ibsnet.co.jp/api/search?zipcode=1000014" | jq -r '.results[]|.address1,.address2,.address3' >>> 東京都 >>> 千代田区 >>> 永田町 これをこのままreadに渡しても1行目以外は捨てられてしまうので,perlで改行文字をスペースに置換したり,jqの@tsvフィルターで出力をタブ区切りにするなどの工夫が必要になります。 readは環境変数IFSを区切り文字として用いるのですが,IFSはデフォルトでは「スペースかタブか改行」となっているため,スペース区切りでもタブ区切りでもちゃんと分割してそれぞれの変数に格納してくれます。ただし改行区切りはダメというのは上で述べた通りです。 おわりに 需要がありそうな割にクリティカルなノウハウが見当たらなかったので自分で記事を書きました。割と手探りで書いたので,もっといいやり方を知っているシェルの達人がいらっしゃいましたら,教えていただけると非常に助かります。 プロセス置換はなんか難しそうだったので今まで使っていなかったんですが,使い所がわかれば結構便利そう,というのが知れて良かったです。 最後までご覧いただきありがとうございました。 その他参考にした記事 jqコマンドで複数フィールドの値を1行に表示させる - 動かざることバグの如し readコマンドで1つの文字列から複数の変数に代入するとき - j3iiifn’s blog 【シェルスクリプト】IFSで区切り文字(デリミタ)を変更する方法 | server-memo.net
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む