あひるの勉強部屋

つらつらつら~と不定期にカキコするブログ

*ngFor で指定回数繰り返し処理

Angular の *ngFor*ngFor="let n of ['a', 'b']" のように配列のループはできるが、 Vue.js の v-for のように指定回数のループもできるディレクティブが用意されていない。
v-for="n in 4" 相当のことを Angular でやりたかったので、パイプを使って実現してみた。

パイプ

実装

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'range'
})
export class RangePipe implements PipeTransform {

  transform(value: number): Array<number> {
    return Array(value);
  }
}

説明

これは引数に与えられた長さを持つ配列を返すパイプである。
*ngFor="let n of 4 | range" のように使う。
上記の例では、4 | range で長さ4の配列ができ、*ngFor は4回実行されるといった寸法だ。

今回は指定回数ループさせるためだけを考えている。
そのため、例えば

<span v-for="n in 4">{{ n }}</span>

と同等のことするには以下のように index を使う必要がある。

<span *ngFor="let n of 4 | range; index as i">{{ i + 1 }}</span>

多少長いが、標準的な機能で完結しているのでひとまずこれでいいかなと思っている。
もっとスマートな実装方法あれば教えて欲しい!


パイプの生成もAngular CLIのコマンドひとつで簡単だし最高

chromiumで音がでなくなった

今回対応はできたけど、原因がわからなかったので次回調べるためのメモ

環境

  • スピーカー周りの構成
    デスクトップにUSB DACを繋げていて、DACからアンプ、スピーカーといった感じに繋がっている。
+-----+     +----+
| PC  +-----+DAC +---+ アンプ、スピーカー
+-----+     +----+

現象

きっかけ

  • DACのオン・オフを切り替えた
  • 普段はDACのオン・オフ切り替えても今回のような問題は起きていなかった

原因

  • 今回はわからなかった

対応

見返してみると、順序がこれでいいのかというところもあるけど、とりあえず時系列で実行したもの

  1. pulseaudioのプロセス削除

    $ pgrep pulseaudio|xargs kill

  2. pulseaudioのconfig削除

    $ rm -f ~/.config/pulse/*

  3. pulseaudioの停止

    $ pulseaudio -k

  4. pulseaudioの起動

    $ pulseaudio --start

メモ

対応のために仕組みを理解する必要がありそうなので、あとで読むためのリンクを置いておく

Arch Linux Install Battle

はじめに

自分用の備忘録として書き残すことにした。
ほんとはインストール直後にまとめてて公開直前だったんだけど、 Arch の img を消そうと思って勢い余って ArchLinuxInstallBattle.md を消してしまいやる気を失っていた。

環境

製品名
CPU Intel Core i7 6700k
M/B ASRock Z170 Extreme6
RAM Memory 32GB (4 * 8GB)
GPU ASUS GTX 970
Storage TOSHIBA THNSNJ128GCSU

構築予定の概要

  • GPT
  • systemd-boot
  • swap なし
  • CLI 環境まで(とりあえず GUI はなし)

前提条件

  • インストールUSB が作成済み
続きを読む

macOS に cargo-tree いれた

cargo-tree はプロジェクトの依存クレーをツリー表示してくれるやつらしい。
今回依存関係を調べたくて入れてみたので覚書。

インストール手順

環境

name version
macOS 10.12.5
homebrew 1.2.4-61-g4ca2efb
rustc rustc 1.20.0-nightly
cargo cargo 0.21.0-nightly

前提条件

バージョンは前述を参考に

  • homebrew インストール済み
  • rust の nightly がインストール済み

手順

  • cmake を homebrew からインストールしておく
$ brew install cmake
$ cmake --version
cmake version 3.8.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).
$ cargo install cargo-tree
$ cargo tree --version
cargo-tree 0.13.0

途中で起きた問題

  • cargo-tree のインストール中に依存関係のビルドに必要な cmake がねぇよって怒られた
error: failed to run custom build command for `libgit2-sys v0.6.12`
process didn't exit successfully: `/var/folders/80/fmp4sy_d2jq8q_gv5q6gy42w0000gn/T/cargo-install.8xN8YVpcZ19O/release/build/libgit2-sys-edfed1ba91536559/build-script-build` (exit code: 101)
--- stdout
running: "cmake" "/Users/ahiru/.cargo/registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.6.12/libgit2" "-DBUILD_SHARED_LIBS=OFF" "-DBUILD_CLAR=OFF" "-DCMAKE_INSTALL_PREFIX=/var/folders/80/fmp4sy_d2jq8q_gv5q6gy42w0000gn/T/cargo-install.8xN8YVpcZ19O/release/build/libgit2-sys-f696556cc2dc8abe/out" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_C_COMPILER=/usr/bin/gcc" "-DCMAKE_CXX_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_CXX_COMPILER=/usr/bin/c++" "-DCMAKE_BUILD_TYPE=Release"

--- stderr
fatal: Not a git repository (or any of the parent directories): .git
thread 'main' panicked at '
failed to execute command: No such file or directory (os error 2)
is `cmake` not installed?

build script failed, must exit now', /Users/ahiru/.cargo/registry/src/github.com-1ecc6299db9ec823/cmake-0.1.24/src/lib.rs:593:4
note: Run with `RUST_BACKTRACE=1` for a backtrace.

warning: build failed, waiting for other jobs to finish...
error: failed to compile `cargo-tree v0.13.0`, intermediate artifacts can be found at `/var/folders/80/fmp4sy_d2jq8q_gv5q6gy42w0000gn/T/cargo-install.8xN8YVpcZ19O`

Caused by:
  build failed

homebrew で cmake インストールしてリトライしたら成功した。

  • 依存関係の petgraph のコンパイル中に必ず以下のワーニングが出る
   Compiling petgraph v0.4.5
warning[E0122]: trait bounds are not (yet) enforced in type definitions
   --> /Users/ahiru/.cargo/registry/src/github.com-1ecc6299db9ec823/petgraph-0.4.5/src/algo/mod.rs:169:1
    |
169 | type DfsSpaceType<G> where G: Visitable = DfsSpace<G::NodeId, G::Map>;
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

出ても先に進むしビルドに成功してしまう。
気が向いたらなんか情報出てないか調べよう。

bundler 周りのメモ

rbenv を使った bundler のインストー

$ rbenv exec gem install bundler
$ rbenv rehash

上記 bundler を使った gem のインストー

$ rbenv exec bundle install --path vendor/bundle

実行

$ bundle exec ruby *.rb

OSC名古屋2017の報告

自分のブログを遡って見たら、どうやらはじめてのOSCは2013年のOSC名古屋だったみたいです。
2013年に一般来場者として初参加し、2014年に Eject Command UG として展示側で参加しました。
そして今年は初めて実行委員の一人として参加しました。

続きを読む

Slack-Eject

これは Eject Advent Calendar 2016 24日目の記事です。

はじめに

(☝ ՞ਊ ՞)☝ういーん
Eject AC 始まってから、なかなか記事書く時間が取れず残念な感じでしたが、24日目にギリギリ間に合いました。
今回はEject工作におけるクライアントとしてSlackのbotを作成したので、それの紹介をしたいと思います。 ネタ的には今年のOSC名古屋で出してました。

きっかけ

Ejectコマンド工作において、一番面倒なのはクライアントの用意です。
外部からアクセスできるようにして、適当にUI作ってetc…
また、工作ごとに作っていては埒があきません。(専用で作った方がいい場合も多々ありますが)
そこで、簡単に楽にを目標にSlackをクライアントを使ったBotを作成してみました。

Slack-Eject

とりあえずソースはこちら↓ github.com

これはSlackでBotに対して特定のワードを打ち込むと反応するというものです。 今回は eject /dev/cdrom というワードに反応するようにしました。
ワードに引っかかったら、子プロセスで実際にejectコマンドを実行するようにしました。 展示用にワードを設定しているので、かなり面倒なワードですが、実際に使う時はもっと短いといいでしょう。

一応上記機能と同様の実装で、デバイスの検索やドライブの開閉状態の確認なども実装しています。

使用言語はnode.jsで、botkitというライブラリを使って作りました。
実装はいたって簡単で、 controller.hears() の第一引数で反応するワードを正規表現で書き、 第二引数で反応するメッセージタイプを設定します。 あとは function(bot, msg) 内で実行したい処理を書いてあげればクライアントの完成です。

ちなみに実行方法は token=BOTのトークン node app.js です。

簡単でしょう?
これでクライアントのことを気にせずにEject工作が捗るぞ〜(☝ ՞ਊ ՞)☝

終わり