Rustのfutures::stream::unfoldで非同期処理を行なう

unfoldというものを見つけた。これは再起処理のようなものを別で定義して呼び出すのではなく、クロージャの中に記述して実行することができる。サンプルではSomeを返す限り繰り返し実行され、Noneを返すことでループを抜けている。上手く使えばコード量を減らせそうだ。

use futures::stream::{self, StreamExt};

#[tokio::main]
async fn main() {

    let stream = stream::unfold(0, |state| async move {
        if state <= 2 {
            let next_state = state + 1;
            let yielded = state * 2;
            Some((yielded, next_state))
        } else {
            None
        }
    });

    assert_eq!(stream.collect::<Vec<i32>>().await, vec![0, 2, 4]);
}

https://doc.rust-lang.org/1.33.0/std/iter/fn.unfold.html

PIXUS TS3130に互換インクを使った場合のインク残量検知無効化方法

ベルカラーの互換インクを使っていたら印刷できなくなって止まった。ストップボタンを長押しすると残量検知を無効化できるそうで、無効化することで問題なく印刷できるようになった。

純正インクBC-310はセット商品で1個あたり2,600円なので、それに比べたらベルカラーのインクは980円で27%増量されているらしいし、こうなると選択肢はベルカラーしかなくなってしまうので、乗り越えなければいけない道のりか。。

参考

Rustでtokioによる並列処理でcore_threadsのブロックを確認する

並列処理を行ってみた。core_threadsで8スレッドを指定している。定義しているタスク中のsleepcore_threadsをブロックするため、同時に稼働できるタスクは8タスクまで。このコードの結果は偶数値が先に完了した後に、奇数値があとから完了し、それらの完了をもって end が出力される。タスク数が8以上となってくると完了するタスクの結果はそのようにならないことを検証できます。

Cargo.toml

[package]
name = "tokio-test"
version = "0.1.0"
authors = ["hoge"]
edition = "2018"

[dependencies]
tokio = "0.2.0-alpha.5"
tokio-timer = "0.3.0-alpha.5"
runtime-tokio = "0.3.0-alpha.6"
futures-preview = { version = "=0.3.0-alpha.18", features = ["compat"] }

main.rs

#![allow(stable_features)]
#![feature(async_await, async_closure)]

use tokio_timer::clock::Clock;
use std::time::Duration;

fn main() {

    let tokio_runtime = tokio::runtime::Builder::new()
        .core_threads(8) // デフォルトはシステムで使用可能なコア数
        .blocking_threads(80) // ブロッキングするセクションの最大数 (デフォルト100)
        .keep_alive(Some(Duration::from_secs(30))) // 指定しない場合ワーカースレッドは永久に待機する
        .clock(Clock::system()) // Clockランタイムが仕様するインスタンス
        .name_prefix("hoge-tokio-") // デフォルトはtokio-runtime-worker-で識別用に自由に変更可能
        .stack_size(10 * 1024 * 1024)  // ワーカースレッドのスタックサイズ10M
        .build()
        .unwrap();

    (1..=8).for_each(|i| {
        tokio_runtime.spawn(async move {
            std::thread::sleep(std::time::Duration::from_secs(i%2));
            println!("test {}", i)
        });
    });

    tokio_runtime.shutdown_on_idle();

    println!("end");
}

gcloudコマンドのアカウント管理について

Google Cloudにはユーザーアカウントとは別に、サービスアカウントというものを作成できる。サービスアカウントの認証情報はJSONとして定義され、そのファイルを用いて認証が可能。

サービス アカウントは、ユーザー アカウントと同様に、メールアドレスで表されます。ただし、ユーザー アカウントとは異なり、サービス アカウントは特定のアプリケーションのみに属するものであり、ある API のために作成されたサービス アカウントはその API へのアクセスにしか使用できません。

https://cloud.google.com/video-intelligence/docs/common/auth?hl=ja

コマンドラインからの扱い方

ユーザーアカウントでgcloudでログインする時は

gcloud auth list

で可能ですがサービスアカウントでログインする時は下記のようにします。

gcloud auth activate-service-account --key-file ./service.json

複数のアカウントでログインできるようになっており、下記のようにしてアカウントリストを確認できる。

$ gcloud auth list
               Credentialed Accounts
ACTIVE  ACCOUNT
        admin@example.com
*       service-a@user-p-99999.iam.gserviceaccount.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

ログアウトについて

一時的に使う業務用の認証であるとき、そのままログインしているとよくないのでログアウトしてあげる。

gcloud auth revoke service-a@user-p-99999.iam.gserviceaccount.com

ちょっと個人用のファイルとかを謝ってGCSやGCPとかに入れそうに思ったけど、そもそもバケットやホストやパスが違うからエラー吐いて落ちるだけだから、中長期的に使うならログインしっぱなしでもいいかもしれない。

gcloudコマンドでOAuthトークンを取得する

こちらで下記のようなぽいコマンドを発見しました。

gcloud auth application-default print-access-token

しかし実行結果は下記のようになります。

ERROR: (gcloud.auth.application-default.print-access-token) The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.

正しく実行するにはGOOGLE_APPLICATION_CREDENTIALSという環境変数にサービスアカウントファイルを指定してあげる必要がありました。

GOOGLE_APPLICATION_CREDENTIALS=./service-a.json gcloud auth application-default print-access-token

上記のコマンドはgcloud auth loginなどでのログインすることなく実行できます。

参考

JavaScriptでアロー関数式を利用する

JavaScriptでアロー関数式を利用する

TypeScriptあたりで書いてたやつ。IE対応していないけどネイティブでもこのように書いていたものが

console.assert(JSON.stringify([1,2,3].map(function(i) { return i * 2; })) === JSON.stringify([2,4,6]));

こんな感じでかける

console.assert(JSON.stringify([1,2,3].map(i => i * 2)) === JSON.stringify([2,4,6]));

グローバル汚染を防ぐために即時関数を作る時の処理もこんなふうに書ける。

(() => {
  console.log("hoge");
})();

Edgeには対応しているし良いところで生JSでもこう書きたい

参考

体臭を完全に消せるLavilin Jubileeとかいう最強のクリーム

イスラエルのラヴィリンジュビリーというクリームが今までの人生で出会った体臭予防クリームの中で最強です。

男性用、女性用とありまして、私は男性用使ってますが、全く臭いがなくなります。

無自覚な臭いまで消せる

臭いってのは自分では分からないレベルのものと、わかるレベルのものがあり、わかるレベルのものは簡単に消せるんですが、分からないものってそんな簡単には消えないんですよね。自分では無臭だと思っていたんだけど、実は臭いがあったみたいなことがあります。

このラビリンジュビリーとかいう難しい名前のクリームは、分からないレベルの臭いまで消せます。

自覚のある臭いで効いてる事がわかる

6時間くらい運動したりすると自分自身が凄く臭いことがわかると思うんですが、このクリームを塗ってから運動すると6時間程度なら大丈夫。(ただし12時間くらいになると耐えられないようだ。)

ただし超高い!

最近安くなってきては居ますが、それでも3,000円前後。買ってみるとわかりますが、手のひらサイズです。一瞬でなくなります。

冬は汗をほとんどかかないと思うので、夏だけ使うとすれば、まあいけるかなといった値段ですね。月に2-3個くらいの消費ペースになるかと。

使い方にはコツがある

レビューにもあると思うんですが、クリームの伸びが悪いのでお風呂上がりとか、お湯で少し湿らせてから塗るのがコツかなと思います。

おわり

これを使いつつボディシートで定期的にケアしておけばある程度臭いは防げるかなと思います。