古のBSDコマンド

 とうとう周辺でも新たなM1 Macをそんな中sedが原因で何やらトラブル

 BSD時代の古きSedが最新のMacの中で生き延びでいる事を少し嬉しくも悲しく、30代の私であれば何も考える事なく そのScriptを書き直し「御光のオーラ」を羽織っていた事でしょう?

 sedにて簡易行挿入 例:226の文字列がある行の下に「TestNewLine」の文字列行を追加

 < gsed(Linux sed) >  $ seq 222 230 | set ‘/226/a TestNewLine’

 $ seq 222 230 | sed -E 'G;s/(^226)(\n)/\1\2TestNewLine/‘ | sed -E '/^$/d'
 又は
 $ seq 222 230 | sed -e "s/(^226)/\1\nTestNewLine/'

 どうかな大分ボケてきているがとりあえず目的は達したかな。

Google App Script Editor(Dec 2022)

2020年12月にGoogle App Script Editor(GAS IDE)がアップグレードされていたようで今更ながらレビュー する羽目に、部内でも一部セクションで使用されていたが今更というところ(現在2022年某月) 初見はプロジェクト作成からデプロイはかなり楽かな? 1 Web Appのprint debug(console.log)の確認が実行数→関数名(ドロップダウン)でconsole.logを確認する仕様   spreadsheetにlogを永続化した方がシンプル? 2 プロジェクト・プロパティーの変更が「appsscript.jsonマニフェスト ファイルをエディタで表示する」表示後設定

3 違いがありますがそれなら、旧エディタに戻すことも可能

もう少し自己チュートリアルで経験値アップしてからアップします。

UTF BOMs Mark

BOM Byte Oder Marks

using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Renci.SshNet;


namespace SSHClient
{
    public enum SSHCLIENT_STATUS {Faild,Redy,Connected,Active,Disconnect}
    public class SSHClient
    {
        protected SshClient _sshClient;
        protected ShellStream _shellStream;
        public string strException { get; protected set;}
        public SSHCLIENT_STATUS STATUS { get;protected set;}
        public Encoding ClientEncoding { get;protected set;}
        public TimeSpan ClientTimeOut { get;protected set;}
        public StreamReader ShStrmReader { get; protected set;}
        public StreamWriter ShStrmWriter { get; protected set;}


        public SSHClient(string host, string Account, string Passwd, int port, string strEncName)
        {
            ClientEncoding = Encoding.GetEncoding(strEncName);
            ClientTimeOut = new TimeSpan(0,0,2);
            STATUS = Connect(host,Account,Passwd,port);
            if(STATUS == SSHCLIENT_STATUS.Connected){
                STATUS = CreatStreams();
                if(STATUS == SSHCLIENT_STATUS.Active){
                    ShStrmWriter.AutoFlush = true;
                    
                }
            }
        }
        private SSHCLIENT_STATUS Connect(
            string strHost,
            string strLoginID,
            string strPasswd,
            int port)
        {
            SSHCLIENT_STATUS res = SSHCLIENT_STATUS.Faild;
            try{
                ConnectionInfo ConnInfo = new ConnectionInfo(
                    strHost,
                    port,
                    strLoginID,
                    new AuthenticationMethod[]{ new PasswordAuthenticationMethod(strLoginID, strPasswd), });
                _sshClient = new SshClient(ConnInfo);
                _sshClient.ConnectionInfo.Timeout = ClientTimeOut;
                _sshClient.Connect();
                if(_sshClient.IsConnected){
                    _shellStream = _sshClient.CreateShellStream("CiscoTer",
                    0,0,0,0,0);
                    res = SSHCLIENT_STATUS.Connected;
                }
            }catch(Exception ex){
                res = SSHCLIENT_STATUS.Disconnect;
                strException += ex.ToString();
            }
            return res;
        }
        private SSHCLIENT_STATUS CreatStreams()
        {
            SSHCLIENT_STATUS res = SSHCLIENT_STATUS.Faild;
            try{
                ShStrmReader = new StreamReader(_shellStream,ClientEncoding);
                // UTF BOMs Mark \357\273\277 
                var enc = new UTF8Encoding(false);
                ShStrmWriter = new StreamWriter(_shellStream,enc);
                // ShStrmWriter = new StreamWriter(_shellStream,false,ClientEncoding);
                res = SSHCLIENT_STATUS.Active;
            }catch (Exception ex)
            {
                res = SSHCLIENT_STATUS.Redy;
                strException += ex.ToString();
            }
            return res;
        }
        public SSHCLIENT_STATUS Disconnect()
        {
            SSHCLIENT_STATUS res = SSHCLIENT_STATUS.Faild;
            try{
                ShStrmReader?.Dispose();
                ShStrmWriter?.Dispose();
                _shellStream?.Dispose();

                _sshClient?.Disconnect();
                _sshClient?.Dispose();

                ShStrmReader = null;
                ShStrmWriter = null;
                _shellStream = null;
                _sshClient = null;

                res = SSHCLIENT_STATUS.Disconnect;
            }catch(Exception ex){
                res = SSHCLIENT_STATUS.Active;
                strException += ex.ToString();
            }
            return res;
        }
        public async Task<Boolean>   DoCommand(string cmd)
        {
            Boolean res = true;
            try{
                await ShStrmWriter.WriteLineAsync(cmd);
            }catch(Exception ex){
                res = false;
                strException += ex.ToString();
            }
            return res;
        }    
        public async Task<string> DoneResult()
        {
            string res = "";
            try{
                for(;;){
                    var getRes = await ShStrmReader.ReadLineAsync(); 
                    if (getRes == null) break;
                    res += getRes + "\n";
                }
            }catch(Exception ex){
                res = null;
                strException += ex.ToString();
            }
            return res;
        }
    }
}

React Ajax

React + Express(JsonAPI)で嵌りました。

package.jsonにproxyを追加 最後に追加する。

"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
   "proxy": "http://localhost:8080"
}

fetch URL は??  同一のサイトになるのでhttp:// は省略する。

componentDidMount() {
    // fetch("https://api.example.com/items")
      fetch("/items")
      .then(res => res.json())
      .then(
        (result) => {
          this.setState({
            isLoaded: true,
            items: result.items
          });
        },
        // Note: it's important to handle errors here
        // instead of a catch() block so that we don't swallow
        // exceptions from actual bugs in components.
        (error) => {
          this.setState({
            isLoaded: true,
            error
          });
        }
      )
  }

Lot6 of Haskell

めっきり忙しくなってきましたが、下の階の連中がHaskellやらで大いに盛り上がっています。 休憩室にもすごいH本がなにげに置いてあったりする <--- Haskell党 立党か?

ロト6もキャリオーバーなので少しハスケッてみました。

*Main> let p6 = combination 6 [1..43]    -- 組合せ定義
*Main> let lot6 n m f = [ x | x <- p6 , (foldl (+) 0 x) == n,    (foldr (-) 0 x) <= m , f x ]  --  List内包 複数の条件定義
*Main> let fx = (\x -> and [ elem 11 x , elem 29 x, elem 32 x , elem 37 x])  -- List内包に食わせる お好きな番号
*Main> lot6 150 -40 fx  -- ソルトを指定して実行
*Main> length  $  lot6 150 -40 fx  -- 数を確認

PythonもList内包がありますが条件指定を複数のλでやれるのが良い感じ(if .. else .. ちょっと美しくない)

combination は見せられませんけどね!(多分 誤実装)

実行速度を考慮(お好きな番号、ソルト)すればアプリ転用になるかも・・・。

Node.js

ios,android開発者たちから「WebRTCはPeer.jsで決まりね!.NTTもSkyWayはじめたよ!」とWebRTCで盛り上がっている。食堂で延々と話を聞か(洗脳)され続けたせいもあって軽く書いてみたくなった。

環境構築(Win7

  1. Node.jsのページからmsiをダウンロード、実行
  2. 管理者Cmd.exeで「npm install peer」 たったこれだけ。
  3. VS for Webの空のプロジェクトで開発環境もOK

取りあえずチャットサーバ作成

  1. WebSockt使うので、管理者Cmd.exeで「npm install ws」
  2. 適当にWebSocketで書きこ
  3. ブラウザで確認IE11でも問題ない。そこでC#からのアプローチに、そこで注意: Win7では既存のSystem.Net.WebSocktesは動きません(例外はく)Win8ならOK!

  4. よってWebSocket4NetをDLしてプロジェクトの参照に加えます。

Formアプリで確認

    private void button1_Click(object sender, EventArgs e)
        {
            if (_ws != null)
            {
                _ws.Open();
                return;
            }
            _ws = new WebSocket(this.textBox1.Text);
            _ws.Opened += _ws_Opened;
            _ws.Closed += _ws_Closed;
            _ws.MessageReceived += _ws_MessageReceived;
            _ws.Open();
        }
    void _ws_MessageReceived(object sender, MessageReceivedEventArgs e)
        {

            Invoke((MethodInvoker)delegate()
            {
                this.listBox1.Items.Add(e.Message);
            });
        }

        void _ws_Closed(object sender, EventArgs e)
        {
            _ws.Close();
            _ws = null;
        }

        void _ws_Opened(object sender, EventArgs e)
        {
            _ws.Send("WebSoket connected");
        }

なんだか簡単にできてしまう。これでいいのか疑問も残るが、この手軽さは素晴らしいどれくらいのコネクションに耐えられるのか試してみたい気もするが今日はここまで、そろそろ本業に戻らないと早く帰れないよ。

C#6.0 Null条件演算子?[ ?.

VS2015を使用するにあたって、C#6.0を意識する必要性が出てきました。 Swift部会の誰かさんに言わせれば「知識・技能の先行投資」というわけです。  コードリーディングでコストが掛かるので現段階では否定的な空気感ですが忘却する前にメモる。  

<<Null条件演算子>>  

旧記述

List<string> listStrs = null;
public void myAction(){
   if(listStrs != null)  listStrs.Add("Hoge Hoge");
}

新記述

List<string> listStrs = null;
public void myAction(){
   listStrs?.Add("Hoge Hoge");
}

使用例 Null演算子??と組み合わせると有用かも?
でも?が??多いので可読性落ちてない?

public void testNullConditionalOperators()
{
   List<string> str = null;

   str?.Add ("testNull");
   //strがnullなら文字列"null"を代入
   var c = str?[0] ?? "null";
   Console.WriteLine ("{0}",c);
   //文字列表示 "null"

   str = new List<string> ();
   //strはnull以外なので文字列追加
   str?.Add ("test00");
   var cc = str?[0] ?? "null";
   Console.WriteLine ("{0}",cc);
   //文字列表示 "test00"
}

delegate型のオブジェクトはobject?.Invoke()で安全に実行できるようです。 次の機会に・・・・・・。