いろいろ備忘録

雑記です。

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

 

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

Gradient Descent

Courseraの講義なので、ルー語になってしまうことをご了承ください。

概要

Cost functionをminimizeするには、傾きが0になる方向にθを近づけていく。

Cost functionをθで(Partial )derivativeすることで傾きを求めると、どちらの方向に行けば最小の地点があるかわかる。

なお、今回Cost functionは二乗誤差なので常に凹型。

θ - 傾き は傾きが大きすぎて収束しないor収束が遅い可能性があるので、学習率x傾きとする。学習率が小さすぎても収束が遅くなる。

最急降下法の「最急」とは、方向がメインであって、大きさはさほど関係ない

J(θ1,θ2)のθ1とθ2をそれぞれPartial derivativeして得られた学習率x傾きのベクトルが合成されるところをイメージ(上から見る)すると、まさに「最急」の方向になることがわかる。

 

Cost function Partial derivative

calculus - Partial derivative in gradient descent for two variables - Mathematics Stack Exchange

u = θ0+θ1x(i)−y(i) のように分けて、チェーンルールを使う。

CentOS7 PHP7.0にtidyをインストール

  1. インストールされているPHPのバージョンに合ったパッケージを探す。
    yum list | grep tidy 
  2. PHP7.0に合うパッケージはPHP70から始まる。7.1はPHP71から始まる。
    今回はphp70-php-tidy.x86_64が見つかった。
    yum install php70-php-tidy.x86_64
  3. インストールしますか?という問いに答える前に、依存パッケージ一覧にlibtidyがあることを確認する。
  4. インストール完了後、rpm -ql {パッケージ名}で、エクステンションのインストール先のパスをメモっておく。
  5. php.iniにextension="{先程メモったパス}"を追加。自分の環境ではextension=/opt/remi/php70/root/usr/lib64/php/modules/tidy.soとなりました。
  6. apacheを再起動して、phpinfo()にtidyがあることを確認。
  7. PHP: Tidy の例 - Manual

flat-uiのvaliables.lessを編集してPHPStorm(WebStorm)でコンパイル

まず、この記事に従って設定します。

mugimugi.hatenablog.com

もし、どこにインストールされたかわからず、コマンドプロンプトでlesscも使えない場合は、グローバルインストール先にPATHが通っていないのでこちらを参照してください。

phiary.me

次に、空のプロジェクトを作成してください。何の言語でも多分いいです。

そこにGitHubからflat-uiをダウンロードしてプロジェクト直下に入れましょう。

これで設定は終わりました。後はlessファイルを編集すると、自動的にflat-ui.lessからflat-ui.cssが生成されます。

エラーが出た:the requested PHP extension intl is mising from your system.

phpのextensionがないらしい。

yum list | grep intlで、自分のPHPのバージョンに合ったものを見つける。

yum install {パッケージ名}する。

rpm -ql {パッケージ名}でextensionの.soの場所を調べる。

php.iniにextension={調べた場所}でインストールしたextensionをPHPに読み込ませる。