OmniAICreator/Qiita-1.07M huggingface dataset:
parabol.coを使ってふりかえりをしてみた

#概要
parabol.co + WebMeetingでふりかえりやってみたら、ほぼほぼparabolいいぞって話になった。


#経緯
拠点の来期の方針を考えるにあたって、みんなでディスカッションしたかった。
とはいえ、昨今の状況ではみんなが出社してホワイトボードを囲んでというのも難しいため、フリースタイルでディスカッションかなぁと思っていたところ、チームのslackにこんな投稿が。

![スクリーンショット 2020-04-22 11.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23612/e53a3996-6fb5-3ed7-290b-55528789a88d.png)

で、いくつかWeb記事しらべて1時間後にはRetroMeeting作成して、inviteリンクをチームのSlackにはりつけてました。


#使ったWebサービス
https://www.parabol.co/

<img width="1239" alt="スクリーンショット 2020-04-22 11.14.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23612/526bc97c-711f-1b37-990b-03cb16cf5cf9.png">

1. ログインしたら、チームをつくる
2. 「Start New Meeting」を選ぶ
3. 「Retro Meeting」を選択（他に「Check-in Meeting」がある)
4. タイプを選ぶ
5. 「Start Meeting」を選ぶ
6. メンバーを招待。

すべて英語のサービスだけど難しいところはなにもなく、はじめ方はこれだけ。タイプを選ぶのが最初、？と思うけど、うちはKPTをよくやっていたので似たフレームワークの「Start Stop Continue」を選択。CustomizeでKPTのテンプレをつくることもできるし、全く別のテンプレも作成可能。
初回でもSignInしてから10分かからなかったし、慣れればここまで1分でできる。メンバー招待もSlackにリンク共有するだけ。（メールでも可能）

#いいところ
- 準備が簡単
- タイマー機能
- フェーズが明確
  - カードを書いている間は自分しか見えない
  - 確認したボードに消し込み線が入る
- 類似のカードをグルーピングする機能がある
- カードへの投票機能がある
- コメント機能がある
- 最後に勝手にサマライズしてくれる

オンラインだとツールによると書いた側からリアルタイムでみんなに見える場合もあるけど、これはフェーズが区切られていて、オープンされるまでは自分にしか見えない形式。チームによっては、他人の意見が見えると流されたり影響を受けやすい場合もあるので、いろいろな意見を集められるという点ではクローズ→オープンの段階が踏めるのはとてもいい。
あとはタイマーがあったり、カードのグルーピング、いいね機能はファシリーテーター役をとてもやりやすく感じた。

ファシリテーターや参加者のスキルにも依存するので個人的な感想だけど、オフラインでふりかえりをやっていると、人数が多くなってくるとどうしても時間が長くなり、途中でダレてくる時があって。
それがせーのでオープンして会話しながら並べ替えができるでピック＆ディスカッションがスムーズなので進行が短時間で進み、さらにいいねやコメントなど発言していない間もできることがあるのでダレにくいように思えた。オフラインでやるときより、支援機能分のふりかえりの参加者数のキャパが大きくできそう。


#悪いところ
項目つくったけど、今のところ見当たらず。これだけの機能が単独チームな無償ですべて使えるので、いきなりリモートワークになって困っているチームは、深く考えずに使ってみるといいよってお勧めできる感じ。

強いていうなら、過去のMeetingを一覧化されてると嬉しいなくらい。TimeLineから見れるのが最初わからず、ちょっと戸惑った。

#次やってみたいこと
まだ一度使ってみただけなので、おお、オンラインだと難しいかなぁと思っていたふりかえりが、思ったよりかなり便利にできる、ってところまで。
1時間の定例のなかでやったので、カード（付箋）を書く時間もあまりとれなかった。ここはチームによって好き好きだと思うけど、ミーティングの前に準備して書いてくる運用もよさそう。
（うちはそうすると個人差が大きくなりすぎるので、全体で5分なり10分なり時間を確保したほうがいいように思える）
見た感じかなり奥も深いツールで、簡単につかいはじめることもできるけど、これを日々使い続けて蓄積することができればチームにいろいろといい影響をもたらすことができるだろうなという感覚もあり。

- チェックインミーティング
- ここから派生したタスク管理
- データの蓄積、継続的な利用

こういう機能も今後つかっていったら面白そうだなーと感じた。タスクは各種ツールへの連携もあり、使いこなせたらメリットが大きそう。
組織の中で複数のチームがそれぞれ自律的にカイゼン活動を行うのであれば、それを見えるかするツールとして有償利用も検討の余地がありそう。弊社の場合、現在の拠点はまだ10人前後なので、無償で使用できるので２チームまでの範囲で充分おさまりそう。

#参考
https://tech.studyplus.co.jp/entry/2020/04/06/100302
https://note.com/savetime/n/nd3e5001afd07
プログラマ脳を鍛える数学パズルQ07 日付の2進数変換

#問題概要

日付をyyyymmddの整数で表し、これを2進数に変換し、逆順に並べ、10進数に戻したとき、もとの日付と同じになるものを見つける。

#Code
```python
import datetime as dt

start = dt.datetime(1964, 10, 1)
end = dt.datetime(2020, 7, 24)

for days in range((end - start).days):
    day = start + dt.timedelta(days)
    daystr = day.strftime("%Y%m%d") #yymmdd
    daybin = bin(int(daystr))
    daybinr = str(daybin)[:1:-1] #2進数を表す頭の"0b"を除外して逆順にする
    daystrr = str(int(daybinr, 2))
    if daystr == daystrr:
        print(daystr)

```

#補足
2進法や文字列の逆順については、[Q01](https://qiita.com/kotorilabo/items/e42f1afdeafb9652ed3e)を参照。

## 日付の演算
datetime.timedelta で 秒、分、時間、日、週の演算ができる。
このモジュールはなぜか月、年は対応していなくて、これにはdateutil.relativedeltaという別のモジュールを使う。

参考：[Pythonで翌日や翌月みたいな日付の計算をする](https://qiita.com/dkugi/items/8c32cc481b365c277ec2)

```python

import datetime as dt
from dateutil.relativedelta import relativedelta

today = dt.datetime(2020, 4, 22, 14, 21, 50)

print(today + dt.timedelta(seconds = 5)) #2020-04-22 14:21:55
print(today - dt.timedelta(minutes = 30)) #2020-04-22 13:51:50
print(today + dt.timedelta(hours = 10)) #2020-04-23 00:21:50
print(today + dt.timedelta(days = 10)) #2020-05-02 14:21:50
print(today - dt.timedelta(weeks = 1)) #2020-04-15 14:21:50
print(today + relativedelta(months = 3)) #2020-07-22 14:21:50
print(today - relativedelta(years = 5)) #2015-04-22 14:21:50
```
Hamlについて

# Hamlとは
HTMLよりも簡単に書くためのビューテンプレートエンジンのことです。
「マークアップは美しくあるべき」という原則に基づいて開発されました。
Hamlを使用することで、「綺麗に」、「読みやすく」、「生産的に」ビューを作成することができます。

## Hamlの導入方法

1.Gemfileに、gem 'haml-rails'を記述。
※どの環境に適用させるか考える。

```Gemfile

gem 'haml-rails'
```

bundle installも忘れずに。

```ruby

bundle install
```

3.ターミナルでrails haml:erb2haml を実行し、拡張子がerbのファイルをhamlに変換する。

```
$ rails haml:erb2haml
```

コマンド実行後、以下の文が出てくるが「y」を選択する。

```

Would you like to delete the original .erb files? (This is not recommended unless you are under version control.) (y/n)
```

yと入力するとデフォルトで作成されたerbファイルはHamlに変換される。
ColdFusionのstruct内データの出力でちょっと詰まったからメモ

##はじめに
みなさん、**coldfusion**(表記ゆれ)って知ってますか？

多分ほとんどの方が知らないと思うんで簡単に説明するんですけど、adobeが出してるJAVAベースの言語なんですよね。
ちょっと面白いのが、マークアップもスクリプトも両方使えたりしちゃいます。
私はあまり好きではないのですが、好きな人は好きなのでしょう。

今日はそんなcoldfusionで詰まった部分のメモ書きです。

##structの値が取り出せない
structの構造はこんな感じ。

```java
<cfset arr = arrayNew(1)>

<cfset strMember1 = structNew("ordered")>
<cfset strMember1.name = "A">
<cfset strMember1.state = "1">
<cfset arr[1] = strMember1>

<cfset strMember2 = structNew("ordered")>
<cfset strMember2.name = "B">
<cfset strMember2.state = "2">
<cfset arr[2] = strMember2>
```

配列[1]の中にstrMember1の情報が、[2]の中にstrMember2の情報が入ってるようなイメージで。

```java
<cfscript>
for(i=1;i<=arraylen(arr);i++){
    tostring(i);
    string=strMember+i;
    cfloop(collection="#string#" item="key"){
```

みたいな感じで値を取れるかと思ったけど取れなかった。
そらまぁ無理だわな。

##答え
for inを使って中身をどんどん掘っていけばいいらしい。

```java
<cfscript>
for(d in arr){
    for(key in d){
        writeoutput(key & ":" & d[key] & "<br>");
    }
    writeoutput("<br>");
}
</cfscript>
```

って感じにすると、
NAME:A
STATE:1

NAME:B
STATE:2
みたいに出力してくれる。

###これもうわかんねぇな
AndroidStudioでDatabaseを直接触れるDatabase Inspectorが便利そう

AndroidStudio 4.1からSqliteを編集する機能が追加されました。
以下を選択することで表示されます

```
View > Tool Windows > Database Inspector
```

SQL流したり、その場で直接編集したりすることができるみたいです。
もちろんRoomでObserveしてたりしたら、そのまま変更通知も飛んでくるみたいです。
便利ー

# 参考

[https://medium.com/androiddevelopers/database-inspector-9e91aa265316]
例外処理


### 普通の削除処理

```ruby

  def destroy
    hoge = Hoge.find(params[:id])
    hoge.destroy
    redirect_to root_path
  end
```

### 削除機能に例外処理を実装

```ruby
  def destroy
    begin 
      # 例外が起こるかもしれないコード
      hoge = Hoge.find(10)
      hoge.destroy
    rescue => error
      # 例外が発生した時のコード
      flash[:notice] = "削除に失敗しました"
    ensure
      # 例外が起こっても起こらなくても実行したい時のコード
      redirect_to root_path
    end
  end
```



### 更新機能に例外処理を実装する場合

- begin~endは省略できる。下記は省略形。
- 送られてきたＩＤが存在しない場合と、バリデーションに引っかかった場合とそれぞれ別にrescueを記載する。

```ruby
  def update
    @post = Post.find(params[:id])
    @post.update!(post_params)
    redirect_to root_path
  rescue ActiveRecord::RecordNotFound => e
    flash[:notice] = "指定したIDが見つかりませんでした"
    redirect_to root_path
  rescue ActiveRecord::RecordInvalid => e
    render :edit
  end
```


こんな書き方でも大丈夫そう??

```ruby

  def update
    begin
      @post = Post.find(params[:id])
      if @post.update(post_params)
        redirect_to root_path
      else
        render :edit
      end
    rescue 
      flash[:notice] = "IDが見つかりません"
      redirect_to root_path
    end
  end
```
git commitでeslint --fix found someなったら

```git 
% git commit -m "text"
husky > pre-commit (node v12.16.1)
  ↓ Stashing changes... [skipped]
    → No partially staged files found...
  ❯ Running tasks...
    ❯ Running tasks for *.(ts|tsx)
      ✖ eslint --fix
        git add



✖ eslint --fix found some errors. Please fix them and try committing again.
```

こうなったら

```
% git commit --no-verify
```

でOk
Laravelのclear系コマンドを集めたArtisanコマンドを作成したい

#はじめに
LaravelのArtisanコマンドでクリア系のコマンドを実施する時、毎回下記の様に行っている。

`php artisan route:clear`
`php artisan cache:clear`
`php artisan config:clear`
`php artisan view:clear`

上記を一つにまとめられたらいいなぁ･･･と常々思っていたので、
まとめることにする。
##コマンド生成

```
php artisan make:command all-clear
```
これでapp/Console/Commands配下に`all-clear.php`が作成される。

名前は全部消すということで`all-clear`とする。
また、`php artisan list`でその他のコマンドを確認すると、2単語以上のコマンドは`ケバブケース`になっていることが判明したためそれに合わせる。

```例
  clear-compiled       Remove the compiled class file
  dump-server          Start the dump server to collect dump information.
```
##ファイルの中身

```all-clear.php
namespace App\Console\Commands;

use Illuminate\Console\Command;

class allClear extends Command
{
    /**
     * コンソールコマンドの名前と引数、オプションを記述します。
     *
     * @var string
     */
    protected $signature = 'all-clear';

    /**
     * コンソールコマンドの説明を記述します。
     *
     * @var string
     */
    protected $description = 'route cache view config全てをclearする';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
       //Artisanファサードのcallメソッドで4種類のコマンドを呼び出し、
       //戻り値を変数に格納します。
        $config = \Artisan::call('config:clear');
        $route = \Artisan::call('route:clear');
        $view = \Artisan::call('view:clear');
        $cache = \Artisan::call('cache:clear');
        
        //成功した場合戻り値が0、失敗した場合-1が返ってきます。
        //this->info()はコマンドラインにに出力される文字列を指定できます。
        //もっとマシな書き方があると思います。

        if (0 == $config )
        {
            $this->info('Configuration cache cleared!');
        }
        if (0 == $route )
        {
            $this->info('Route cache cleared!');
        }
        if (0 == $view )
        {
            $this->info('Compiled views cleared!');
        }
        if (0 == $cache )
        {
            $this->info('Application cache cleared!');
        }
    }
}
```

##実行

```
$ php artisan all-clear

Configuration cache cleared!
Route cache cleared!
Compiled views cleared!
Application cache cleared!

//成功しました。
```

##終わりに
もっと良いやり方があると思います。
###参考

<a href="https://readouble.com/laravel/5.5/ja/artisan.html">Laravel 5.5公式リファレンス</a>
「シン・テレワークシステム」を試してみた

# 背景

[NTT 東日本 - IPA 「シン・テレワークシステム](https://telework.cyber.ipa.go.jp/news/) が昨日（04/21）発表されたため、
接続を試してみました。

# 利用機器

## サーバ

[Windows Server 2019](https://www.microsoft.com/ja-jp/cloud-platform/windows-server)

## クライアント

[Windows 10 バージョン1909](https://docs.microsoft.com/ja-jp/windows-insider/at-home/whats-new-wip-at-home-1909)

# 導入手順

[新型コロナウイルス対策用 在宅勤務用シンクライアント型テレワークシステム 緊急構築・無償開放・配布ページ](https://telework.cyber.ipa.go.jp/news/) に記載されている内容に従ってください。
事前にユーザ側で決める必要があるものは、接続時に必要とする **パスワード** です。

# 接続

クライアントにて公式サイトからDLした中にある「ThinClient.exe」を実行します。

## 接続先コンピュータ名の入力

![2020-04-22_133938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/e25b32eb-e3e4-6f77-29c2-a9ecfc24f1d6.png)

こちらは、サーバにインストールした後に表示されるコンピュータIDです。

![2020-04-22_133700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/27930ac7-ff01-714b-4a78-cdfe07ae6bba.png)

## 接続先コンピュータのパスワードを入力

![2020-04-22_134020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/2a6f33c4-b450-f497-2d3f-1e144937dfae.png)

## 自動でリモートデスクトップ接続が実行

![2020-04-22_134126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/c8fe0763-5b38-16d8-d389-5a0eb5c7004f.png)

※ リモートデスクトップ接続は本来 port:3389 ですが、VPNの関係で別のポートに接続されています

# まとめ

これはIT運用者からすると、導入が楽だと思います。
まだテレワーク環境の導入が出来ていない情報システム部門の方、
ファイアウォールなど、色々と考慮する点が軽減されるので、導入ハードルが下がると思います。

IPA、NTT東日本という強力なタッグを中心としたブランドからリリースされているので、
出元不明で導入が難しいといったこともなく、スムーズに進むかと思います。
Microsoft GraphAPIをつかってみよう。-- 事前準備 編--

#・はじめに#
Microsoft Graph API を利用するために必要な手順をまとめました。
今回は、PowerShell で Graph API を利用するために必要な「アプリの登録」の手順を紹介します。

**※本記事は、はてなブログに移行しました。
　記事は最新化して情報も追加しています。よろしければそちらをご覧ください。**

　[くらっちのクラウド日記](https://kurattyodiary.hatenablog.com/entry/MSGraphapiPreparation)
woocommerceのcheckoutページでshippingclassを変更し送料を更新したい

初めて投稿させて頂きます！
woocommerceのチェックアウトページにて、商品のトータル重量によって配送クラスを変更したいです。
カートページでの変更はできており、チェックアウトページではうまく行きません

配送クラスが60サイズ、80サイズ、100サイズとあり

現在各都道府県別に送料が設定されており、さらに商品個別に設定された配送クラスによって送料が自動計算される仕組みですがこれを個別ではなく最終的なトータル重量に応じて配送クラスを設定し送料を計算させたいです。

function.php はこのようになっております。

// 重さに応じた送料に変更 
add_action( 'woocommerce_before_calculate_totals',  'change_shipping_class');
function change_shipping_class(){
      $cart = WC()->cart;
    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) )
        return;

    $cart_weight = WC()->cart->get_cart_contents_weight();

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;


    if($cart_weight <= 98 ){

      $int_shipping_60 = get_term_by( 'slug', '60', 'product_shipping_class' );
      foreach ( $cart->get_cart() as $item ) {         
            $price = get_post_meta($item['product_id'] , '_price', true);
            $item['data']->set_price( $price );
            $item['data']->set_shipping_class_id( $int_shipping_60->term_id );
      }
        
    }elseif($cart_weight >= 99 &&  $cart_weight <= 200){

      $int_shipping_80 = get_term_by( 'slug', '80', 'product_shipping_class' );
      foreach ( $cart->get_cart() as $item ) {         
            $price = get_post_meta($item['product_id'] , '_price', true);
            $item['data']->set_price( $price );
            $item['data']->set_shipping_class_id( $int_shipping_80->term_id );
      }
            
    }elseif($cart_weight >= 201 &&  $cart_weight <= 400){

      $int_shipping_100 = get_term_by( 'slug', '100', 'product_shipping_class' );
      foreach ( $cart->get_cart() as $item ) {         
            $price = get_post_meta($item['product_id'] , '_price', true);
            $item['data']->set_price( $price );
            $item['data']->set_shipping_class_id( $int_shipping_100->term_id );
      }

    }

    if( is_admin() || ! is_checkout() ) return;}

かなり困っておりますどうか、よろしくお願い致します。
RX72N Envision Kit とe2studioの接続を確認する

はじめに
---

RX72N Envision Kitというマイコンの評価キットが発売になりました。

https://www.renesas.com/jp/ja/products/software-tools/boards-and-kits/eval-kits/rx72n-envision-kit.html

RX65N Envision KitからCPU性能やメモリ容量の向上、ボード搭載の回路の充実化が図られています。

https://www.renesas.com/jp/ja/products/software-tools/boards-and-kits/eval-kits/rx65n-envision-kit.html

CPU性能やHMI機能を評価する用途に特化したボード仕様と言え、Arduino互換のシールド用ヘッダや汎用ピンソケットのスルーホール、I2C専用端子の空きがいずれもないという変更点は事前に知っておいた方がよいでしょう。

マイコンボードは"Lチカ"までが遠い、というのは昨今の開発環境の拡充ぶりを見るとすでに過去の話のように思えますが、遠いものは遠いのだという心の声が聞こえましたので記録を残しておくことにしました。

開発環境
---

開発環境としてCS+とe2studioが用意されていますが、ルネサスのRX72Nのサイトでは`20/4/22の時点ではCS+のサンプルコードがないため(下記参照)、e2studioの方を選びました。

https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/rx/rx700/rx72n.html#sampleCodes

e2studioはV7.8.0から64ビット版と32ビット版が別になりました。今回は開発環境に合わせて`20/4/22の時点の最新Verとなる"2020-04 (64ビット版)"をインストールしました。

https://www.renesas.com/jp/ja/products/software-tools/tools/ide/e2studio.html

インストール手順の説明は省略しますが、RXのライブラリは忘れず入れましょう。

インストール後に新規プロジェクトを作成します。今回は
新規C/C++プロジェクト > Renesas RX > GCC for Renesas RX C/C++ Executable Project を選びます。

続いて、Debug hardwareには"E2 Lite(RX)"を選びます。RX72N Envision KitとPCの接続はUSBケーブル(MicroUSB-TypeA)1本でよく、E2 Liteエミュレータの機能がオンボードで実現されています(E2OB)。

Target Deviceにはチップのシルク印刷の通り"R5F572NNHDFB"を選びます。RX72Nのユーザハードウェアマニュアルの表1.3の通り、この型名はLFQFPパッケージの144pin、Flash/RAM=4MB/1MB、暗号機能あり、85℃保証品ということを示しています。e2studio内では"R5F572NN"までの情報で識別されます。

Envision Kitのマニュアル"7.1 e2studioを使用する場合"の図7.1のような画面が出なかったため、デバッガの設定は新規プロジェクト作成後、メニューバーの"実行">"デバッグの構成"で"デバッグ構成"を開き、下図のように設定しました。

![Debugger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/2201a860-4659-6b4e-da8d-93aaaacf0f8e.png)

デフォルトからの変更点はKitのマニュアルの図7.1の通りです。

LED点灯
---

e2studioとボードの接続確認のため、コードを編集してボード上のユーザ用LEDに接続された端子の出力を"L"にします。
今回はmainルーチンを下記としました。

```test.c（名前は任意）
int main(void) {

	//set P40 "H"or"L"
	//PORT4.PODR.BYTE = 0x01; //P40:"H" (LED off)
	PORT4.PODR.BYTE = 0x00; //P40:"L" (LED on)
	PORT4.PDR.BYTE = 0x01;  //P40:output

    while(1) {
	// TODO: add application code here
    }
return 0;
}
```

ビルド後に実行すると、ボード中央の青色LEDが点灯します。

![2020-04-22 12-37-51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/7a791ae3-f833-ffe9-bd06-0fba279c66a3.jpeg)

上記のコメントアウトをPORT4.PODR.BYTE = 0x01;側に変更するとLEDが消えます。
PDR(Port入出力設定)やPODR(Port出力値設定)の機能はRX72Nのユーザハードウェアマニュアルを確認してください。

https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/rx/rx700/rx72n.html#documents

これで接続が確認できました。

RX72N Envision Kitの公式ページは現在も更新が続いています。
https://github.com/renesas/rx72n-envision-kit/wiki

今後追加される予定の項目が書かれていますが、大変興味深いです。次の更新を楽しみに待っています。
Locustを1台のマシンで分散実行する（CLI編）

# はじめに

Python製負荷テストツール[Locust](https://locust.io/)において、複数プロセスを協調動作させることで、並列化によりテスト対象ホストに大きな負荷をかけることができます。
本記事では、マルチコアのマシン1台でこれを実現する方法を紹介します。
なお、Web UIは使わないものとします。[^1]

公式ドキュメントでは下のページで紹介されています。

- [Running Locust distributed — Locust 0.14.5 documentation](https://docs.locust.io/en/stable/running-locust-distributed.html)

[^1]: Web UIを使う方法については、[Python製負荷試験ツールLocustで、分散負荷試験環境を準備する - Qiita](https://qiita.com/CkReal/items/cb53518f2d504950c09c)などで紹介されています。

以下では、前提として `locust` の実行環境は整っているものとします。[^2]
また、locustfileの書き方も特に解説しません。

[^2]: locustのインストール方法はこちら: https://docs.locust.io/en/stable/installation.html

## 動作確認環境

- locust 0.14.5
- Python 3.6.9

# 実行方法

下のようなシェルスクリプトを作成して、実行すればよいです。

```sh:run-locust-distributed.sh
#!/usr/bin/env bash

set -ux

# ログ、レポート出力先ディレクトリ作成
mkdir -p logs output

host=https://example.com # 試験対象ホスト
locustfile=yourlocustfile.py
slave_num=8      # slave数（並列数 - 1）
master_port=5557
max_clients=200  # 最大クライアント数
duration=90m     # 総実行時間
step_clients=5   # クライアントの増加数 / インターバル
step_interval=1m # インターバル

# master
taskset -c 0 locust -f $locustfile --no-web \
  -c $max_clients -t $duration -H $host \
  --master --expect-slaves $slave_num --master-bind-port $master_port \
  --step-load --step-clients $step_clients --step-time $step_interval \
  --logfile logs/locust.master.log -L WARNING --csv output/locust.master \
  &> /dev/null &

# slaves
for no in $(seq 1 ${slave_num}); do
  taskset -c $no locust -f $locustfile --no-web \
    -c $max_clients -H $host \
    --slave --master-host 127.0.0.1 --master-port $master_port \
    --logfile logs/locust.slave$no.log -L WARNING --csv output/locust.slave$no \
    &> /dev/null &
done
```

# 解説

- masterプロセスと複数のslaveプロセスにより協調動作します。
- プロセスが動作するコアを指定するために[taskset(1)](https://linux.die.net/man/1/taskset)コマンドを使っています。これが一番の肝です。
- master側で `--expect-slaves=N` オプションをつけることで、指定数のslaveが接続したことを待って試験を開始してくれます。 [^3]
- `--step-load` の行はオプションです。[Step Load Mode](https://docs.locust.io/en/stable/running-locust-in-step-load-mode.html)で段階的に負荷を上げたい場合にご利用下さい。
- `--csv` オプションにより、CSVで各種指標やログを記録します。
- `-L` オプションはログレベルです。デフォルトの `INFO` だとCSVと情報が重複する部分が多いので、 `WARNING` で必要十分だと思います。ログをウォッチしておくとCPUリソース不足など問題があったときに気づけます。

# 補足
## CPUリソース不足時の警告ログ

locust実行ホストのCPUリソースが足りない場合、以下のようなログが出ます。
このようなログが出た場合、期待した負荷をかけられないことが考えられるので、master-slave構成による並列化や、slave数の増加を考えた方が良いでしょう。

シングルプロセスのとき:

```
[2020-04-15 05:57:28,228] hostname/WARNING/root: Loadgen CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-locust-distributed.html for how to distribute the load over multiple CPU cores or machines
```

master-slave構成で分散実行しているとき:

```
# master側
[2020-04-15 07:41:01,928] hostname/WARNING/locust.runners: Slave hostname_886b86153c0c4a839a5dc35a190be166 exceeded cpu threshold (will only log this once per slave)
[2020-04-15 07:43:50,863] hostname/WARNING/locust.runners: CPU usage threshold was exceeded on slaves during the test!

# slave側はシングルプロセスの場合と同じなので省略
```

# 脚注

[^3]: https://docs.locust.io/en/stable/running-locust-without-web-ui.html#running-locust-distributed-without-web-ui
キャンバスアプリでデータソースの絞り込みを行う

SharePointのリストをスマホで編集しやすくするためにPower Appsのキャンバスアプリを作成したが、必要なものだけが表示されるようにしたかった。
例えば交通費の経費申請をする場合など。
経費リストには交通費以外の経費申請の内容が登録されていくが、それは申請する経費の種類によって入力する内容が異なったりする。
その時に一覧画面に交通費以外の申請内容が表示されても困るので絞り込みをしたかった。

# 結論
BrowseScreed1 -> BrowseGallery1 -> 詳細設定 -> データ -> Items に設定されている内容([Filter関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-filter-lookup))を変更する。
※PowerAppsがキャンバスアプリを作成した際に自動で生成するコントロール名で記載しています。

Filter関数には条件(Formula)を複数指定できるので、絞り込みたい条件をカンマ区切りで指定していく。
例えば

```
Filter([@経費], 経費種別.Value = "交通費", StartsWith(Title, TextSearchBox1.Text))
```

など。
ここの数式のポイントが

1. 経費種別.Value としている。(経費種別はSharePointリストの1項目で選択肢)
2. =で文字列の一致を判定している。

の2つ。

## 経費種別.Value としている事
SharePointリストで選択肢の項目に対して文字列の比較をしようとした場合、選択肢項目は文字列ではないのでValueプロパティで選択している項目の文字列を取得する必要がある。
※これが選択肢ではなく、1行テキストとかであれば項目名を直接指定するだけで済む。

## =で文字列の一致を判定している
Power Appsの数式には[IsMatch関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-ismatch)が存在する。
しかしこの関数を使おうとした場合に、以下の様な警告が表示された。

> 委任に関する警告です。この数式の "Filter" の部分は、大きなデータ セットで正常に機能しない可能性があります。
> 
> データ ソースは数式を処理できずに、不完全なデータ セットを返すことがあります。データ セットが不完全な場合、アプリケーションは正しい結果を返さないか、正常に機能しない場合があります。

なので=で文字列が一致しているかは判定している。
IsMatchについてはまた後日詳しく調べるとしよう。

[参考記事：キャンバス アプリでの委任を理解する](https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/delegation-overview)
[参考ブログ：委任に対するデータ行の制限](https://powerapps.microsoft.com/en-us/blog/powerapps-data-row-limit-for-non-delegable-queries/)
Djangoのテンプレートファイル整理

# 初めに
はじめまして、koki1992です。
初投稿です。よろしくおねがいします。
今は学生で、来年からプログラミングと全く関係の無い業界に飛び込む予定です。
Covid-19の蔓延で授業が中止となり、時間が余ったので、Quitaを始めてみました。

# Djangoのテンプレートファイル整理について
Djangoのテンプレートを作成するとき、そのアプリのフォルダ内で、

```shell
mkdir templates/<アプリの名前>/
```

とフォルダを作り、この中にテンプレートを保存していくことになると思います。
しかし、テンプレートの数が増えると、1つのフォルダに数十個のテンプレートファイルが混在することになると思います。

こうなると、たとえテンプレートの名前をきれいにつけても、目的のテンプレートファイルまでたどり着きにくくなり、イライラの原因となります。

# テンプレートフォルダ内でさらにフォルダを分ける
そこで、僕の場合、アプリケーションがある程度大きくなってきたら、テンプレートフォルダ内でテンプレートファイルを更にフォルダ分けるようにしています。

# 具体例
僕は、自分の情報整理用にアプリを作っているのですが、そのアプリのテンプレート構成をお見せします。
構成ですが、

NOTEというアプリの中に

* Binder
* Note
* Page
* Block


という要素を作りました。
Binderの中にNoteが、Noteの中にPageが、Pageの中にBlockが入っています。

それぞれの要素は、その要素の表示するテンプレート以外に、新規作成、更新、削除に対応するテンプレートを持っています。

というわけでこうなりました。

```shell
├── templates
│   └── NOTE
│       ├── Binder
│       │   ├── Binders.html
│       │   ├── CreateBinder.html
│       │   ├── DeleteBinder.html
│       │   └── UpdateBinder.html
│       ├── Block
│       │   ├── Blocks.html
│       │   ├── CreateBlock.html
│       │   ├── DeleteBlock.html
│       │   └── UpdateBlock.html
│       ├── Note
│       │   ├── CreateNote.html
│       │   ├── DeleteNote.html
│       │   ├── Notes.html
│       │   └── UpdateNote.html
│       └── Page
│           ├── CreatePage.html
│           ├── DeletePage.html
│           ├── Pages.html
│           └── UpdatePage.html
```

なにも考えずにテンプレートフォルダにテンプレートファイルを突っ込むよりも、整理されてとても見やすくなりました。

# 最後に

最後までご覧いただきありがとうございます。
まだまだ素人ですが、なんとかネットの情報をかき集めてスキルアップを目指したいと思っています。
その過程で得られた知識を記事にしていこうと思います。
ご意見、ご感想お待ちしております。

また、Twitterも始めてみました。
もしよろしければフォローよろしくおねがいします。
Xojoで正規表現

Xojo の正規表現は PCRE library を使っているそうだ。

なので正規表現構文自体はほぼ違和感なく使用できる。

ただメソッドは Search と Replace しかない。 Split などは使えない。

# 環境

Xojo 2019 R3.1

これに使っている PCRE library は 8.33 だそうだ。

検証は、Webアプリケーションで行いました。

# 検索

ファイル名からベースネームと拡張子に分ける


```
Var re as New RegEx
Var match as RegExMatch
Var thisBase as string 
Var thisExt as string

Var dir As New FolderItem("/var/www/html/template", FolderItem.PathModes.Native)

re.SearchPattern = "^(.+)(\.[^.]+)$"   // ベースネームと拡張子を抽出
match = re.Search(filename)
thisBase = match.SubExpressionString(1)
thisExt = match.SubExpressionString(2)

```

# 置換


トン を  kg に変更

```

Var profeel as String
var re as New RegEx
re.SearchPattern="([0-9]+)"
re.SearchPattern="([0-9]+)([\s]*)t"
re.ReplacementPattern="$1\x30\x30\x30$2 kg"

profeel = "57 M height and 550 t heavy"
profeel = re.Replace(profeel)

MessageBox(profeel)

```

re.ReplacementPattern="$1 000$2 kg"

だと空白が間に入ってしまうのでアスキーコードで "000" を表現しています。
Swiftで標準入力を簡単に行うクラスを作ってみた

# 概要
競プロでSwiftの標準入力が面倒だったので，C++の```cin >> a```みたいな動作を実現するクラスを作ってみました．これで簡単に入力を受け取れます．

# 環境
Swift 5.1.3

# 実装
実際に作ったものがこちらです

```swift
import Foundation
infix operator >>>: MultiplicationPrecedence
protocol Initializable {
    init?(_ description: String)
}
extension Int: Initializable {}
extension String: Initializable {}

class Input {
    var inputs: [String] = [];

    func read() {
        self.inputs = readLine()!.components(separatedBy: " ")
        self.inputs.reverse()
    }

    func pop() -> (String) {
        if self.inputs.count == 0 {
            self.read()
        }
        return self.inputs.popLast()!
    }

    @discardableResult
    static func >>><T: Initializable> (cin: Input, right: inout T) -> (Input) {
        right = T.init(cin.pop())!
        return cin
    }

    @discardableResult
    static func >>><T: Initializable> (cin: Input, right: inout [T]) -> (Input) {
        for i in 0..<right.count {
            right[i] = T.init(cin.pop())!
        }
        return cin
    }
}
```

# 使い方
C++の```cin```のように使います．次のコードは[AtCoder Beginners Selection A](https://atcoder.jp/contests/abs/tasks/practice_1)の回答例です．

```swift
let cin = Input()
var (a, b, c, s) : (Int, Int, Int, String) = (0, 0, 0, "")
cin >>> a >>> b >>> c >>> s

print(a + b + c, s)
```

C++の```cin >> a```の```>>```が```>>>```になっただけのように使えます．ただし変数の型は指定する必要があり，またInt型とString型のみにしか対応していないので，必要に応じてメソッドを追加する必要があります．


## 配列に対応
配列への入力に対応しました．次のように

```
5
1 2 3 4 5
```

1行目に配列の大きさ，2行目以降にデータが与えられる入力の場合は

```swift
let cin = Input()

var N: Int = 0
cin >>> N

var A = [Int](repeating: 0, count: N)
cin >>> A
```

このように受け取ることができます．ちなみに2行目以降が改行区切りであっても同じように受け取れます．

# おわりに
~~ジェネリクス使うとシンプルにできそう．~~使えました．
Sass(Scss)について

# Sassとは
CSSの機能を拡張した言語のこと。(拡張子は.sass　or　.scss)
CSSを簡潔に書けるだけではなく、CSSの中で変数を使ったり、計算を行うことなどができる。

## .sass拡張子について
Sassファイルでは最初に作られたSASS記法を扱うことが出来る。

-SASS記法-

```ruby

.h1 span
  font-size: 30px
  font-weight: bold
  strong
    color: blue
```

## .scss拡張子について
CSSに非常に似た記法のSCSS記法で、Sassの機能を使うことが出来ます。
現在は、こちらの記法が主流となっています。

-SCSS記法-

```ruby

.h1 span {
  font-size: 30px;
  font-weight: bold;
  strong {
    color: blue;
  }
}
```

## メリット
1.記述の簡略化ができる。(親子関係のセレクタをネストしてまとめることができる。)

```css

.block {
   background-color: #ffffff;
  .main {
    color: #000000;
    font-size: 50px;
  }
}
```

2.プログラムのような処理が可能。
$変数名:値;で定義することができる。

```css

$main-color:#fff
```

3.複数のCSSファイルをまとめれる。
バーシャルを使用してまとめる。
※バーシャル=分割したsassファイルのこと。@import _ファイル名で読みこむ。

```css

@import "header";       /* _header.scssを読み込む */
@import "navbar";       /* _navbar.scssを読み込む */
```

4.同じ値を使い回せる:mixinを使用し同じスタイルにまとめる。
※mixin=スタイルを定義するもの。@mixin mixin名(){}と書く。
@include mixin名として呼び出す。

```css

@mixin block() {
  &:after {
    content: '';
    display: block;
  }
}
...

.menu {
  @include block();
  ...
```
Bitbucket CloudからAWS CLIを実行する

# 概要
先日Bitbucketからaws cliを実行したい状況になったので、その方法を紹介します。
手順は以下の通りです。

1. AWSでIAMユーザーを作成し、アクセスキー・シークレットキーを発行
2. Bitbucket Pipelinesを有効にする
3. Bitbucketにアクセスキー・シークレットキーを登録
4. bitbucket-pipelines.ymlを作成
5. BitbucketでPipelinesを実行

# 1. AWSでIAMユーザーを作成し、アクセスキー・シークレットキーを発行
IAM > ユーザー > ユーザーを追加
から、プログラムによるアクセスにチェックをいれて作成します。

アタッチする権限は、Bitbucketからどのような権限でAWSにアクセスしたいかで決めてください。

作成後に発行されるアクセスキー・シークレットキーを控えておきます。

# 2. Bitbucket Pipelinesを有効にする
Pipelinesを有効にしたいリポジトリの画面にいき、

Settings > PIPELINES/Settings

ここでEnable PipelinesをONにします。

# 3. Bitbucketにアクセスキー・シークレットキーを登録
Settings > PIPELINES/Repository variables
ここで、Pipelinesの環境変数を以下のように登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310081/e5570e2b-3d1e-558f-25bb-f841d7a87416.png)

# 4. bitbucket-pipelines.ymlを作成
```bitbucket-pipelines.yml
pipelines:
  default:
    - step:
        image: atlassian/pipelines-awscli
        script:
          - aws iam get-user
```

AWS CLIを使うのでDockerイメージにAtlassianが提供するこちらのイメージを使います。
https://hub.docker.com/r/atlassian/pipelines-awscli

お好きなブランチで、このファイルをリポジトリ直下で commit -> push し、再度Bitbucketのリポジトリの画面に戻っておきます。


# 5. BitbucketでPipelinesを実行

Pipelines > Run pipeline

ここで、先ほどのブランチと、Pipelineにdefaultを指定してRunをクリックすれば、`aws iam get-user`が実行できます。

以上になります。
【Python】行列演算

機械学習を理解する過程で使った行列演算をまとめる。
随時更新します。

# 足し算
各要素ごとに和を取る。Pythonでは + 演算子で計算できる。

```math
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
+
\begin{pmatrix}
5 & 6 \\
7 & 8
\end{pmatrix}
=
\begin{pmatrix}
6 & 8 \\
10 & 12
\end{pmatrix}
```

```python
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

print(a+b)
```
```python
[[ 6  8]
 [10 12]]
```

# 引き算
各要素ごとに差を取る。Pythonでは - 演算子で計算できる。

```math
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
-
\begin{pmatrix}
5 & 6 \\
7 & 8
\end{pmatrix}
=
\begin{pmatrix}
-4 & -4 \\
-4 & -4
\end{pmatrix}
```

```python
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

print(a-b)
```
```python
[[-4 -4]
 [-4 -4]]
```

# アダマール積（シューア積）
各要素ごとに積を取る。Pythonでは * 演算子で計算できる。

```math
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
\odot
\begin{pmatrix}
5 & 6 \\
7 & 8
\end{pmatrix}
=
\begin{pmatrix}
5 & 12 \\
21 & 32
\end{pmatrix}
```

```python
import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

print(A*B)
```
```python
[[ 5 12]
 [21 32]]
```

# 積
対応する行と列の各要素を掛け合わせた和を取る。Pythonではdot関数で計算できる。
ただし、dot関数は**内積を求める関数**です。
引数に行列をとったときは**結果として行列の積**を得ます。

```math
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
\begin{pmatrix}
5 & 6 \\
7 & 8
\end{pmatrix}
=
\begin{pmatrix}
19 & 22 \\
43 & 50
\end{pmatrix}
```

```python
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

print(np.dot(a, b))
```
```python
[[19 22]
 [43 50]]
```
Vimちょっとメモ

#最近覚えた
##置換前ワードを検索後に置換するとき
置換前ワードを検索で確認してから置換する場合置換前ワードを2回打ち込んでいた。
hogeをfugaに置換する場合hogeを省略できる。

```
/hoge
%s//fuga/
```

##行番号
カーソル位置からの相対的な行番号表示
コピペが捗る
```
set relativenumber 
```

行番号の表示と同時にはできない。
行番号の表示を有効にするとカーソル行の行番号のみ表示される。
行番号の表示を無効にするとカーソル行は0を表示する。
```
set number
```

##インデント調整
インデントを一段下げる,上げる
shiftwidthの値分インデントする

```
>>
<<
```
入力中に下げるとき

`Ctrl+T`

入力中に上げるとき

`Ctrl+D`




#いつも再検索してしまう
##文字コード変換
今開いているファイルが読めないときは文字コードを変更して再読込

```
e ++enc=utf-8
e ++enc=sjis
e ++enc=euc-jp
```

保存するときの文字コード指定

```
set fenc=utf-8
set fenc=sjis
set fenc=euc-jp
```

今の文字コードの確認

```
set enc=?
est fenc=?
```
##改行コード変換

改行コードの確認

```
set ff?
```
改行コードを変更して開き直し

```
e ++ff=unix
e ++ff=dos
e ++ff=mac
```
AWS トレーニングメモ part1

##AWSサービスの紹介
顧客重視、AmzonGo、文化について

###マイクロサービスアーキテクチャー
それぞれの機能が独立しており、サービス更新時も他に影響することなく更新ができる

###リージョン
AZが２個以上が定義

####ローカルリージョン(大阪のみ)
AZが1個のみ＊2021年に2個になる予定なので、１時的なもの

###AZ(アベイラビリティゾーン)
仮想データセンター

###VPC
顧客専用の仮想空間を作成できる


###ダイレクトコネクトの利点
インターネット経由ではないため、通信帯域が１Gと１０Gを選択でき、通信を担保できる。

###EC2
1秒ごとの従量課金
管理者権限で使用可能

###購入オプション

####スポットインスタンス
入札形式。最大オンデマンドで買うより、80%買うことができる。
ただ、他の人との入札にも関係するので確実でない


###EBS
EC2にマウント可能なブロックストレージ
1つのEBSは16TB

###S3
安価で容量無制限のストレージ
1ファイル5TBまで
自動バックアップは、３リージョンでバックアップをとっているので堅牢


##TCOのモデル及び料金設定のベストプラクティス
TCO(Total Cost of Ownership)=総保有コスト

全体の料金を把握できず、初期の金額で判断しがちなので
そこを見直して欲しい
目に見えないコストを明確にすることを重要視する（本来の運用業務の削減など）

TCOの注意点
・運用コストを見落としがち


AWSの場合
・初期投資が不要

8ヶ月以上使う場合は、オンデマンドより、リザーブドインスタンスを使用する方が得かも。
CSVにヘッダがない場合にヘッダを挿入する関数(Python3)

検索すりゃ簡単に引っかかるやろと思ったらなかったので自分で書いて投稿。
csv.readerを使い忘れて意外と手間取ったポンコツPGです。

第１引数にはパスを入れてあげてください。

```python
def insert_header(csv_file: str, header:list):
# headerがない場合にheaderを挿入する
    try:
        # まず読み込み
        with open(csv_file, 'r', encoding='utf8') as f:
            rows = [row for row in csv.reader(f)]
        # ファイルが存在して、headerがある→何もしない
        if(rows[0] == header):
            pass
        # csvファイルとheaderの列の数が異なる場合は何もしない
        elif(len(rows[0]) != len(header)):
            pass
        # ファイルが存在するが、headerがない場合→headerを追加したものを上書き
        else:
            with open(csv_file, 'w', newline = "", encoding='utf8') as f:
                writer = csv.writer(f)
                writer.writerow(header)
                writer.writerows(rows)

    # ファイルが存在しない場合→HEADERだけ追記
    except FileNotFoundError:
        with open(csv_file, 'a', newline="", encoding='utf8') as f:
            writer = csv.writer(f)
            writer.writerow(header)
```

良くする案とかあったらコメントが欲しい。。。
【Python】NIFITIからPNGへ変換 (COVID-19[新型コロナウイルス] CT例)

### 目的
NIFTIからPNGへ変換
[NIfTI-Image-Converter](https://github.com/alexlaurence/NIfTI-Image-Converter)を使用する。

COVID-19(新型コロナウイルス)患者のCTデータを例に、NIFTIからPNGへと変換していく。
詳しい解説とコードは、[【Python】NIFITIからPNGへ変換 (COVID-19[新型コロナウイルス] CT例)](https://www.aiprogrammers.net/entry/2020/04/20/223257)をご覧ください。
【AWS10分間チュートリアル】Docker コンテナのデプロイ

# 概要
社内でAWSを使ったシステム設計を任される予定があり、AWSのサービスを勉強中です。
筆者は全体感と個々のサービスの内容の概要を知らない程度の知識感です。

教材は、10分間チュートリアルが網羅的に全体感が把握できると思い選びました。
この記事では20200422時点の画面を張りながら進めます。
チュートリアルの画面が古いかもしれません。

# 教材

10分間チュートリアル
https://aws.amazon.com/jp/getting-started/tutorials/

Docker コンテナのデプロイ
https://aws.amazon.com/jp/getting-started/tutorials/deploy-docker-containers/?trk=gs_card

# ECSとは

>Amazon Elastic Container Service (Amazon ECS) は、Docker アプリケーションをスケーラブルなクラスターで実行するために使用するアマゾン ウェブ サービスです。このチュートリアルでは、ロードバランサーの後方に配置した Amazon ECS クラスターで Docker 対応サンプルアプリケーションを実行し、サンプルアプリケーションをテストし、課金を避けるためにリソースを削除する方法について学びます。

無料枠の範囲で実行できます。(20200422時点)
>このチュートリアルはすべて無料利用枠の範囲で実行できます。

## 1. Amazon ECS の設定

このまま次へをクリックします。
`コンテナ定義 > 編集`からsample-appの内容を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/0474178f-e4a5-eb80-1254-37a1855daad9.png)
次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/ada26216-ddc7-60b1-d1eb-93449f39a94e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/a5a9e20f-aa22-d020-44a9-3c682103cb5a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/e4ff6fe7-c388-bd8c-901f-1fd469c54f69.png)
サービスの表示がクリックできるようになるまで待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/93641625-8a52-514a-79bd-4ccd2edec3f1.png)
サービスの表示をクリックすると、
クラスター名"default"が作成されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/a57e9072-095c-d2c7-fe3f-22983f960356.png)
## 2. コンテナにアクセス

`クラスター > default > タスク:(タスクID)`を辿り、
パブリックIPをブラウザに張り付けます。

例では`54.173.52.000`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/4241292a-e341-a45b-bd52-7a90e44cc9fb.png)

# 3. 結果
>Amazon Elastic Container Service (Amazon ECS) で Docker 対応アプリケーションの設定、デプロイ、削除を行う方法を学びました。Amazon ECS は非常にスケーラブルかつ高性能なコンテナ管理サービスで、Docker コンテナに対応しており、Amazon EC2 インスタンスのマネージド型クラスターでアプリケーションを簡単に実行できます。

>次のチュートリアルに進み、Docker Registry を作成してコンテナイメージを保存する方法を学ぶことができます。チュートリアルでは、Docker イメージを構築し、リポジトリにプッシュし、イメージを使用してアプリケーションを Amazon ECS にデプロイします。
[Docker レジストリを作成する](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)

コンテナ内にデプロイされているsample-appにアクセスすることができました。
チュートリアルの一部設定は割愛しています。IAM ロールの設定など
C# 基礎プログラミング100本ノック～21-25本目～ 

#こんばんは

本日も基礎プログラミング100本ノックやっていきます！

前回→[16-20本目](https://qiita.com/K_Hisui/items/df4d6e53d0f7f3657f0e)
次回→[26-30本目](https://qiita.com/K_Hisui/items/a72e97af8636eebb9eef)

#21本目
>整数値を入力させ、その値が5よりも大きく、かつ、20よりも小さければOKと表示するプログラムを作成せよ。

~~~Sample.cs
Console.Write("input num : ");
int num = int.Parse(Console.ReadLine());

string result = (num > 5 && num < 20) ? "OK" : "NO";
Console.WriteLine(result);
~~~


#22本目
>整数値を入力させ、その値が-10以下、または、10以上であればOKと表示するプログラムを作成せよ。

~~~Sample.cs
Console.Write("input num : ");
int num = int.Parse(Console.ReadLine());

string result = (num > -10 && num < 10) ? "NO" : "OK";

Console.WriteLine(result);
~~~


#23本目
>整数値を入力させ、その値が-5以上10未満であればOK、そうでなければNGと表示するプログラムを作成せよ。

~~~Sample.cs
Console.Write("input num : ");
int num = int.Parse(Console.ReadLine());

string result = (num <= -5 && num < 10) ? "OK" : "NG";
Console.WriteLine(result);
~~~



#24本目
>整数値を入力させ、その値が-10以上0未満、または、10以上であればOK、そうでなければNGと表示するプログラムを作成せよ。

~~~Sample.cs
Console.Write("input num : ");
int num = int.Parse(Console.ReadLine());

string result = ((num < 0 && num >= -10) || num >= 10) ? "OK" : "NG";
Console.WriteLine(result);
~~~

#25本目
>整数値を入力させ、その値が-10未満ならrange 1、-10以上0未満であればrange 2、0以上であればrange 3、と表示するプログラムを作成せよ。

~~~Sample.cs
Console.Write("input num : ");
int num = int.Parse(Console.ReadLine());

string result;
if(num < -10)
{
    result = "Range 1";
}
else if(num >= -10 && num < 0)
{
    result = "Range 2";
}
else
{
    result = "Range 3";
}

Console.WriteLine(result);
~~~


#リンク
[基礎プロI 100本ノック 基礎編](http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocks.html)
NWPathMonitorのハマりどころ

# currentPathはstartするまで正しい値が返らない

Reachbilityの気分でcurrentPathを呼ぶと上手く取れない

```swift
let monitor = NWPathMonitor()
print(monitor.currentPath.status) //unsatisfied
```

startすると正しい値になる

```swift
let monitor = NWPathMonitor()
monitor.start(queue: .global(qos: .background))
...
print(monitor.currentPath.status) //satisfied
```

# NWPathMonitorはすぐに反映されない

start直後は正しい状態に反映されないことがある。

```swift
let monitor = NWPathMonitor()
monitor.start(queue: .global(qos: .background))
print(monitor.currentPath.status) //unsatisfied
```

感覚としては、viewDidLoad ~ viewDidAppearくらいの時間は必要そう。

```swift

  let monitor = NWPathMonitor()
  
  override func viewDidLoad() {
    super.viewDidLoad()
    monitor.start(queue: .global(qos: .background))
  }
  
  override func viewDidAppear(_ animated: Bool) {
    print(monitor.currentPath.status) //satisfied
  }
```

これでも取れる

```swift
  let monitor = NWPathMonitor()
  
  override func viewDidLoad() {
    super.viewDidLoad()
    monitor.start(queue: .global(qos: .background))
    DispatchQueue.main.async {
      print(self.monitor.currentPath.status)
    }
  }
```
UnityにAndroid SDKを設定しようとしたら「Unable to detect SDK in the selected directory.」

- Windows 10 Pro
- Unity 2018.4.18f1
- Android Studio 3.6.3

### 起きた問題

Android Studio から SDK Managerで対象のプラットフォームパッケージをインストールする。
Unity側で `Edit > Preferences > Extension Tools > Android > SDK` に `Browse` ボタンからSDKのパスを設定しようとすると

> Unable to detect SDK in the selected directory.

と表示されてUnityが正しくSDKを認識してくれない。

![4227dc0e119618213160b13a353918cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135033/eb858f01-2c5e-3538-eb4f-a4205a9ada10.png)


### 解決方法

Android Studio の SDK Manager で `Android SDK > SDK Tools` の 右下にある `Hide Obsolete Packages` のチェックを外す。
`Android SDK Tools (Obsolete)` が表示されるの
でインストールする。

Unity側に戻ると自動で認識してくれるようになる。

![bd89a24279c9edb361c0b63b0a74ebea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135033/5fbc487b-c235-9016-ed9c-af9bd5b88711.png)

SDK Toolsは2017年から更新されていないらしい。
Android Studio 3.5系に戻すことでも対応できたので、Android Studioのバージョンがあがるとまた別の問題になるかも。
NPIのインストールの仕方+pythonでlineにメッセージを送る

こんにちは、
お知らせもかねてここを作りました
以前lineのpackageを配布しましたがpyが同伴されていないことにきずいて
記事を削除させていただきました
pipのやり方が難しく、
また、このようなことが起きないように
pip的なのを作らせていただきました
それでは、作ったnpiの使い方をご紹介します
npiは、
Nectrl package　installer
の訳です
ですのでこれからpackage配布には、これを使用させていただきます
##download
https://drive.google.com/file/d/1wrCmyp7w0g7f0zFWTDfwoApm_XPYmYfx/view?usp=sharing
（現在google chromeにて危害を及ぼす可能性がありますと表示されています右の^をクリックして継続をクリックしてください)
ここからinstall.zipをダウンロードして解凍し
install.exeを実行して指示に従ってください
##起動
初期設定だと
cドライブ直下にインストールされています
npi.exeを右クリック→管理者として実行し放置
処理が完了すると
packages→Nectrlpackageinstaller-master
の中に配布しているpyが入っています
(各packageを個別にインストール不可)
使用するpyを
実行する作成したpyファイルと同じディレクトリに置いて
移してください
###line.py
```py:linefail.py
from line import line
from line import tokenline
tokenline("トークン")
line("メッセージ")
```
このように使用することができます
トークンの習得方法は、公式にのってるので見てきてください
deviseのユーザー機能をメールアドレスなしで登録するようにカスタマイズ

名前とパスワードだけで新規登録もログインもできるようdeviseをカスタマイズして利用したときの備忘録。

Railsは6.0.2
同じ実装をされている方もいたけどバージョンによって実装が変わるみたいでコピペしてやってもうまくいかなかった...



```irb
  # <div class="field">
  #   <%= f.label :email %><br />
  #   <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  # </div>
  # ↑を↓に修正

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </div>
```


```ruby:config/initializers/devise.rb
# config.authentication_keys = [:email]
# config.case_insensitive_keys = [:email]
# config.strip_whitespace_keys = [:email]
# ↑を↓に（下から数えて二つは変えなくてもいいかも。一応一緒に変えとく。）
config.authentication_keys = [:name]
config.case_insensitive_keys = [:name]
config.strip_whitespace_keys = [:name]
```

```ruby:models/user.rb

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,
         :authentication_keys => [:name]　# 認証のキーをメールから名前へ

  validates_uniqueness_of :name
  validates_presence_of :name

  # nameを利用してログイン
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      where(conditions).where(["name = :value", { :value => name }]).first
    else
      where(conditions).first
    end
  end

  def email_required?
    false
  end

  def email_changed?
    false
  end
end
```

```ruby:application_controller
　# 以下追記
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name] )
  end
```

完成。


## ①上記変更したのにまだundefined method `email'のエラーが出る場合

```
undefined method `email' 　 
match ? attribute_missing(match, *args, &block) : super
```
ってエラーに悩まされてる場合、
自分が触っているviewが反映されていない可能性が。
deviseのビューを作成するときに

```
rails g devise:views users
```
で作っていたら、deviseはデフォルトだとapp/views/deviseのviewを探しにいってしまうので、 

```ruby:config/initializers/devise.rb
config.scoped_views = true
```
とする必要あり。
（そもそもadminとか他のユーザー機能つけないならrails g devise:viewsで作ったほうがいいかも。
削除して作り直したい場合は→rails destroy devise:views users）



## ②新規登録しようとするとUndefined method will_save_change_to_email?エラー

以下の記載を付け足す。

```ruby:models/user.rb
 def will_save_change_to_email?
   false
 end
```


参考記事
https://qiita.com/jagrament/items/f172b88861ac477621d1
https://github.com/heartcombo/devise#starting-with-rails
Squidリバースプロキシ構築

#はじめに
ここではSquidでリバースプロキシをやる簡単なやりかたを紹介したいと思います。

#環境
[VirtualBox](https://www.virtualbox.org/)
[Vagrant](https://www.vagrantup.com/)
[Cent0S7](https://www.centos.org/download/)
[Apache](https://httpd.apache.org/)

[こちら](https://qiita.com/I_S-657/items/63528d09995138c9e46d)で構築の紹介をさせていただいてます参考にどうぞ


#手順
まずは役割の構成から
すでにサーバは構築している前提で。。。

| IP | port | role |
|:-----------|------------:|:------------:|
| 192.168.33.10     | 8080        | proxy(squid)         |
| 192.168.33.20     | 80      | webserver(httpd)   |


まずは

```
$ sudo yum -y install squid
```
つづいて編集（追記）

```
http_port 192.168.33.10:8080 accel defaultsite=192.168.33.20
cache_peer 192.168.33.20 parent 80 0 no-query originserver
```

```
$ systemctl start squid
```

プロキシサーバにアクセスしwebサーバのページが見れたら成功です

#まとめ
いかがだったでしょうか動作確認レベルのシンプルなものですが。。。次回はnginxでの構築とか紹介できればいいなぁ。。。
RstudioとShinyを使ったグラフと相関係数Webアプリ(パラメータ選択)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">パラメータを加味した相関係数Shiny <br>YoutubeでGUI操作をあげました。コードはQiitaに記載してます<a href="https://t.co/sapcNWa4Vv">https://t.co/sapcNWa4Vv</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; ZEO (@ZENOOcom) <a href="https://twitter.com/ZENOOcom/status/1252792898833100801?ref_src=twsrc%5Etfw">April 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

```
library(shiny)
df<-read.csv('1.csv',header=TRUE,fileEncoding = "UTF-8-BOM")
ui<-fluidPage(    
  
  titlePanel("Telephones by region"),
  
  sidebarLayout(      
    
    sidebarPanel(
      selectInput("region1", "X:", 
                  choices=colnames(df)),
      selectInput("region2", "Y:", 
                  choices=colnames(df)),
      checkboxGroupInput("well","WellID:",
                         choices=df[,2])),
    
    mainPanel(
      plotOutput("phonePlot"),
      verbatimTextOutput("comand"),
      verbatimTextOutput("comand1"),
      verbatimTextOutput("comand2")
    )
  )
)

server<-function(input, output) {
  
  output$phonePlot <- renderPlot({
    
    plot(df[input$well,input$region1], df[input$well,input$region2],
         main=input$region,
         ylab="Y",
         xlab="X")
  })
  output$comand<-renderPrint(cor(df[input$well,input$region1], df[input$well,input$region2]))
  output$comand1<-renderPrint(cor.test(df[input$well,input$region1], df[input$well,input$region2]))
  output$comand2<-renderPrint(summary(lm(df[input$well,input$region1]~df[input$well,input$region2])))
}
shinyApp(ui = ui, server = server)
```
マインクラフトコマンド紹介　#4

#始めに
![2020-04-22_11.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615707/e75c79b2-76c9-a59a-687c-5c4ccb5ac3e3.png)
マインクラフターのムー＃です！今日のコマンドは前回と同じように、簡単に組めるコマンドです！初心者の方も簡単にできると思います。

##今日のコマンド
今日のコマンドはRPGの中で出てくる「**賢者の石**」をマイクラで再現しました
実際に使ってみると…
![2020-04-22_11.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615707/70fcfe61-6dc2-9d23-58af-f7c282433a18.png)
![2020-04-22_11.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615707/dd7820c8-f4ca-e23d-9fb8-c7fc81bbede8.png)
![2020-04-20_12.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615707/e90f0b2a-9a29-9f37-707e-956c1496ced2.png)
この様にダメージを受けた状態でSHIFTキーでしゃがむと体力が超回復するアイテムです！

###コマンド解説

今日のコマンドは前回よりも少ない５つのコマンドで全体を動かしています![2020-04-22_11.30.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615707/ca4e4463-1df5-314d-3854-37f16cdb358f.png)

テキストで入力するコマンド
・/scoreboard objectives add qat dummy
・/scoreboard objectives add shift minecraft.custom:minecraft.sneak_time
・/give @p minecraft:quartz{display:{Name:'{"text":"賢者の石"}'},ItemName:qat} 1

コマンドブロックに入力するコマンド
１．execute as @a[scores={shift=40..,qat=1}] at @s run summon minecraft:area_effect_cloud ~ ~1 ~ {Particle:"end_rod",Radius:2f,Duration:10,Effects:[{Id:10b,Amplifier:10b,Duration:30,ShowParticles:0b}]}

２．execute as @p[scores={shift=40..}] at @s run playsound minecraft:entity.arrow.hit_player master @p[scores={shift=1..qat=1}] ~ ~ ~ 100 2

３．scoreboard players set @a[scores={qat=1}] qat 0

４．scoreboard players set @a[scores={shift=40..}] shift 0

５．execute as @a[nbt={SelectedItem:{tag:{ItemName:qat}}}] run scoreboard players set @s qat 1

####最後に
いかがだったでしょうか今日のコマンド自分的にはかなりいい感じのバランスに仕上がったので皆さんぜひ使ってみてください！それでは
Pelion Device Managementを使う【ウェブアプリ編】

:::note info
注意
Pelion社のDevice Managementサービスは、IZUMA NETWORKSに買収されました。
https://www.izumanetworks.com/press/releases/10-4-22/

この記事は、旧Pelion Device Managementサービス上でのみ動作確認を行った時の内容なので、現在のサービスでは動作しない可能性があります。ご了承ください。
:::
この記事では、ウェブアプリからPelion Device Managementサービスを使用する方法を説明します。接続されたデバイスの管理や、デバイス上のセンサーからデータを取得することが出来ます。

Pelion Device Management については、以下の記事もご覧ください。

Pelion Device Management を使う【導入編】
 https://qiita.com/toyowata/items/5a9b1427399aff17d501

## Pelion Device Management REST API
Pelion Device Management は、各種外部サービスやアプリケーションとREST APIを通じて柔軟に接続できるインターフェースを提供しています。
提供するデバイス接続サービス、ファクトリープロビジョニングサービス、ファームウェアアップデートサービスは全てREST APIを通じて使用することが可能です。

https://www.pelion.com/docs/device-management/current/service-api-references/index.html

## REST API の使用例
REST API は、cURL コマンドで簡単に動作を確認することができます。ここでは、入力を簡略化するために環境変数に必要な情報を設定して試してみます。
APIキーの生成方法は、[こちら](https://qiita.com/toyowata/items/5a9b1427399aff17d501#api%E3%82%AD%E3%83%BC%E3%81%AE%E7%94%9F%E6%88%90)を参照してください。

```shell
$ export MY_API_KEY="Authorization: Bearer ak_xxxxxxxxxxxxxx” # 自分のアカウントのAPIキー
```

デバイスのリスト表示

```shell
$ curl https://api.us-east-1.mbedcloud.com/v3/devices/ -H "${MY_API_KEY}"  | python -m json.tool
```

登録されているデバイスの表示

```shell
$ curl https://api.us-east-1.mbedcloud.com/v3/devices?filter=state__eq=registered -H "${MY_API_KEY}" | python -m json.tool
```

各種統計情報の表示例

```shell
$ curl -X GET -H "${MY_API_KEY}" "https://api.us-east-1.mbedcloud.com/v3/metrics?include=transactions,total_count&start=20180301&end=20180405&interval=1d" | python -m json.tool
```

この様にコマンドラインから簡単にデバイス情報を取得できるAPIが用意されています。

## さらにインタラクティブにAPI動作を確認する

上記の例では、単一のHTTPリクエストを使ってレスポンスから情報を得るだけですが、実際にはNotificationチャネルを張って、デバイスからのレスポンスを非同期で受け取るAPIが多く使用されます。
ウェブブラウザ上からこれらのService APIを使って、Pelion Device Managementサービスに接続されたデバイスのリソースにアクセスしたり、デバイスを管理機能を確認することが出来ます。
以下のページでService APIの動作を確認することができます。
https://toyowata.github.io/Pelion-device-e2e-example/

<img width="1301" alt="web-app" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75582/49588c66-2152-a2d6-d7de-610fafabc129.png">

このページのソースコードは、こちらです。
https://github.com/toyowata/Pelion-device-e2e-example/tree/gh-pages

## ウェブアプリのサンプルコード

Service APIを使用したウェブアプリのサンプルも用意されています。このウェブアプリでは、デバイスの一覧表示と各種情報、センサーからのデータをグラフ化して表示しています。

https://pelion-quick-start-web-app.herokuapp.com/

【データ表示の例】
<img width="1352" alt="Screen Shot 2020-04-22 at 11.40.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75582/8b75d761-dcbd-559a-b45b-a3cf7058c0e3.png">


このページのソースコードは、こちらです。
https://github.com/ARMmbed/pelion-quick-start-web-app

以上です。

## その他の情報

Pelion Device Managementを使う【導入編】
https://qiita.com/toyowata/items/5a9b1427399aff17d501
Mac Nodebrewを用いてNode.jsをインストールした時にバージョン有効化時にエラーが出た話

# 目的

- インストール後のバージョン有効化時にエラーが出た話を簡易的にまとめる

# 事前作業

- 下記の方法と同様の作業を行った。
    - [Mac HomebrewでNode.jsをインストールする](https://qiita.com/miriwo/items/73d1546220f1c091a7d5)

# エラー内容

- 最新の安定版をインストール後に下記コマンドを実行したところエラーが発生した。

    ```terminal
    $ nodebrew use vX.X.X 
    ```
- エラー

    ```
    vX.X.X is not installed
    ```

# 解決方法

`$ nodebrew --version`の出力の中の「# install」に記載されている`$ nodebrew install vX.X.X`を再度実行した。

再度`$ nodebrew use vX.X.X`を実行したところ正常にバージョンを有効化することに成功した。