OmniAICreator/Qiita-1.07M huggingface dataset:
多言語FizzBuzzチャレンジ24日目:COBOL

## これまでのまとめ
https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

https://qiita.com/tenteko/private/ca9813f0982370d0c901

https://qiita.com/tenteko/private/bc808ba59f6993019045

https://qiita.com/tenteko/private/74aa4c422196cb5cdeac

https://qiita.com/tenteko/private/ea22bd19360333f9ca85

https://qiita.com/tenteko/private/ec2f7c2f99229a55a7aa

https://qiita.com/tenteko/private/237556777f5c5546af6e

https://qiita.com/tenteko/private/264e4aca8a2ee6761a6c

https://qiita.com/tenteko/private/6e86fa0eeed9d24805ab

https://qiita.com/tenteko/private/f32baaf43fe0217b7fc7

https://qiita.com/tenteko/private/b44e1e5bfc91f6f3a52f

https://qiita.com/tenteko/private/333b9697c03561fb6158

https://qiita.com/tenteko/private/667f5f69eda60f221912

https://qiita.com/tenteko/private/eff296000ecbc7b43f07

https://qiita.com/tenteko/private/f5ea89c185b14a5952f3

https://qiita.com/tenteko/private/64a5814d35f73972bde9

https://qiita.com/tenteko/private/7981389372c7f6bdc073

https://qiita.com/tenteko/private/f6814b2e192e23298da8

https://qiita.com/tenteko/private/e3e498be93b847139a7d

https://qiita.com/tenteko/private/70f6a6588bc72acf27cf

https://qiita.com/tenteko/private/0d384ab42091434edb88

https://qiita.com/tenteko/private/a6ef98f964083d96e443

https://qiita.com/tenteko/private/650093e823bb993f77a6

## 本日のお品書き
ついに、ついに来ましたCOBOL。(いまさらですがFORTRANとかをやってもよかったですねぇ…）

## FizzBuzz
- ドキュメントを探すところから辛かった…。新しくCOBOLの門を叩く人はどこから学んだら良いのだ…。
- Qiitaさん、コードエリアCOBOL非対応じゃないですかーやだー！

```cobol
       IDENTIFICATION DIVISION.
       PROGRAM-ID. FIZZBUZZ.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 CNT PICTURE 9(3) VALUE 0.
       01 PCNT PICTURE Z(2)9 VALUE 0.
       01 FIZZ PICTURE 9(01) VALUE 0.
       01 BUZZ PICTURE 0(01) VALUE 0.
       PROCEDURE DIVISION.
           PERFORM 100 TIMES
               ADD 1 TO CNT
               COMPUTE FIZZ = FUNCTION MOD(CNT 3)
               COMPUTE BUZZ = FUNCTION MOD(CNT 5)
               IF FIZZ = 0 AND BUZZ = 0 THEN
                   DISPLAY "FizzBuzz"
               ELSE IF FIZZ = 0 THEN
                   DISPLAY "Fizz"
               ELSE IF BUZZ = 0 then
                   DISPLAY "Buzz"
               ELSE
      * 3桁未満の場合に0埋めせずに表示したい
      * Z(2)9型に詰め替えると0埋めをスペースに変えてくれる
      * TRIMを使ってスペースを除去
                   MOVE CNT TO PCNT
                   DISPLAY FUNCTION TRIM(PCNT)
               END-IF
           END-PERFORM.
           STOP RUN.
```

- 書いてあること自体はぱっとわかりますね。シンプルな記法です。
- 1~6カラムが一連番号領域、7カラムが標識領域、8~11カラムがA領域、12~72カラムがB領域
    - 一連番号(000100など)は省略した
    - 標識領域はコメントなどを表す部分。*によってコメントを記入した。
- 3の倍数でも5の倍数でも無い時に数字を表示させたいが、何も工夫しないと「001」のように0埋めされてしまう。そのため値が無いときは空白になるZ型を使い、変数を入れ替えている。最後に空白を`TRIM`関数によって除去している。

## おまけ：実行方法
```shell
sudo apt-get gnucobol
# edit fizzbuzz.cob
cobc -x fizzbuzz.cob && ./fizzbuzz
```
paiza.ioでelixir その62

# 概要
paiza.ioでelixirやってみた。
Process使ってみた。

# サンプルコード

```

Process.put(:comments, ["comment", "other comment"])
Process.delete(:comments)
|> IO.inspect
Process.delete(:comments)
|> IO.inspect

pid = spawn(fn -> 
	1 + 2 
end)
Process.exit(pid, :kill)
|> IO.inspect

Process.get(:locale, "pt")
|> IO.inspect
Process.put(:locale, "fr")
|> IO.inspect
Process.get(:locale, "pt")
|> IO.inspect

:locale in Process.get_keys()
|> IO.inspect
Process.put(:locale, "pt")
|> IO.inspect
:locale in Process.get_keys()
|> IO.inspect

Process.group_leader()
|> IO.inspect

Process.list()
|> IO.inspect

pid = spawn(fn -> 
	1 + 2 
end)
|> IO.inspect
Process.monitor(pid)
|> IO.inspect
Process.exit(pid, :kill)
|> IO.inspect
receive do
	msg -> msg
end
|> IO.inspect

Process.put(:locale, "en")
|> IO.inspect
Process.put(:locale, "fr")
|> IO.inspect

Process.register(self(), :test)
|> IO.inspect
send(:test, :hello)
|> IO.inspect

#Process.register(self(), :test)
#|> IO.inspect
Process.registered()
|> IO.inspect

Process.send({:name, :node_that_does_not_exist}, :hi, [:noconnect])
|> IO.inspect

timer_ref = Process.send_after(pid, :hi, 100)
|> IO.inspect

Process.spawn(fn -> 
	1 + 2 
end, [:monitor])
|> IO.inspect
Process.spawn(fn -> 
	1 + 2 
end, [:link])
|> IO.inspect

#Process.register(self(), :test)
#|> IO.inspect
Process.unregister(:test)
|> IO.inspect

Process.register(self(), :test)
|> IO.inspect
Process.whereis(:test)
|> IO.inspect


```

# 実行結果

```
["comment", "other comment"]
nil
true
"pt"
nil
"fr"
true
"fr"
true
#PID<0.62.0>
[#PID<0.0.0>, #PID<0.1.0>, #PID<0.2.0>, #PID<0.3.0>, #PID<0.4.0>, #PID<0.5.0>,
 #PID<0.6.0>, #PID<0.8.0>, #PID<0.9.0>, #PID<0.41.0>, #PID<0.43.0>,
 #PID<0.45.0>, #PID<0.46.0>, #PID<0.48.0>, #PID<0.49.0>, #PID<0.50.0>,
 #PID<0.52.0>, #PID<0.53.0>, #PID<0.54.0>, #PID<0.55.0>, #PID<0.56.0>,
 #PID<0.57.0>, #PID<0.58.0>, #PID<0.59.0>, #PID<0.60.0>, #PID<0.61.0>,
 #PID<0.62.0>, #PID<0.63.0>, #PID<0.64.0>, #PID<0.65.0>, #PID<0.66.0>,
 #PID<0.67.0>, #PID<0.68.0>, #PID<0.77.0>, #PID<0.78.0>, #PID<0.79.0>,
 #PID<0.80.0>, #PID<0.81.0>, #PID<0.83.0>, #PID<0.84.0>, #PID<0.85.0>,
 #PID<0.86.0>, #PID<0.87.0>, #PID<0.88.0>, #PID<0.89.0>, #PID<0.92.0>,
 #PID<0.93.0>]
#PID<0.96.0>
#Reference<0.665306083.2005925890.40514>
true
{:DOWN, #Reference<0.665306083.2005925890.40514>, :process, #PID<0.96.0>,
 :noproc}
"pt"
"en"
true
:hello
[:code_server, :file_server_2, :erts_code_purger, :kernel_safe_sup,
 :application_controller, :erl_signal_server, :kernel_refc, :standard_error_sup,
 Logger, :inet_db, Logger.Supervisor, :test, :logger_sup, :logger,
 :logger_proxy, :user, :standard_error, :logger_handler_watcher, :global_group,
 :elixir_sup, :elixir_config, :rex, Logger.BackendSupervisor, :kernel_sup,
 :erl_prim_loader, :global_name_server, :init, :elixir_code_server]
:noconnect
#Reference<0.665306083.2005925890.40529>
{#PID<0.97.0>, #Reference<0.665306083.2005925890.40531>}
#PID<0.98.0>
true
true
#PID<0.92.0>
×
```

# 成果物

https://paiza.io/projects/mFvAi2KIyJTjbAC1Lp2uxQ?language=elixir


以上。
[AntDesign][Next.js] モーダル＋フォームでOKボタンの後にフォームの値を関数に渡す


# やりたいこと
Next.js + antDesignで
モーダル内に入力フォームを作り、モーダルのOKボタンを押したら
モーダル内のフォームの値をhandleDoSomething関数に渡して実行する。

`useForm`を使ったやり方を正しくリファクタリングしてもらった時のメモ。

`<Form form={form} onFinish={handleFinish}>`と
`form.submit`の組み合わせで実装できる。

# コード

Before
```react
const [form] = Form.useForm()
const handleDoSomethingModal = (id: string) => {
    Modal.confirm({
      title: "本当に〇〇しますか？",
      icon: <ExclamationCircleOutlined />,
      onOk: () => handleDoSomething(id, form.getFieldValue("reason")),
      onCancel: () => form.resetFields(),
      content:
        <Form form={form}>
          <Form.Item name="reason">
            <Input.TextArea rows={4} placeholder="理由" />
          </Form.Item>
        </Form>
    })
  }
```
After
```react
const [form] = Form.useForm()
const handleDoSomethingModal = (id: string) => {
    const handleFinish = (value: any) => {
      handleDoSomething(id, value.reason)
    }

    Modal.confirm({
      title: "本当に〇〇しますか？",
      icon: <ExclamationCircleOutlined />,
      onOk: () => form.submit(),
      onCancel: () => form.resetFields(),
      content:
        <Form form={form} onFinish={handleFinish}>
          <Form.Item name="reason">
            <Input.TextArea rows={4} placeholder="理由" />
          </Form.Item>
        </Form>
    })
  }
```
PowerAutomate でms Graph APIのアクセストークンを取得し、excelを操作する

# アクセストークン取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/9663c3ba-b641-cd45-4c3b-f2a5920ca7cb.png)

# sharepoint上のexcelファイルを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/aea41843-5473-a65a-b3d6-d9e7bcc61c88.png)
# excelを操作
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/4303657e-e026-af1d-abbe-f6b555f53da3.png)
mapbox:右クリックした場所の住所を得る

mapbox の [Reverse geocoding](https://docs.mapbox.com/api/search/geocoding/) を使用すると、緯度経度から住所を得ることができます。

```
map.on('contextmenu', (e) => {
    //let uri = `https://nominatim.openstreetmap.org/reverse?format=json&zoom=18&lat=${e.lngLat.lat}&lon=${e.lngLat.lng}`;
    let uri = `https://api.mapbox.com/geocoding/v5/mapbox.places/${e.lngLat.lng},${e.lngLat.lat}.json?language=ja&access_token=${mapboxgl.accessToken}`;

    fetchData(uri).then(function(response){ return response.text().then(function(jsonStr){
        var data = JSON.parse(jsonStr);
        //var context = data.display_name +`<br>`;
        var context = data.features[0].place_name +`<br>`;
        clearPopup();
        new mapboxgl.Popup().setLngLat(e.lngLat).setHTML(context).addTo(map);
    });}).catch(err => { console.log(err); })
});

async function fetchData(_uri) {
    const res = await fetch(_uri);
    const data = await res;
    return data;
}

const clearPopup=function(){
    const popups = document.getElementsByClassName("mapboxgl-popup");
    if (popups.length) {
        popups[0].remove();
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/f1641703-6ff8-2e48-b99e-a62b028d79fb.png)
jq tips

# json の任意の階層の特定キーの値を取り出す

* [jqでJSONの深い階層を気にせずにアクセスする - grep Tips *](https://www.greptips.com/posts/1309/)

```bash
$ cat sample.json
{
  "level1key":{
    "level2key":{
      "level3key":{
        "level4key":"level4value"
      }
    }
  }
}

$ jq "..|.level4key?|select(.!=null)" sample.json
"level4value"
```

# 特定のキー名を持つ要素を取り出す

* [json - jq: filter input based on if key ends with specified string - Stack Overflow](https://stackoverflow.com/questions/48904371/jq-filter-input-based-on-if-key-ends-with-specified-string)
* [json - jq - return array value if its length is not null - Stack Overflow](https://stackoverflow.com/questions/71476198/jq-return-array-value-if-its-length-is-not-null)

上の記事を参考に

1階層下で "/" で始まるキー名を持つ要素について、xxx のキー名で配列の中身がない要素を抽出する。

```
jq 'to_entries[]|select(.key|startswith("/"))|.value.xxxx|select(length == 0)' sample.json
# 配列の中身がないもののkeyを出す
jq 'to_entries[]|select(.key|startswith("/"))|if (.value.xxxx|select(length==0)) then .key else empty end
```

`if 条件 then A else B end` の注意点は、上記だと `()` が必要だった。else 節が必要だった。

# ダブルクオートなしでCSV出力したい

単に csv で出力したいなら `|@CSV` でできるが、ダブルクォーテーションが余計。`-r` を指定しても残る。ダブルクォーテーションなしで出力するには文字列結合で実現する。デリミタの文字列を変えれば Markdown の表の中間出力にも利用できる。

以下のデータを入力する場合

```json
{
  "key1": [
      {
         "key2": "value2",
         "key3": {
             "key4": "value4"
         },
         "key5": "value5"
      },
      ...
  ]
}
```

以下のコマンドで、カンマ区切りの一覧を取得できる。

```
jq -r '.key1[] | [.key2, .key3.key4, .key5] | join(",")' input.json
```

出力

```json
value2,value4,value5
```
NextAuth.jsのセッション取得はどこからのリクエストかに注意

NextAuth.jsはNext.jsのアプリケーションに認証機能を簡単につけられるオープンソースのパッケージです。

https://next-auth.js.org/

Next.jsのプロジェクトでテストコードを書いていて、セッション判定のところでハマったので、書き残しておきます。

## 問題の箇所

PlayWrightのテストコードを書いていて、Next.jsアプリケーションのAPIルートへfetchするコードを書きました。

そのfetch先のコード内では認証済みユーザーかどうかを判定するコードを書いていました。

テスト実行時のブラウザでもログインを行っていたので、認証できているはずなのです。でも何度やってもそのAPIを叩くところで認証がなくてうまくいかなかったのです。

## セッション判定について
NextAuth.jsでは現在認証済みかどうかをsessionを取得することで判定できます。

ただし、注意が必要なのはクライアントサイドとサーバーサイドでやり方が異なる点です（NextAuth.jsに限らずNext.jsアプリケーションでは大抵異なるとは思いますが）。

クライアントサイド
```react
const { data: session } = useSession()
```
サーバーサイド
```react
const session = await getSession()
```

今回のケースではAPIとして書いていたので、サーバーサイド用の getSession を使っていました。

参考:
- https://next-auth.js.org/getting-started/client
- https://qiita.com/kage1020/items/e5b0053d7046a9b1f628

## getSessionは非推奨？

うまくセッションが取得できなかったので、調べてみました。そうするとgetSessionは現在は非推奨というのを見つけました。

代わりに `unstable_getServerSession` を使うようです。

:::note warn
ただし接頭辞に `unstable` がついているように、これは将来のバージョンで変更になる可能性があります。
:::

```react
const session = await unstable_getServerSession(context.req, context.res, authOptions)
```

ただ、unstableなので、まだgetSessionでもいいとは思います。

この `unstable_getServerSession` でやってみましたが、これでもうまくいきませんでした。

さらにテストではなく、通常の開発サーバを立ち上げて色々触っている中では、getSessionはうまく機能していることが確認できました。

なので今回に関しては `getSession` に問題があるわけではなかったです。

## requestの凡ミス

結局原因はなんだったかというと、getSessionへ渡す引数 req に問題があったわけです。
```react
const session = await getSession({ req });
```

よくよく考えれば当たり前ですが、現在のセッションを取得するためにreqを見ています。つまり、HTTPリクエストがどこから飛んでくるかが重要になります。

Next.jsのアプリケーション内の、クライアントサイドコードでfetchを書いていれば、（その時のページで認証済みであれば）認証済みの状態でリクエストすることになります。これならうまくいきます。

今回の場合は、テストコードで直接APIを叩いていたため、reqが認証済みのものではなかったということです。その結果、そもそもそのリクエストオブジェクトにはセッションがないのでないものは取れないからうまくいかなかったのです

以上、考えれば当たり前な凡ミスでした。

調べる中で、NextAuth.jsについても少し詳しくなれてよかったです。

（NextAuth.jsは出てきませんが）[Next.js x TypeScript のコース](https://www.takux.one/#notion-next-blog)出したりもしてます。
Arduino UNOのI2Cを使い、AQM0802A液晶で文字表示(簡易版)


x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!

目的
I2C液晶のテスト


![o_cop236.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/96f27b2f-f8d2-cbc7-3153-f76961599915.jpeg)


![o_cop235.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/51c9f385-8615-4623-c622-bda3200d07f5.jpeg)




```c++



//AQM0802A_DEMO1

#include <Wire.h> //I2C library

//i2cバッファー
char data_read[4];

//初期レジスター
char INIT_com[] = {
  0x0, 0x38, //1
  0x0, 0x39, //2
  0x0, 0x4,  //3
  0x0, 0x14, //4
  0x0, 0x70, //5
  0x0, 0x56, //6
  0x0, 0x6C, //7
  0x0, 0x38, //8
  0x0, 0xC   //9
};

//画面のクリアレジスター
char INIT_cls[] = {0x0, 0x1};


//i2c書き込みルーチン
void i2c_lcd_w(char *buff1) {
  Wire.beginTransmission(0x3E);
  Wire.write(buff1[0]);
  Wire.write(buff1[1]);
  Wire.endTransmission();
  delay(2);
}//i2c_lcd_w


void ns_putc(char ch)
{

  data_read[0] = '@';
  data_read[1] = ch;

  //I2Cに送信
  i2c_lcd_w(data_read);

}//ns_putc


void ns_puts(const char *str1)
{

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    ns_putc(*str1 ++);

  }//while

}//ns_puts


//カーソルの移動
void setCursor(int col, int rows)
{

  data_read[0] = 0x0;
  data_read[1] = 0x80 +  (rows * 0x40) + col ; //カーソルを移動

  //I2Cに送信
  i2c_lcd_w(data_read);

}//setCursor


//初期化関数
void setup()
{

  //I2Cの初期化
  Wire.begin();

  //液晶の初期化
  for (int ii = 0; ii < 9; ii++) {
    i2c_lcd_w(&INIT_com[ii << 1]);  // ii << 1 = ii * 2
  }//for

  //画面のクリア
  i2c_lcd_w(INIT_cls);

  //表示
  setCursor(0, 0); ns_puts("HELLO");
  setCursor(0, 1); ns_puts("WORLD");

}//setup


//メインループ
void loop()
{}//loop




```

コメントなし　まだ、試していない(12/5) (12/6動作確認済み)


```c++



#include <Wire.h>

char data_read[4];

char INIT_com[] = {
  0x0, 0x38,
  0x0, 0x39,
  0x0, 0x4,
  0x0, 0x14,
  0x0, 0x70,
  0x0, 0x56,
  0x0, 0x6C,
  0x0, 0x38,
  0x0, 0xC
};

char INIT_cls[] = {0x0, 0x1};

void i2c_lcd_w(char *buff1)
{
  Wire.beginTransmission(0x3E);
  Wire.write(buff1[0]);
  Wire.write(buff1[1]);
  Wire.endTransmission();
  delay(2);
}

void ns_putc(char ch)
{
  data_read[0] = '@';
  data_read[1] = ch;
  i2c_lcd_w(data_read);
}

void ns_puts(const char *str1)
{
  while (*str1) {
    ns_putc(*str1 ++);
  }
}

void setCursor(int col, int rows)
{
  data_read[0] = 0x0;
  data_read[1] = 0x80 + (rows * 0x40) + col;
  i2c_lcd_w(data_read);
}

void setup()
{
  Wire.begin();
  for (int ii = 0; ii < 9; ii++) {
    i2c_lcd_w(&INIT_com[ii << 1]);
  }
  i2c_lcd_w(INIT_cls);
  setCursor(0, 0); ns_puts("HELLO");
  setCursor(0, 1); ns_puts("WORLD");
}

void loop()
{}





```
macでg++コンパイル時Assertion failedが出たらXcodeのアップグレードorダウングレード

# 問題

macでg++を利用していて、OSのバージョンを12に変更した後以下のようなエラーが出ることがありました。(追記:2023/10/30 Xcodeのバージョンアップで度々似たようなエラーが起こるのでxcode-selectのダウングレード方法を追加)
```
$  g++ -std=c++17 -Wall -Wextra -I .  code.cpp -o a.out
0  0x1029c41a0  __assert_rtn + 140
1  0x10284ba8c  mach_o::relocatable::Parser<arm64>::parse(mach_o::relocatable::ParserOptions const&) + 4536
2  0x10281dd38  mach_o::relocatable::Parser<arm64>::parse(unsigned char const*, unsigned long long, char const*, long, ld::File::Ordinal, mach_o::relocatable::ParserOptions const&) + 148
3  0x1028864ac  ld::tool::InputFiles::makeFile(Options::FileInfo const&, bool) + 1468
4  0x102889360  ___ZN2ld4tool10InputFilesC2ER7Options_block_invoke + 56
5  0x1b8dc01f4  _dispatch_client_callout2 + 20
6  0x1b8dd4f8c  _dispatch_apply_invoke_and_wait + 224
7  0x1b8dd426c  _dispatch_apply_with_attr_f + 1152
8  0x1b8dd447c  dispatch_apply + 108
9  0x1028891f4  ld::tool::InputFiles::InputFiles(Options&) + 616
10  0x10280b6c0  main + 552
A linker snapshot was created at:
        /tmp/a.out-2022-11-10-221006.ld-snapshot
ld: Assertion failed: (_file->_atomsArrayCount == computedAtomCount && "more atoms allocated than expected"), function parse, file macho_relocatable_file.cpp, line 2061.
collect2: error: ld returned 1 exit status
```
エラーが出るコード(例)
```c++:code.cpp
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main(){
  int n; cin >> n;
  map<int,vector<int>> mp;
  rep(i,n){
    mp[i].push_back(i);
  }
  for(auto &p:mp){
    for(auto &q:p.second){
      cout << q << endl;
    }
  }
}
```

# 環境
__macOS Monterey  12.6.0__
__xcode-select 14.0.0.0.1.1661618636__

# 注意事項
ここではXcodeをインストールしておらず、xcode-selectのみをインストールしていることを想定しています。

# xcode-selectのアップグレードで解決
xcode-selectのアップデートが来ている場合はmacのシステム設定からアップデートを試してみましょう。

# xcode-selectのダウングレードで解決
xcode-selectを削除した後公式サイトからバージョンを指定してインストールします。

xcode-selectのパスの確認(参考 https://srcw.net/archives/794/)
```
xcode-select -p

# 単体のCommand Line Toolsの場合
/Library/Developer/CommandLineTools

# Xcodeの場合
/Applications/Xcode.app/Contents/Developer
```

xcode-selectの削除
```
# 単体のCommand Line Toolsの場合
sudo rm -rf /Library/Developer/CommandLineTools

# Xcodeの場合
sudo rm -rf /Applications/Xcode.app/Contents/Developer

```

xcode-selectのバージョンを指定して再インストール
下のApple Developerからバージョンを指定してインストールしてください。

https://developer.apple.com/download/all/





# 参考

https://stackoverflow.com/questions/73714336/xcode-update-to-version-2395-ld-compile-problem-occurs-computedatomcount-m

https://zenn.dev/tsukatsuka1783/articles/xcode_update_downgrade

https://srcw.net/archives/794/
Omnistudio の計算手順とビジネス ルール エンジン

[Omnistudio Calculation Procedures vs Business Rules Engine](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JeayB)


何のは何なのかは理解できていませんが...

BRE は、最初は Vlocity の一部として開発された計算手順と計算行列を、コア上で書き直して拡張したものです。Calc Procedures と Calc Matrices は、Vlocity 管理のパッケージベースの製品をお持ちの一部のお客様によって引き続き使用されていますが、新規のお客様には販売されなくなりました。

 

BRE は、Calc Procedures の代わりとして Expression Sets を、Calc Matrixs の代わりとして Decision Matrixs を提供します。移行ツールがあります。BRE は、CP/CM にはない多くの機能も提供します。デシジョン テーブル (sObject に接続)、フローとの互換性 (および OmniStudio)、デシジョンの説明などです。 

 

新しいプロジェクトを開始する場合は、間違いなく BRE を使用する必要があります。
paiza.ioでelixir その61

# 概要
paiza.ioでelixirやってみた。
DateTime.now使ってみた。

# サンプルコード

```
defmodule Tsk0 do
	def tick(agent, interval \\ 50) do
		cast(agent)
		:timer.sleep(interval)
		tick(agent, interval)
	end
	def start(agent) do
		Agent.start(fn -> 
			[0] 
		end, name: agent)
	end
	def cast(agent) do
		Agent.update(agent, __MODULE__.succ())
		{:ok, datetime} = DateTime.now("Etc/UTC")
		IO.puts("task0 #{datetime}")
	end
	def get(agent) do
		Agent.get(agent, &(&1))
	end
	def succ() do
		fn(l) -> 
			[hd(l) + 1 | l] 
		end
	end
end
defmodule Tsk1 do
	def tick(agent, interval \\ 100) do
		cast(agent)
		:timer.sleep(interval)
		tick(agent, interval)
	end
	def start(agent) do
		Agent.start(fn -> 
			[0] 
		end, name: agent)
	end
	def cast(agent) do
		Agent.update(agent, __MODULE__.succ())
		{:ok, datetime} = DateTime.now("Etc/UTC")
		IO.puts("task1 #{datetime}")
	end
	def get(agent) do
		Agent.get(agent, &(&1))
	end
	def succ() do
		fn(l) -> 
			[hd(l) + 1 | l] 
		end
	end
end
defmodule Tsk2 do
	def tick(agent, interval \\ 200) do
		cast(agent)
		:timer.sleep(interval)
		tick(agent, interval)
	end
	def start(agent) do
		Agent.start(fn -> 
			[0] 
		end, name: agent)
	end
	def cast(agent) do
		Agent.update(agent, __MODULE__.succ())
		{:ok, datetime} = DateTime.now("Etc/UTC")
		IO.puts("task2 #{datetime}")
	end
	def get(agent) do
		Agent.get(agent, &(&1))
	end
	def succ() do
		fn(l) -> 
			[hd(l) + 1 | l] 
		end
	end
end

Tsk0.start(Foo) 
|> IO.inspect
Tsk1.start(Foo1) 
|> IO.inspect
Tsk2.start(Foo2) 
|> IO.inspect
Task.async(fn -> 
	Tsk0.tick(Foo) 
end) 
Task.async(fn -> 
	Tsk1.tick(Foo1) 
end) 
Task.async(fn -> 
	Tsk2.tick(Foo2) 
end) 
:timer.sleep(300)



```

# 実行結果

```
{:ok, #PID<0.101.0>}
{:ok, #PID<0.102.0>}
{:ok, #PID<0.103.0>}
task1 2022-11-10 22:17:31.029618Z
task0 2022-11-10 22:17:31.029618Z
task2 2022-11-10 22:17:31.029624Z
task0 2022-11-10 22:17:31.083142Z
task1 2022-11-10 22:17:31.133214Z
task0 2022-11-10 22:17:31.134161Z
task0 2022-11-10 22:17:31.185162Z
task2 2022-11-10 22:17:31.233134Z
task1 2022-11-10 22:17:31.234136Z
task0 2022-11-10 22:17:31.236105Z
task0 2022-11-10 22:17:31.287162Z
task1 2022-11-10 22:17:31.336007Z
task0 2022-11-10 22:17:31.339882Z
```

# 成果物

https://paiza.io/projects/su8CZmI96KwSuYAbkLac4w?language=elixir


以上。
gitの分岐したブランチの解決の仕方で起こるエラーについて

`warning: Pulling without specifying how to reconcile divergent branches is
discouraged.`ということで、`git pull`しようとすると下記エラーで起こられます。
```
Error: Unable to Checkout Branch & Pull Changes
```
分岐したブランチを調整する方法を指定する必要がありますとヒントをくれるので、それに従ってコマンドを打ち込めば解決します。
```
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.
```

- デフォルトのpullの挙動を維持し、実行時に`--rebase`を明示。
```
git config pull.rebase false
```
- 実行時`--rebase`の明示なしで `pull --rebase`
```
git config pull.rebase true
```
- 差分があれば`fast forward`する。
```
git config pull.ff only
```
※補足
- `git rebase とは、merge と同じく今いるブランチに別のブランチの内容を取り込むコマンド`

- `マージコミットが作られないず履歴が綺麗になるオプション　--rebase `
- `分岐後に、元ブランチに変更がないときに行われるマージが fast forward(早送り)`
paiza.ioでelixir その60

# 概要
paiza.ioでelixirやってみた。
timer.tc使ってみた。

# サンプルコード

```


:timer.tc(Process, :sleep, [1000])
|> IO.inspect


defmodule Takeuchi do
    def tarai(x, y, _) when x <= y do
        y
    end
    def tarai(x, y, z) do
        tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y))
    end
end

:timer.tc(Takeuchi, :tarai, [12, 6, 0])
|> IO.inspect



```

# 実行結果

```
{1000409, :ok}
{119057, 12}
```

# 成果物

https://paiza.io/projects/nD6liQMBLYBRflXT549Ptg


以上。
JANOG とは

## 勉強前イメージ

なんかの集まり的なやつ

## 調査

### JANOG とは 

日本語でジャノグと読み、Japan Network Operators' Groupの略になります。
NANOG(The North American Network Operators' Group) を参考にして発足したグループになります。
1997年から20年以上続いてるコミュニティでインターネットの技術的事項やオペレーションに関わる事項に関して議論・検討をして
日本の技術者や利用者に貢献することを目的としたグループになります。

JANOGではミーティングプログラムやハッカソンが開催されています。
ミーティングプログラムは最新技術の紹介や事業者の事例紹介など地方・都心部ともに開催されていました。
ハッカソンでは日々参加メンバーが課題に思っていることを事前のアイデアソンで募集してテーマを決めて話し合いを進めています。

## 勉強後イメージ

技術全般的な話をするグループって感じなのかな？
メーリスもあって自由に入れるみたい！

## 参考

- [JANOGとは](https://www.nic.ad.jp/ja/basics/terms/janog.html)
- [「JANOG」という技術コミュニティ活動への参加](https://www.nttpc.co.jp/technology/janog.html)
[JavaScript]異なるIDで同じ処理をまとめて書く方法

# はじめに
JavaScriptでIDは違うけれども同じ処理をまとめて書く方法がわからなかったのでここに解決法を書いておく


### 元のコード
```
function valueInput(box_id_num) {
    const box_input = document.getElementById(box_id_num).value
    console.log(box_input)
}

let boxSelect = document.getElementById('box_num0');
boxSelect.addEventListener('change', valueChange);

let boxSelect = document.getElementById('box_num1');
boxSelect.addEventListener('change', valueChange);

let boxSelect = document.getElementById('box_num2');
boxSelect.addEventListener('change', valueChange);

let boxSelect = document.getElementById('box_num3');
boxSelect.addEventListener('change', valueChange);

let boxSelect = document.getElementById('box_num4');
boxSelect.addEventListener('change', valueChange);
・
・
・
```

このような処理をまとめて書きたい


### 解決法
```
box_ids = []

for(var i=0;i<4;i++){
    var temp = "box_num" + i
    box_ids[i] = temp
}
```

このようにID名を配列に入れて

```
for(var i=0;i<box_ids.length;i++){
    let boxInput = document.getElementById(box_ids[i])
    boxInput.addEventListener('change', function(){
    console.log(this.value)
  });
}
```
このようにfor文で繰り返し処理を行うことによってまとめて書くことができる。
StaticとDynamic Linkingについて

今まで外部ライブラリやフレームワークを使って開発を行ってきたが、そんな中Static, Dynamic Linkingについての概念が出てきたため、ここにメモを残す。

# リンクとは？
- そもそもリンク（Linking）とは多様なコードの結びつけを行うことである。ここでいうリンクは、ライブラリやフレームワークをプロジェクトと結びつけることである。

# ライブラリとフレームワークの違い
- ライブラリとは？
    - RxSwiftなどの単純な外部ライブラリのこと
- フレームワークとは？
    - ライブラリより広義な意味であり、ライブラリの中に存在するいろんなリソースなどを含めてそれらを指す。（Info.plistなど）
    - Dynamic Framework → Dynamic Library
    - Static Framework → Static Library

# Static linkingとは？
- プログラムとライブラリやフレームワークを結びつける方法の一つである。
- そもそもStaticとは静的という意味である。日本語に訳すと静的に結びつけると言う意味。
- Static Linkingはライブラリやフレームワークを事前にビルドし、その時に必要な部分だけプログラム本体に埋め込む結びつけ方である。
    - 例えば、RxSwiftがライブラリとして必要となった際に、RxSwiftを事前にビルドし、あるファイル内で`.map`と`DisposeBag()`だけ必要ならばそれらの機能だけをそのファイルに埋め込んでくれる。

# Dynamic linkingとは？
- プログラムとライブラリやフレームワークを結びつける方法の一つである。
- そもそもDynamicとは動的と言う意味であり、日本語に訳すと動的に結びつけるという意味である。
- Dynamic LinkingはStatic Linkingとは違い、事前にビルドを行うのではなく、アプリをコンパイル時にプログラムに埋め込む結びつけ方である。

# メリット、デメリット
- Static LinkingもDynamic Linkingもただの結びつけ方であるが、それぞれの結びつけ方によってプロジェクトへの影響がある。

- Dynamic Linking
    - Dynamic Linkingの場合だと、フレームワークをプロジェクト外に置いておく必要がある。なぜなら、アプリ起動時に結びつけが起きるからだ。
    - そのため、アプリサイズが大きくなりがちである。

- Static Linking
    - Static Linkingの場合だと、必要なファイルに必要なことだけを結びつけることができる。（先ほどの`map`の例など）
    - そのため、結果的にアプリサイズが小さくなる。

# どうやって使い分けるか？
- StaticとDynamic Linkingの概念を把握した上でこれをどう使い分けるかが重要である。
    - それはターゲットによって決まってくる。
    - 具体例でいうと、あるアプリにおいてWatchOSのプロジェクトも必要だし、単純なiOSも必要だった場合に、Static Linkingを使って、フレームワークとの結びつけを行うか？それともDynamic Linkingを使うか？の選択がある。
    - この場合は、後者の方がアプリサイズが小さい。
    - なぜなら、仮にどちらのターゲットにもRxSwiftを導入していた場合に、Static Linkingで事前ビルドし、どちらのターゲットにもRxSwiftを結びつけるとすると、RxSwiftは2つのターゲットで使われているため、単純に2倍の結びつけが事前に必要となる。
    - しかし、Dynamic Linkingの場合だと、コンパイル時に動的に結びつけてくれるため、RxSwiftフレームワークひとつ置いておけば良いので、アプリサイズが結果的に小さくなる。

# Appleはどちらを推奨している？
- Appleとしては現在Static LinkingとDynamic Linkingを適切に使い分けることを推奨しているとのことだ。
    - 実は数年前まではStatic Linkingを推奨していたのだが、ここ数年でDynamic Linkingによって引き起こされていたアプリ起動にかかる時間の問題が大きく改善された。
    - 確かにアプリサイズ的には時としてDynamic Linkingの方が大きくなってしまう場合もあるが、その場その場に適した選択をしていくことをAppleは推奨している。
DMX Shield for Arduinoをリバースエンジニアリングしてみる

# 概要
ArduinoでDMXレコーダを作成したが、リセットシークエンスの設定で相性問題が発生してしまった。
そこで既製品のやり方を勉強した上で設計に反映したいと考え、DMX Shield for Arduinoを購入したのでリバースエンジニアリングしてみる。
既製品をそのまま使ってもいいのだが、UNOはUARTが1chしかなく書き込みのたびにジャンパピンを付け替えるのは不便であり、更にメモリが少なくてOLEDが使いづらいので最終的にはRP2040等でやりたい。

※詳細は個人サイトに移管しました。
https://cotechworks.ltt.jp/2022/11/20/post-460/
Docker Desktop startingが終わらないとき


1. Windowsキー＋Rで開いたウィンドウにtaskmgrと入力
2. タスクマネージャーでDocker Desktopを探しタスクの終了を選択する
3. Power Shellで以下コマンドを実行
3. もう一度Docker Desktopを開く
```
wsl.exe --shutdown
```
【ServiceNow】リクエストアイテムの変数もまとめて印刷・PDF化する方法

リクエストアイテムを印刷できないか？という要望があり、OOTBの便利な機能を見つけたのでご紹介します。

ちなみに、、
フォーム画面左上のハンバーガーボタンのメニューを使用するとPDF形式でエクスポートすることができますが、sc_req_itemテーブルに含まれない変数等の関連情報は印刷対象外となってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/868088ac-ca14-f332-5eec-1c1d23114476.png)

本記事ではsc_req_itemテーブル以外の情報も印刷対象とする別のメニューをご紹介します。

## 操作方法
画面右上のアイコンをクリック　＞　Printer friendly version をクリック　するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/ffec99c2-5f5d-8059-429c-a6b4aed50515.png)


## 動作確認
複数の変数を含むリクエストアイテムで操作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/3f3c19e3-3b88-208e-deb8-92ea877db4a7.png)


ブラウザの別タブに印刷用のビューが表示されました。
赤枠部分に変数とその入力値が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/cb03b03f-9d80-13e5-6c89-77373e716da3.png)

下にスクロールしてみると、Catalog TasksやApproverなどの関連リストに表示される内容も印刷対象となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/8fb3dbd7-7a2d-0334-0fcd-ed673e4bb5b8.png)


画面右側にあるClick to Printをクリックすることで印刷準備ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/a49ecc77-fc1a-dc21-9439-fa3dca8ca515.png)

## おわりに
申請データを証跡として印刷したりPDF化したりしたいという要望があり今回の機能を見つけました。

リクエストアイテム以外のフォーム画面で「Printer friendly version」を選択した際も、今回のように関連データも出力対象となっていました。
開発ユーザ以外でも気軽に活用できる便利機能だと思いますので是非ご活用ください。
悪用厳禁　VBAでExcelファイルを使用できないようにする

# はじめに
VBAを使うとExcelにおいて複雑な処理が楽になるそうです。
しかしながらプログラムの中には悪意のあるものも存在します。この記事では実行するとファイルを開くことが困難になるVBAを紹介します。

注意：利用された場合に生じる損害については一切の責任を負いません。

## VBAとは
Microsoft社のOfficeシリーズのソフトウェアの一部であるWordやExcel、Access、PowerPointなどで利用できる機能で、同社のプログラミング言語および実行環境であるVisual Basicの簡易版を用いてプログラムを作成することができる。これらのソフトウェアの動作の一部を変更したり、繰り返し行われる定型的な作業や複雑な処理を自動的に実行することができる。

VBA対応のアプリケーションには開発環境と実行環境の両方が組み込まれており、記述したプログラムは機械語への変換などの作業を行わなくてもその場で即座に実行することできる。作成したプログラムはファイルの一部としてデータと共に記録することができ、別のコンピュータでそのファイルを開けば同じように実行することができる。

引用：https://e-words.jp/w/VBA.html

# 何はともあれソースコード
```VBA.xlsm
Sub dangerous()
 Application.DisplayAlerts = False

 Dim wb As Workbook:Set wb = ThisWorkbook
 Dim pass As String:pass = WorkSheetFunction.RandBetween(1,99999)

 wb.SaveAs wb.FullName,,pass
 wb.Close

End Sub
```
Excelにてこれを実行すると、ファイルを開くことが非常に困難になります。具体的には5桁のランダムなパスワードが勝手に追加されます
# 解説
Sub dangerous()からEnd Sub内がプログラムの中身になる。dangerousの部分は何でもよい。
```
 Application.DisplayAlerts = False
```
警告無視して終わらせる命令。Falseが無視を示す。
```
 Dim wb As Workbook:Set wb = ThisWorkbook
```
ThisWorkbookはこのworkbook本体を指している。
```
 Dim pass As String:pass = WorkSheetFunction.RandBetween(1,99999)
```
このworkbookにパスワードをかける。パスワードは1~99999の間でランダムで作成される。
```
 wb.SaveAs wb.FullName,,pass
```
Excel本体に対する命令。上書き保存を指している。

# 実行してみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298143/a999fdab-d9e1-4813-9b9b-be35e3d566ce.png)
強制的にExcelが終了し、再起動すると上記のような画面になるはずです。パスワードはもちろん不明です。

# 解決方法
別のExcelを起動しパスワードがかかったファイルを選択。1~99999までのパスワードを入力し続けるプログラムを作成することで解決出来ます。下記に解決方法の動画のリンクがあります。

# 終わりに
VBAは正しく使うと非常に便利ですが、以上のように悪用されることも多々あります。
悪用はやめましょう！

参考資料：https://youtu.be/gk2hSZ1Eb6I
DataGridView からdatarowを取得してRowstateを参照する方法

グリッドのDataSourceをCastしてDataTableにしてRowごとに取り出して内容を参照する。

    For Each DtRow As DataRow In DirectCast(hogeDataGridView.DataSource, DataTable).Rows()
        Debug.Print(DtRow.RowState)
    Next
行を指定して取りたい場合は、

    'RowState確認用
    Dim DtRow As DataRow

    'DataRowを取得
    DtRow = DirectCast(hogeDataGridView.DataSource, DataTable).Rows(i)
顧客の来店N日目を作成する(SPSS Modeler データ加工逆引き4-19)

# 顧客の来店N日目を作成する

![スクリーンショット 2022-11-07 15.56.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d823c214-eaf8-c305-d8d2-c469102fb32b.png)

逆引き4-1③ 「設備の時系列に通し番号を振る」と同じ処理です。

## 1.想定される利用目的

・ 顧客のランク移動や休眠予測のための特徴量作成

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/day_n.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-11-07 15.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5e564aba-0d8a-a039-d036-f97cd8818c89.png)

a.入力するデータは以下の通りです。IDが同じに日に複数回登場するトランザクションです。
![スクリーンショット 2022-10-28 22.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/10fa37dc-4a35-eec1-ca85-d8511256d069.png)

b.[レコード]ノードを編集します。IDと日付で要約します。
![スクリーンショット 2022-10-28 22.54.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e6dea70b-b352-5199-6cb7-f22fa603c4d6.png)

[プレビュー]します。
![スクリーンショット 2022-10-28 22.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/aebc28b2-d078-0842-aab9-c23aa44d83d7.png)

c.[フィールド作成]ノードを編集します。[派生]モードを[カウント型]にしてIDが１レコード上と一致したらカウントします。[@&#xFFF0;OFFSET(フィールド,1)]でフィールドの値の1行上を参照します。
![スクリーンショット 2022-11-07 15.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/aef28dfa-7b22-06de-db6f-dd9ea614d54a.png)

式ビルダーを利用して@&#xFFF0;関数をリストから選択すると簡単に入力できます。
![スクリーンショット 2022-11-07 15.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b80f2088-2583-15b0-3571-fdabae9910bf.png)

[プレビュー]します。完成しました。
![スクリーンショット 2022-11-07 15.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0c7512d8-a69e-a81a-b557-c31e24c76002.png)

#### 注意点

レコードに商品名と顧客ランクを含めると優良顧客がN回目で特徴的に購入する商品が集計できます。

## 4.参考情報

#### オフセット関数を解説した記事

https://qiita.com/kawada2017/items/41e8847b280f35fa9aa4

https://qiita.com/kawada2017/items/1385a5d4a83154792c12

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
レイクハウスをオーケストレート：DatabricksワークフローにおけるSQLクエリー、ダッシュボード、アラートのリフレッシュのサポートの発表

[Orchestrate the Lakehouse: Announcing Support for Refreshing SQL Queries, Dashboards and Alerts in Databricks Workflows \- The Databricks Blog](https://www.databricks.com/blog/2022/11/10/orchestrate-lakehouse-announcing-support-refreshing-sql-queries-dashboards-and)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

[Databricksワークフロー](https://qiita.com/taka_yayoi/items/871bf30f6edf00d3ee1e)は、データ、分析、AIワークロードに対する高可用性かつ完全マネージドのオーケストレーターです。本日、Databricks SQLのクエリー、ダッシュボード、アラートをリフレッシュするワークフローを容易に作成、スケジュール、調査、オペレーションできる新たなSQLタスクタイプのパブリックプレビューを発表できることを嬉しく思っています。レイクハウスの完全なパワーをオーケストレーションするために、この新たなタスクタイプと、既存のノートブック、Pythonスクリプト、dbtプロジェクトに対する堅牢なサポートと組み合わせることができます。

実世界のワークフローは、レイクハウスにまたがる数多くの異なるアクティビティをオーケストレーションします。Delta Lakeにデータを取り込み、Delta Live Tablesを用いて変換するワークフローを考えてみます。データがアップデートされると、Databricksに1つ以上のダッシュボードをリフレッシュしたり、SQLクエリーを実行する様に指示することができます。また、様々なデータ品質ディメンションをチェックし、指定された条件が満たされた際にSlackやTeamsに通知するようにアラートを実行することができます。データを準備するワークフローの中でこれらのSQLタスクをオーケストレーションすることで、いくつかのメリットが生まれます: ワークフローの理解しやすくなるだけではなく、失敗時にリペアやピックアップがしやすくなります。
![](https://cms.databricks.com/sites/default/files/inline-images/db-397-blog-img-1.png)
*複数のクエリーとダッシュボードをリフレッシュするワークフロー*

Databricks SQLタスクを作成するには、シンプルにDatabricksワークフローに移動し、タイプドロップダウンから`SQL`を選択します。
![](https://cms.databricks.com/sites/default/files/inline-images/db-397-blog-img-2.png)
*クエリーをリフレッシュするためにSQLタスクを作成*

また、スケジュールの管理や以前の実行の調査など、ジョブスケジューラーによる可視性や安定性のメリットを得ることもできます。
![](https://cms.databricks.com/sites/default/files/inline-images/db-397-blog-img-3.png)
*SQLタスク実行の詳細*

お使いの環境でのプライシングや利用可能状況については、Databricks SQLのプライシングページ([AWS](https://www.databricks.com/jp/product/sql-pricing-aws)、[Azure](https://www.databricks.com/jp/product/sql-pricing-azure))をご覧下さい。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Linuxのファイヤーウォールについて

## 環境
Ubuntu20.4

## 内容
Linuxでファイヤーウォールを導入する場合、現在では、firewalldを利用する場合が多いようです。

CentOS6までは、ファイヤーウォールツールにiptablesがプレインストールされていましたが、CentOS7からは、firewalldがプレインストールされています。CentOS7には、iptablesはプレインストールされていません。CentOS7からはfirewalldが推奨されるようになっています。つまり、iptablesは既にレガシーとなりつつあります。これから使うのであれば、firewalldを使う方がモダンということになります。CentOS7でも、iptablesを動かしたい場合は、インストールすることはできるようになってます。

Ubuntuの場合は、iptablesもfirewalldもプレインストールされていません。Ubuntuで使いたい場合は、aptを使って、共に、インストールすることができます。

Ubuntuには、代わりに、ufwというファイヤーウォールツールがプレインストールされています。ufwは、iptablesのラッパーで、iptablesの簡易版として位置づけられています。iptablesを使うには敷居が高い場合は、代わりに、ufwを使うとことができます。基本的な設定だけで運用する分には、ufwで十分だと思います。

Firewalld、iptablesですが、それぞれ、別ツールのように思われますが、Firewalldも、iptablesもNetfilterにアクセスするための管理インターフェースであります。Netfilterとは、Linuxカーネル内に存在するサブシステムのことです。Firewalld、iptablesともに、設定した内容は、Netfilterの設定ファイルに書き込まれています。

Ubuntuでufwが本当にプレインストールされているのか、確認することができます。ufwのサービスを確認して、表示されればインストールされています。下記のどちらのコマンドを使ってもOKです。
```
$service --status-all | grep ufw

$systemctl status ufw.service
```

ufwのステータスを表示するコマンドです。デフォルトでufwのサービスは起動されるようになっていますが、ufw自体の設定は行っていないため、ufwは有効になっていません。有効になっていれば、ステータスはactiveと表示されます。
```
$sudo ufw status
Status: inactive
```

ufwを使わないのであれば、サービスを無効化しておいた方がいいかと思います。少しでもメモリの負荷が軽減されるためです。

## ufwサービスを無効化する

ufwサービスを停止します。
```
$systemctl stop ufw.service
```

ステータスを確認して、サービスが停止したことを確認します。
```
$systemctl status ufw.service
```

サービスが有効化になっているか無効化になっているかを確認します。現時点ではまだ有効化になっています。サービスを停止しても、サービスが有効化されていれば、次回OSを起動したときに、自動起動されることになります。
```
$systemctl is-enabled ufw.service
enabled
```

次回から、サービスが自動起動しないように、サービスを無効化します。ルート権限で実行しないと、update-rc.d: error: Permission denied と表示されます。
```
$sudo systemctl disable ufw.service
```

サービスを表示して、無効化されていればOKです。
```
systemctl is-enabled ufw.service
disable
```
Kubernetesにおけるリソースの割当



Kubernetes（minikube）におけるリソースの設定・確認方法メモ。

### Node

minikubeの場合、設定は起動時か、ドライバ側の設定に依存するみたい。
確認は、以下で可能。

```bash
kubectl describe node node_name
```

以下はminikubeのdescribe内容。

>Driveで指定しているDocker側の設定が反省されてるみたい。

```bash
（抜粋）

Capacity:
  cpu:                12
  ephemeral-storage:  61202244Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             33867492Ki
  pods:               110
Allocatable:
  cpu:                12
  ephemeral-storage:  61202244Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             33867492Ki
  pods:               110
  
（抜粋）
```

### Pod

PodについてはYaml等で指定可能。

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-www
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-www
  template:
    metadata:
      labels:
        app: my-www
    spec:
      containers:
      - name: my-www
        image: nginx
        ports:
        - containerPort: 80
        resources:
          requests: #最低
            cpu: 250m #クラウドサービスにより表記異なる
            memory: 512Mi
          limits: #上限
            cpu: 1000m
            memory: 1024Mi
```

確認はdescribeで。

```bash
kubectl describe pod pod_name

（抜粋）

    Limits:
      cpu:     1
      memory:  1Gi
    Requests:
      cpu:        250m
      memory:     512Mi
      
（抜粋）
```

リソース不足時の挙動などが知りたいが、一旦確認方法でした。

## 参考

* https://zenn.dev/issei1213/articles/f36bd30d55bb9c
* https://kubernetes.io/ja/docs/concepts/configuration/manage-resources-containers/
パンプキンパイには愛(AI)が入ってる：MLとAIを用いた斬新なアプリケーション体験の提供

[There’s No AI in Pumpkin Pie, But There Should Be: Delivering Novel Application Experiences using Machine Learning & AI](https://www.databricks.com/blog/2022/11/08/theres-no-ai-pumpkin-pie-there-should-be-delivering-novel-application-experiences)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

間も無く、ホリデーシーズンと我々の体を温めウェストラインに課題を突きつけるリッチで美味しい食べ物がやってきます。我々Databricksでは、ちょっと遊んでみようと思い、お客様の休日をより素敵なものにするいくつかの素晴らしいレシピを提供しようと考えました。しかし、DatabricksなのでAIを活用してそれらを行う必要がありました。

実際にDatabricksによるAIのシンプルさを示すために、我々は最優先の課題「*ベストなパンプキンパイはどのようにつくるのか？*」を解決することに決めました。この記事では、AIドリブンのアプリを構築するために、我々がどのようにサーバレスリアルタイム推論とパワフルなオープンソーステクノロジーを活用したのかをウォークスルーします。
<iframe width="560" height="315" src="https://www.youtube.com/embed/5EEO8cP2TMc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# Databricksホリデーレシピ検索アプリにようこそ

Databricksのホリデーレシピ検索アプリは、ユーザーによって指定された画像、あるいは説明文のテキストに基づいて食べ物を検索するシンプルかつAIドリブンのアプリです。このアプリを用いて、画像ベースの検索を用いてEpicurious Foodの材料やレシピのデータセットを検索することもできます。お好きなホリデーの食べ物の写真をアップロードして、*我々はパンプキンパイと言いましたか？*、あるいはランダムに画像を選択し、選択した画像に見た目が似ている食べ物のレシピを検索します。あるいは、単語やフレーズに基づいてレシピを検索するために、検索ボックスを使うことができます。

このアプリケーションのインスピレーションは、料理を見たとしても具体的に何であるのかわからないという一般的な課題でした。そこで、特定しにくい料理の画像をアップロードすることで、Databricksが膨大な食べ物のカタログから似ているものを探し出すというシンプルな検索を思い描きました。提示されたアイテムのそれぞれでは、料理の見た目を把握するのに役立つ画像、材料や準備の手順を確認することができます。すでに今年のホリデーの食卓に追加したいくつかの料理を特定しているので、皆様に同じことをやっていただこうと思い招待しました。

# どうやったのか

このアプリにおいては、Epicuriousのウェブサイトからスクレーピングされた13,000以上のレシピと関連づけられた画像を活用し、[このKaggleデータセット](https://www.kaggle.com/datasets/pes12017000148/food-ingredients-and-recipe-dataset-with-images)として利用できる様にしました。活用した画像ベースの検索はエンべディングのコンセプトをベースとしています。あまり技術に踏み込まずに、エンべディングを画像やテキストのブロックを短い数式表現と考えることができます。2つのアイテムに関連づけられたエンベディングを比較する際、2つのエンベディングの間の距離が、それらの間の類似度に関することを教えてくれます。

これが複雑そうに聞こえたとしても、そうである必要はありません。このようなエンベディングの計算に必要なすべてのロジックとモデルトレーニングは、オープンソースコミュニティによって取り組まれています。Databricksを用いることで、必要なことは1行のコードで[適切に事前学習されたモデル](https://www.sbert.net/)をダウンロードし、検索したいと考えるデータの準備に活用することだけです。

データを準備した後は、多くの場合、課題はモデルをアプリケーションに組み込むこととなります。しかし、繰り返しになりますが、Databricksがカバーしてくれます。Databricksのモデルサービングの機能を活用することで、モデルをシンプルなAPIでラッピングし、スケーラブルなRESTエンドポイントにデプロイすることができます。数行のコードを記述し、DatabricksのUIで数クリックした後に起動し稼働し始めます。

# ホリデーレシピアプリを試してみる

このアプリケーションを記述するよりもパンプキンパイを焼く方が時間がかかるでしょうが、これが全体的なポイントです。Databricksにおいて、我々のゴールは常に機械学習と人工知能の活用をシンプルにするということであり続けています。我々は意志を持って、データの処理やモデルのトレーニングを容易にするだけではなく、これらを通じて生み出された洞察がエンタープライズのアプリケーションにインテグレーションされることを確実にするように我々のプラットフォームを設計しました。

2022のホリデーシーズンの間ホスティングされる[このアプリケーション](https://avisoori-databricks.github.io/databricksrecipeai/#)を操作する様に皆様をご招待し、我々のパブリックGitHubリポジトリから準備に用いた[すべてのコードをダウンロード](https://github.com/databricks-industry-solutions/image-recipe-recommender)することをお勧めします。このホリデーシーズンに美味しい料理を楽しんでいただけたら(このアプリによってインスピレーションを得られたら幸いです)、来年にはお使いのアプリケーションでデータとAIを活用するすべての方法を考えていただけたらと思います。

我々のすべてのお客様に、ハッピーホリデー！そして、このアプリを使った皆様におかれましては、何を料理するかのを楽しみにしています！得られた発見をハッシュタグ #DatabricksRecipes でシェアしていただけたらと思います！

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
【TypeScript】コアな型

**JavaScript**(TyepScript)のデータ型は以下の2つに分類される
* プリミティブ型
* オブジェクト

## プリミティブ型の特徴
* イミュータブル特性
    * 値を直接変更できない
* プロパティを持たない
    * 基本的にプロパティがない
    * オートボクシングされる言語もある

### オートボクシング
プリミティブ型の文字列や数値などがプロパティを持つオブジェクトとして扱える機能のこと

```typescript
let len_test = 'test'.length;
console.log(len_test); //4
```

## プリミティブ型の種類
プリミティブ型は7種類ある
プリミティブ型以外は、`JavaScript`においてはすべてオブジェクトと考えて問題ない
| 型                 | 説明                                                        | 
| ------------------ | ----------------------------------------------------------- | 
| 論理型(boolean)    | `true`または`false`の真偽値                                   | 
| 数値型(number)     | `0`や`0.1`のような数値                                        | 
| 文字列型(string)   | `"Hello World"`のような文字列                               | 
| undefined型        | 値が未定義であることを表す型                              | 
| ヌル型(null)       | 値がないことを表す型                                      | 
| シンボル型(symbol) | 一意で不変の値                                            | 
| bigint型           | `9007199254740992n`のようなnumber型では扱えない大きな整数型 | 

## 参考

https://typescriptbook.jp/
転職やフリーランス転身に不安を感じている方へ


今日は転職やフリーランスになりたいが
一歩踏み出せない、、人という人向けに書きたいと思う。

ぼくもそうだったが、将来のキャリアを考えたら転職したいが、いろいろな不安がよぎった。
・仕事が見つけられるか不安だ。。
・長く続けられるか不安だ。。
・スキル・経験不足で自信がない。
・突然契約が打ち切られるのではないか

この不安に対してまず思うのが、
なにも今の仕事をやめて、転職やフリーランスになる必要はないということだ。
なにごとも準備が大切だと思う。

たとえば、今の仕事をつづけながらでもできることはこんなにもある。

###### ■転職イベント（合同説明会など）に参加する
  例えばこんな感じのもの
  https://doda.jp/event/
  
  別に今の会社をつづけながらでも、他の会社と面接は別にしてもよいので
  （ほかの会社に転職が決まるまでは）
  こういった転職イベントをきっかけとして、面接を申し込んでみたらどうか、
  と思う。

###### ■人材系のエージェントに登録して、キャリア相談する。（正社員・派遣・フリーランスなど好みにあった形態のものに登録する）

専門の方に自分の経歴書をみてもらい、今の自分の経歴だったらどんな案件に入れそうか、調べてもらおう。

例）派遣の場合
パーソルテクノロジースタッフ
https://persol-tech-s.co.jp/

リクルートスタッフィング
https://www.r-staffing.co.jp/

マンパワー
https://www.manpowerjobnet.com/

ちなみにあくまで個人の見解だが、
派遣でも正社員より残業が少ない、給与も多いといったケースも多数あるので、
あまり雇用形態は、よりすぐりしないことをお勧めする。


###### ■クラウドソーシングを使って、自分で案件を受注する経験をする
→ 私も今やっています。
例）
クラウドワークス
https://crowdworks.jp/
    
ランサーズ
https://www.lancers.jp/

###### ■友達、先輩などに転職経験がある人（IT業界関わらず）がいたらお茶や飲みに行って、話を聞く。
誰かと話しているうちに「転職は意外と簡単だ」ということに気づくと思う。


いきなり会社をやめて転職、フリーランスになる、と奮起できる人なら良いと思うけど、
不安な人はまずは準備してからでもぼくはいいと思う。

みなさんの参考になれば。

関連サイト
https://qiita.com/894kun/items/aebb169594cf194ba78d
[Rails6.0] form_withのlocal trueの必要性

mac OS バージョン11.6
Rails 6.0.4

未だにRails6.0を使ってる方は少ないと思いますが、一応備忘録として残しておきます。

#  はじめに
他ユーザーをフォローする機能を付けたところ、フォローボタンを押しても動かない。。
エラーメッセージも出ないためどこが間違っているのかわからず悪戦苦闘しました。

該当のコードは以下になります。

```ruby:
<%= form_with(model: current_user.relationships.build) do |f| %>
      <%= hidden_field_tag :follow_id, user.id %>
      <%= f.submit 'Follow', class: 'btn btn-primary w-100' %>
    <% end %>
```

# 原因
***Ajax通信***だった。
フォームの送信ボタンを押してもクルクルしない（画面がリロードしない）ことが原因でした。

# 解決策
```local: true```を追記したら動くようになりました。

```ruby:
<%= form_with(model: current_user.relationships.build, local: true) do |f| %>
```

# local trueとは
***Rails 5.1〜6.0***の場合、form_withのメソッドはデフォルトで***Ajax通信***になっていて、***非同期通信***になってしまいます。（Rails 6.1からは同期通信がデフォルトに戻っています。Ajaxの最初の文字Asynchronousは非同期を意味します。）
なので通常のHTTPリクエストに戻す必要があるのですが、ここに```local: true```と引数を渡す事で、ページ全体が返ってきてページがリロードされるようになります。

参考：https://qiita.com/kakudaisuke/items/e032c7705db00e8081dc
Flutter - showModalBottomSheetで高さが変わる入力フォームを作る

## 動くもの

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/f5e8abbf-2cce-1b0c-4403-f0807c4b4a8c.gif)

## ポイント

### モーダル表示時のポイント
```dart
      showModalBottomSheet<int>(
          context: context,
          isScrollControlled: true,
```

`isScrollControlled: true,` スクロール可能にして、高さを調整できるようにします。


### 入力フォームのColumnのポイント

```dart
      child: Column(
        mainAxisSize: MainAxisSize.min,
```

`mainAxisSize: MainAxisSize.min,` サイズをコンテンツの要素に合わせて可変になるようにする。


## 最後に
入力できるようにはしたいけど、中にTextFieldを置くと画面がごちゃついてしまったり。
画面を遷移させてまで入力したくない場合に、使いたくなるかと思います。

*コードはこちら*

https://github.com/Yamamoto-Shohei/flutter_bottomsheet_text_field
TeraTerm TTL 備忘録

## SSHログイン
```ttl
;ログイン情報
USERNAME = 'ユーザ名'  
PASSWORD = 'パスワード' 
HOSTADDR = 'IPアドレス'

;ログインコマンド生成
cmd = HOSTADDR
strconcat LoginCmd ' /ssh /auth=password /user='
strconcat LoginCmd USERNAME
strconcat LoginCmd ' /passwd='
strconcat LoginCmd PASSWORD

;ログイン
connect LoginCmd
```
参考文献

https://qiita.com/iguru/items/eed60bc1d969a6a0000c

## ログイン後 コマンド送信
```ttl
;ログイン待ち
wait ']#'

;コマンド送信(変数なし)
sendln 'pwd'

;コマンド送信(変数有り)
cmd1 = 'echo '
strconcat cmd1 'ﾊﾟﾗﾒｰﾀ：'
strconcat cmd1 param2
sendln cmd1
```

## コメントアウト
```
;コメントアウト
```
## 変数

https://ttssh2.osdn.jp/manual/4/ja/macro/commandline.html

## パラメータ
|バージョン|記述|備考|
|----|----|----|
|Tera Term 4.91まで|param2|param9まで|
|Tera Term 4.92から|params[2]|params 数の上限なし
>params[0] にはコマンドライン文字列全体が格納され、params[1] にはマクロファイル名が格納される。
>params[2] 以降はマクロファイルに渡されるパラメータが順番に格納される。

参考文献

https://teraterm.jp/?p=348

https://ttssh2.osdn.jp/manual/4/ja/macro/commandline.html


## 文字列連結

|コード|str|
|----|----|
|str = 'a'|a||
|strconcat str 'b'|ab||
|strconcat str 'c'|abc||


## 呼び出し方
### パラメータなし
* ttlファイルの実行アプリケーションを ttpmacro.exe にする。
* ttlファイルのあるディレクトリに移動しttlファイルを実行する。
### パラメータあり
ttpmacro.exe のディレクトリに移動し ttpmacro.exe + ttlファイル名 + パラメータ で実行する
```
ttpmacro.exe C:\Users\user\Desktop\FailName.ttl param1 param2
```
参考文献

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11189251321
今年を振り返ってみて気づいた事

# はじめに

11月でまだ振り返りをするのには早いかもしれないですが、振り返っていこうと思います。

# 怒涛の4~7月

とにかく大変でした。はじめてのことが多く、研究活動・インターンシップ・就職活動etc...
いろいろなことに手を出しすぎて、一時期は脳が動かなくなり、パンクしていました。

# そこで気づいた事

* 欲張ってはいけないということ
* 無理は禁物だということ

# 実は一度挫折をしてしまいました

はい。恥ずかしながら、一度挫折をしてしまいました。

## なにを挫折したのか

### 位置関係
    A社(クラウド研修をとりいれたいなぁ)　自分はここに所属
    ⇅(仲が良い)
    B社(クラウドサービスを活用した企業)

* GCP(クラウドサービス)を教える立場になってもらいたいという思いから、B社の研修を受けることになった。

* GCPを扱う前に、機能設計書・画面設計・テーブル定義書の作成をしてから、ローカルサーバーで掲示板のようなものを実装する課題を行なっていた。

→この課題で挫折してしまった(><)

## なぜ挫折した？

* 自分で考える努力をやらなかった

* プログラミングは関数で動くものだと理解せず、雰囲気で触っていた。

→これが一番よくなかったところ。気づくのが少し遅かったかな。

## 挫折をどうやって乗り越えた

* 一度、全部やらないことにした

* そしたら、心に余裕ができて思考力が元に戻った。

* 師匠に一言言われて覚醒した
    * プログラミングは止まっているもの。相手からレスポンスがきたら動くだけ。

## そうか。プログラミングの大原則を忘れていた。

その一言で色々な事がつながったような気がした。
あ、プログラミングは関数で動くものなんだな　ということを。
そして、Webアプリは関数の集合体なんだなぁ　ということも。

# 覚醒した

* そこから、プログラミングを自分で考えてできるようになった気がする。(遅い！笑)
* そこで、プログラミングという楽しさに気づいた。同時に、LINEBotを作ることができて、ものづくりの楽しさも実感することができた。
* お陰様で、技育展2022で優秀賞を受賞することができた！(うれぴい）


# 結論

* プログラミングできないよぉ><
* 忙しいよぉ辛いよぉTT
* 休もうzzz...
* あれ、プログラミングって関数じゃね？(気づく)
* うぉーーーたのしー！！！→ いまここ



# 現在の活動

実は、諦めていた課題を、進めております！
というのも、あくまでA社が実験段階として行っていた研修だったので、失敗してもOKだった！　

現在の位置関係はこんな感じ

### これが
    A社(クラウド研修をとりいれたいなぁ)　自分はここに所属
    ⇅(仲が良い)
    B社(クラウドサービスを活用した企業)
### これなった
    A社(クラウド研修をとりいれたいなぁ)　細々と活動中。インターン終えたら戻る予定。
    ⇅(仲が良い)
    B社(クラウド事業を活用した企業) 自分はここに所属[長期インターンやってます!]


# さいごに

いろいろあったけど、プログラミングだけでなく人間として成長できた。とても充実した時間を過ごせた気がする。
今後は、クラウドサービスを扱えるようになって開発の幅を広げたいなぁ。
そして、クリエイティブコンフィデンス(創造に対する自信)を手に入れよう！

へっぽこな自分を育ててくれている皆様には頭が上がりません。この場を借りて、感謝を申し上げます。ありがとうございます。これからも、よろしくお願いします。
Mayaでのアニメーションでよく使うツール　1/n

# はじめに
普段アニメーションで使っている機能・スクリプトを公開できる範囲で公開していこうと思います。

※スクリプト関係を使用して生じたトラブルや損害に関しましては作者は一切責任は負えませんので、悪しからず。
※公開しているコード関係について、独学で学んでいますので、書き方に統一感がなかったり、変数名・英語関係がめちゃくちゃだったりしますが、よろしくお願いいたします。

# 今回の機能・スクリプト
Maya標準に搭載されているキーの移動の減衰についてです。
結構便利なツールですが、搭載されたのがMaya2018くらいの頃なので意外と知らない方も多いのではないでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961539/68926f72-5f43-5344-fd49-ed89ab7fdd0f.png)

# 機能の説明

・移動の減衰　：　一定
こちらは普段から使っていると思うのですが、選択したキーを減衰などなくドラッグした分だけ移動させることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961539/36c8ea16-24a0-c669-bbfb-6d7f91942e4c.png)

・移動の減衰　：　リニア
マウスカーソルを起点に左右に影響力が一定で減衰していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961539/ae51ca09-0a70-12be-a4dc-9a8366082e2b.png)

・移動の減衰　：　指数関数
リニア同様、マウスカーソルを起点に左右に影響力が反比例的に減衰していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961539/7270a724-5e76-c2d2-6f08-9eb15b08b83c.png)


使用頻度的には、1日数回程度ですが、モーションの最終段階で複雑なキーを微調整したい時など痒い所に手が届く感じで大変重宝しています。

# コードの紹介・経緯
アニメーションの作業は直感的かつスピーディなアウトプットが重要ですが、ツールを使いたいときに設定を開いて変更するのが煩わしいので用意しました。
```python:toggleMoveFalloff.py
from maya import cmds
def toggle_move_falloff():
    funcOption = cmds.moveKeyCtx("moveKeyContext",q=True,mf=True)
    if funcOption == "constant":
        funcOption = "linear"
    elif funcOption == "linear":
        funcOption = "power"
    elif funcOption == "power":
        funcOption = "constant"
    cmds.warning("Current Fallof is %s"%funcOption)
    cmds.moveKeyCtx("moveKeyContext",e=True,mf=funcOption)
```
スクリプトを走らせるたびに減衰の設定を変更することができます。

上記コードを
Documents > maya > scripts (Documents > maya > "各バージョン" > scripts)
のフォルダに入れ、Mayaを再起動後

```python
import toggleMoveFalloff
toggleMoveFalloff.toggle_move_falloff()
```
を実行していただければ簡単に切り替えることができると思います。

あとは実行コマンドをホットキー(ショートカットキー)やシェルフに登録することで手軽に切り替えることができます。