いろいろ備忘録

雑記です。

git cloneで失敗する時 windows

Warning: Permanently added the RSA host key for IP address 'IPアドレス' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

とエラーが出た。

Windowsでは、ユーザフォルダ/.ssh/id_rsa.pubが公開鍵のファイルなので、これをGitHub側に設定(コピペ)する。

N HTTPサーバ ~21 覚書

nodegrind -o app.cpuprofile ファイル名 でパフォーマンスの測定を行い、結果出力を行う。出力されたファイルはChromeJavascript profileで読み込める。

echoのリダイレクト(閉じカッコ一つ)はファイルがない場合新規作成する。

 

git cloneで失敗する時 windows - いろいろ備忘録

node.jsのhttpモジュールにおいて、エラーはイベントで発生する。すなわち

http.createServer((req, res) => {
 
}).on('error', (e) => {
}).on('clientError', (e) => {
});

のように、イベントを処理する「on」で、errorイベントを処理することになる。

node index.js 2>&1 | tee -a tmp.log

  1. nodeがログを出力する
  2. 2>&1によって、エラー出力が標準出力になる。
    これがないと次のteeにエラー出力が渡せない。
  3. teeコマンドが標準入力を標準出力とファイルの両方に出力する。
  4. 結果、コンソールとファイルの両方に、info,warn,errorログの全てが出力される。

 curlコマンドでは、-d オプションでPOSTできる。
-d 'message=testMessage' のように、POSTするデータがkey = valueの形になることに注意。HTMLでformにnameが必要なことと同じ。

Node.jsのイベントループ - いろいろ備忘録

レスポンスをStreamのpipe(出力先)で返せる。ストリームなのでメモリが節約できる。入力側で出力側のend()を呼ぶため、res.end()がいらないが、pipe()のオプションで変更できる。

 

  const rs = fs.createReadStream("./form.html");
            rs.pipe(res);
            let i = 0;
            let fc = ()=>{
                if (++i > 2) {
                    rs.unpipe(res);
                    res.end();
                }else{
                setImmediate(fc);
                }
            };
            setImmediate(fc);

上記コードはイベントループごとにfcが実行され、4回目のイベントループでパイプを解除し、end()する。
イベントループ1回目 次のイベントループにfcを登録する i == undefined
イベントループ2回目 fcを実行し、fc内で次のイベントループにfcを登録 i==1
イベントループ3回目 同上 i==2
イベントループ4回目 fcを実行するが、i==3となるのでパイプ解除とend()する
肝となるのは、実行するとHTMLが何も返らないこと。
ストリームから最初のデータが送出される前にunpipe()されるため。
イベントループの制限を4回ではなく10回とかにすると中途半端なHTMLが返る。ストリームの途中でunpipe()されるため。
1000とかにすると、完全にストリームが出力し終わった後となるので、おそらく全てのHTMLが出力されている。

 

node.jsのBASIC認証に使うauth.basicの第二引数

(username, password, callback) => {
//このcallback()は引数で渡されている。アクセスを許可するかどうかのbool値を引数にとる。
//いつもは無名関数を渡す事が多いが、これはその逆バージョンになっている。
callback(username === 'guest' && password === 'xaXZJQmE');
}

 

BASIC認証BASE64エンコードしているだけなので盗聴されるとバレる。

BASIC認証では、401 Unauthorizedを返すことでログアウトが可能。

Cookieは毎回リクエストヘッダに挿入して送信されている。あまり肥大化するとサーバやネットワークに負荷がかかるため容量に制限がある。また、BASIC認証も毎回送信されている。HTTPはステートレスなため。

req.header.cookieは文字列。indexOf()やsplit()を使って目的のものを取り出す。

 

Anatomy of an HTTP Transaction | Node.js

 req.on('data',(chunk)=>{})のイベント「data」は、イベントループごとに送られてきたデータが存在する時実行されるが、断片的なものであっても実行されるので、大きなデータや低速で送られてくる場合、すなわち一回のイベントループで全てのデータが来なかった場合はこれだけでは処理が難しい場合がある。普通は、イベント「data」では受信したバイト配列をappend()していき、受信し終わったときにイベント「end」がemitされるので、それでconcat()してtoString()などする。

 

 

N サーバ 覚書

echo "文字列" >> ファイルパス によって、ファイルパスで指定したファイルに文字列を追記することができる。
まずechoによって文字列が標準出力に向かうが、>>によってファイルにリダイレクトされるため。
なお、>(閉じカッコ一つ)だと、上書きとなってしまう。

.profileは起動時に自動的に実行されるシェルスクリプトのファイル。
つまりここに環境変数の設定を書けば毎回起動時に環境変数が設定される。

シェルの変数には、現在のシェルでのみ有効なシェル変数と、子のシェルでも有効な環境変数がある。指定しない場合シェル変数となり、変数に代入するときにexportをつけたとき環境変数となる。

sourceコマンドとbashコマンドはファイルをシェルスクリプトとして実行するコマンド。
新しいコマンドを有効にするとき、何故sourceコマンドでなければならないのか?
前提として、コンソールはbashプロセスによって管理されている。
sourceコマンドは自らのプロセスで実行する。bashコマンドの場合は子bashプロセスを立ち上げてそちらで実行する。つまりbashコマンドだと閉じた空間のプロセス上で設定してしまうため意味がない。

const a = 入力 || 0;の「|| 0」とは、入力がないときはfalseとなるので0で初期化されるということ。booleanが返されるわけではないらしい。

 

 

N 準備 覚書

Linux

ファイル名がドットで始まるものは一時ファイルが多い

ディレクトリへの移動は../でなくても..でよい

~はユーザごとのホームディレクトリであり、ユーザが自由に変更して良い場所。多くの場合/home/ユーザ名と等しい。

findコマンドでファイルやディレクトリを検索できる。

mkdirの-p オプション...ディレクトリがすでに存在する場合は何もしない

Windows

%USERPROFILE%はC:\Users\ユーザ名になる

fsutil behavior set symlinkevaluation によってローカル→ローカル ローカル→リモートなどシンボリックリンクの作成を方向ごと(4方向)に許可できる。管理者権限が必要。

Vagrant

vagrant box addで利用できるボックスを追加する

vagrant haltでvagrantを終了させる

Vagrantfileをいじると利用できるメモリを増やせる

VirtualBoxで共有フォルダを作る方法 · GitHub

SharedFoldersEnableSymlinksCreate/ファイルパスで共有フォルダにシンボリックリンクが作成できるようになる

vagrant up やvagrant reload中にCommand: ["modifyvm", "さまざま", "--natpf1", "delete", "ssh"]などとエラーが出た時は.Vagrantディレクトリを削除する。

 パスワードが求められたら

Vagrant の ubuntu/xenial64 Box における初期ユーザ名とパスワード - 約束の地

私の環境では08ffd37595c75cce3cf5833cでした。

 

シェルスクリプト

#!/bin/bashと最初の行に書くことによって、シェルスクリプトとして実行出来るようになる。シバンという。

date +'%Y%m%d%H%M'は現在の日付時間を指定の書式で出力するということ。

文字列中に日付を入れたい時は、バッククォーテーションでコマンドを囲むことにより、バッククォーテーション内のコマンドを実行した結果が文字列中に入るので、コレを利用する。

curlではUserAgentなど指定できる。

cronによってシェルスクリプトを毎時実行などできる。

タスクを消したい時はcrontab -e でvimが開くので入力した行を削除。

Angular4のチュートリアル覚書

 

// 画面一つ一つの要素を部品化しコンポーネントとして(=部品単位で)切り出すことで、保守のしやすいソースを記述することができる
@Component({
// selector: 'something' とすると、<something></something>という風に利用できる
selector: 'app-root',
// HTML(テンプレート)の場所 templateが指定されている時はそちらが優先される
templateUrl: './app.component.html',
// CSSの場所
styleUrls: ['./app.component.css'],
// このtitleやheroは下で定義している
template: `<h1>{{title}}</h1><h2>{{hero}} details!</h2>`
})

 

 interpolation binding HTML内の変数展開のこと。{{変数名}}

[(ngModel)] とは、テキストボックス等との双方向バインディングのためのもの。大カッコはブラウザに変数を渡し、丸括弧はinputのアクションに紐付けるためのものだから。ngModelを使う時はapp.module.tsFormsModuleを読み込む必要がある。

モジュールを読み込む際は、app.module.tsの上のimportと@NgModule内のimportsを編集する。コンポーネントならdeclarationsに。

ngFor Angularのfor文。ngIfなんかもある。ディレクティブという名前がある。

let hero of heroesとは、let(const,letのletか?) 仮変数名 of 配列

*ngForのアスタリスクについて templateタグが生成されるということらしい。

javascript - angular 2 why asterisk (*) - Stack Overflow

TypeScriptではインスタンス生成での代入にコロン を使用し、クラス宣言での代入にイコール = を使用する。

styles:で指定したcssコンポーネント内にのみ適用される。

(click)の丸カッコはイベントのターゲットであることを識別するために必要。

[class.selected]="a === b" これはaとbが等しいならselectedクラスを追加する。つまり、クライアント側で実行される。

@Componentには、そのコンポーネントに関するデータを書く。タグ名など。

~.component.tsは常にComponentクラスをexportする。

[変数名]は値のバインディング。丸括弧がないのでブラウザのアクションは受け取らない。

@Input()をプロパティの前につけることで、inputであることを宣言する

Angularにおけるサービスとは、MVCにおけるMやビジネスロジックのこと。

@Injectable修飾子をつけるためにはimportが必要。

Angular2のDIを知る - Qiita

Angular2 DOC GUIDEを翻訳する[DEPENDENCY INJECTION] - Qiita

TypeScriptではコンストラクタの引数にpublic/privateなどアクセス修飾子をつけることで、同名の変数をプロパティとして宣言し、コンストラクタで初期化する。

つまり、constructor (public a:int) {} は a:int; constructor (a:int) {this.a = a;}と等しい。

DIのプロバイダのスコープは2つあり、アプリケーション全体のスコープとコンポーネントインスタンス単位のスコープがある。

JavaScriptプログラミング講座【Promise について】

 

// エグゼキューター関数
// resolve,rejectは関数オブジェクトであり、Promiseが渡すので、宣言とかはしなくていい
function ExecutorFunc( resolve , reject ) {
if (1) {
// 成功時
// このresolveによって、次のthenの第一引数の関数が呼ばれる
resolve('成功した');
} else {
// 失敗時
reject('失敗した');
}
}

// Promise オブジェクトを生成
// 実際のExecutorFuncにはファイル読み込みやAPI通信などの関数が入る
const promise = new Promise(ExecutorFunc);

// 通信や読み込みの成功時に呼び出される関数
// 例えばブラウザに表示したり
function FulfilledFunc (value) {
console.log(value);
}

// promiseを実行して成功した場合はresolveによってFulfilledFuncが呼ばれる
promise.then( FulfilledFunc );

 {{book?.title}}で、bookがnullでないときのみtitleプロパティにアクセスする

HTMLを記述した変数をバインドするとエスケープされてそのまま文字列として表示される。
[innerHTML]="msg" のようにバインドすれば、危険性のある場所(JSやフォーム要素)だけエスケープしたHTML文字列をHTMLとして表示できる。
完全にエスケープさせない場合は、

 constructor(private sanitizerDomSanitizer) {
    // msgプロパティの内容に信頼済みマークを付与
    this.safeMsg = sanitizer.bypassSecurityTrustHtml(this.msg);
  }

とする。

 

HTML attribute と DOM property - Please Sleep

 プロパティと属性の違いとは、HTMLタグ内に書いてあるのが属性で、HTMLを解釈して生成されたDOM要素がもつ変数がプロパティ。

属性はあるがプロパティは存在しないものにバインディングするときはアトリビュートバインディングを使用する。 アトリビュートバインディングは[attr.属性名]="変数名"のように使用する。

Angularにおけるパイプ(PurePipe, ImpurePipe)とメソッドの違い - Qiita

 pipesという、文字列を変形させる仕組みがある。
{{変数名 | json}} jsonに変換
{{変数名 | lowercase}} 小文字化
slice 指定範囲を抜き出す 
number 数字として表示する、書式が指定できる
他にも小数点からパーセントとか

 

 

$(function(){})で囲む理由

$(function(){})

で囲むと、全てのDOM要素が読み込まれた後に実行されるそうです。

Node.js + Express + socket.io で、入力に応じて画像を返す.md · GitHub

 

似ているものに即時実行関数があります。
(function(){})など、カッコで全体を囲んでいるものです。
javascriptでは複数のモジュールを読み込んだときに名前空間が共有されますが、即時実行関数を適用すればスコープになるので変数名がぶつからないという利点があります。
また、グローバル変数とならないのでメモリがすぐに解放されます。なので初期化に使われます。
しかし、ES6でletやconstがブロックスコープとなったので出番は減りました。

octaveの行列の積

*と.*では異なる。

*は行列として積をとる。

[1 2; 3 4; 5 6] * [2 ; 2] = [ 1*2 + 2*2 ; 3*2 + 4*2 ; 5*2 + 6*2] = [6; 14 ; 22]

octave:13> x
x =

1 2
3 4
5 6

octave:14> y
y =

2
2

octave:15> x * y
ans =

6
14
22

 

.*は要素ごと。

[1 2; 3 4; 5 6] .* [ 0 0 ; 1 1 ; 2 2 ] = [ 0 0 ; 3  4; 10 12]

octave:25> x
x =

1 2
3 4
5 6

octave:26> y
y =

0 0
1 1
2 2

octave:27> x .* y
ans =

0 0
3 4
10 12

 

おまけ 

スカラとの積はどちらを使っても同じで、要素ごとの積になる。

octave:30> x
x =

1 2
3 4
5 6

octave:31> y
y = 2
octave:32> x * y
ans =

2 4
6 8
10 12

octave:33> x .* y
ans =

2 4
6 8
10 12

 

行列の積は順番が大切。
左の列数と右の行数が等しくなければならない