OmniAICreator/Qiita-1.07M huggingface dataset:
EChartsの練習でコロナウィルスのタイムラインの動画を作ってみました。

前に [ECharts](https://www.echartsjs.com/en/index.html) を紹介したことがありますが、
今回がっつり勉強しYoutubeの動画でも作ってみました。:fist:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170309/9540c138-2c9a-38f0-3732-26e7c642ad32.png)

特にそのTimeline機能を有効活用し簡単に作れました。

* その動画

https://youtu.be/YTcpvcL6oKg

よければ、見たみてください。
コロナが早期沈静化するように祈ります。

* ホームページも作りました

https://aifan.jp/convid19/
Rmarkdownからknitする際\newcommandを使えるようにする


r-wakalangでatusyさんに教えていただいたのでこちらにまとめます。
Rmarkdownで論文を書いている際、[こちら](http://www.latex-cmd.com/equation/max_min.html)のように数式内に下付きの$argmax$を使いたかったのですが、なかなかできませんでした。

教えてくれた答えはシンプルで、本文中に記載するというもの。ただし、
```\newcommand{\argmax}{\mathop{\rm arg~max}\limits}```
のなかの```\rm```が古いので```\mathrm```とするだけ。

## 解決策
本文中に以下のチャンクを追加する。

```{r, results='asis', echo=FALSE}
cat(sprintf(
  "\\%snewcommand{\\argmax}{\\mathop{\\mathrm arg~max}\\limits}",
  if (knitr::is_latex_output()) "re" else ""
))
```

数式をかいて

```
$\argmax_{a} f(x)$
```
knitをすると、無事に出力できた。
<img width="149" alt="Screen Shot 2020-03-07 at 0.33.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224794/fee806bc-b8ef-0c94-cc92-3ddaa13c59cb.png">
ksnctf 3 Crawling Chaos

#ksnctf 3 Crawling Chaos
* 問題
    * http://ksnctf.sweetduet.info/problem/3
* リンク先にはこれだけ<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416717/276e0d9a-643e-2880-8c90-849440f327e6.png)
* ソースコードを表示する<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416717/52b1c7d9-b477-714d-8453-0df2c68b3568.png)
* jquery.min.jsについて色々検索してjqueryについて知る
    * うーにゃーの部分はjqueryによるコードっぽい
    * 抜き出してIDEONEで実行などしてみるがよく分からず
* console.log()
    * javascriptでデバッグするのに有用らしい
    * 中身や結果を表示してくれる

* console.log()結果
    * ƒ Function() { [native code] }の中身を""で文字列としてプリントしてくれてるっぽい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416717/191b8e71-67cd-a542-d575-d208a554e9e2.png)


~~~Javascript
$(function(){$("form").submit(function(){
    var t=$('input[type="text"]').val();
    var p = Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);
    var f = false;
    if(p.length==t.length){
        f=true;
        for(var i=0;i<p.length;i++)
            if(t.charCodeAt(i)*(i+1)!=p[i])
                f=false;
    if(f)alert("(」・ω・)」うー!(/・ω・)/にゃー!");}
    if(!f)alert("No");return false;
    }
    );
    }
    );
~~~

* 解読
    * fがtrueになり続ければよい
    * 配列pのi番目を(i+1)で割った数値の文字コードを持つ文字を合わせたものを求めればよさそう
    * c++で書き直して実行。フラグゲット

~~~C++
int main(){
    int array[21] = {70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449};
    
    REP(i, 21) {
        cout << (char)(array[i] / (i+1));
    }
    cout << endl;
    
    return 0;
}
~~~
* 参考リンク
    * https://kusano-k.hatenadiary.com/entry/20120421/1335006525
ログイン状態かどうかの表示と設定の仕方

##ログイン状態かどうかの表示
【例】gem'devise'をbundleしたあと(モデルをPost、ビューはapplication.html.erbに記述するとします)

```app/views/layouts/application.html.erb
<% if user_signed_in? %>
          <div class="XXXX">
            <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
            <%= link_to  "投稿する", "/posts/new", class: "YYYY" %>
          </div>
        <% else %>
          <div class="ZZZZ">
            <%= link_to "ログイン", new_user_session_path, class: 'YYYY' %>
            <%= link_to "新規登録", new_user_registration_path, class: 'YYYY' %>
          </div>
        <% end %>
```
if user_signed_in?はユーザーがログイン済かどうかを判定します。
ログイン済のときは"ログアウト""投稿する"を表示されます。
elseはそのほかという意味なので(今回はログインしていないとき)"ログイン""新規登録"が表示されます。
##コントローラーにリダイレクトを設定
このままだと未ログインユーザーであっても直接/posts/newというパスにアクセスすることで投稿ができてしまいます。
そこで、未ログインユーザーが投稿画面など直接アクセスしてきた際にはルートパスに遷移するように設定を行います。
posts_controller.rbの全てのアクションに対して、もし、ユーザーがログインしていなかったらindexアクションにリダイレクトするように実装します。

```app/controllers/posts_controller.rb
class TweetsController < ApplicationController
  before_action :move_to_index, except: [:index, :show]
〜略〜
 def move_to_index
    redirect_to action: :index unless user_signed_in?
  end
end
```
before_actionにより先にmove_to_indexメソッドが動いてindexアクションのindex.html.erbのページにリダイレクトしてくれます。
indexアクションにアクセスした時、indexアクションへのリダイレクトを繰り返し無限ループが起こるので、except: :indexを付け加えます。今回はshowも詳細ページへはログインする必要はないものとします。
unless文で先にuser_signed_in?を判定をします。
つまり、ユーザーがログインしていない時にはindexアクションを実行する。ということになります。
##unless文
unless文は条件式が偽の場合の処理を記述するのに使われます。
JiraとAsanaのうまい使い分け考察

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/d08cca8a-780e-2314-6754-8ed4345985df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/23f15b1b-b75b-5ced-237b-75a6d53b7baf.png)

## JiraとAsanaをうまく使い分けたい
会社によりけりですが、Jiraに統一！（またはBacklogに統一！）的な感じで
プロジェクト管理ツールは「自分が使いやすいから」と言うだけでは決められないですよね。

しかし、自分のタスクがあっちこっちのプロジェクトに散らばってる状態になると、
仕事しにくいというか、自分の仕事の区切りが２h単位だとするとタスクも２hで切りたいとか。
もっと自由にタスクを洗い出せるような方法はないものかと思いますよね。

Jiraは高機能だが、1枚のチケットを「アサイン〜完了」まで使うので重みがある。
Asanaはタスクをバンバン書いて消すツールだが、スケジュールの見通しはしにくい。


### 結論：こんな使い方したら良い、と思っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/ffcc470a-f517-9093-8474-19e0c1db3e76.png)

## チケットの切り方あるある
##### 「こんなページを作って公開する」
→一口にページを作ると言っても色んな工程があります。。
##### 「こんな機能を追加する」
→とはいえ、色々な課題があるのでそれも洗い出さないと・・・


「もっとタスクの粒度を細かくして欲しいな〜」って思ったりしますよね。

### 依頼者はそこまで気がつかない
そもそも隅々まで理解して依頼してくるパターンの方が少ないです。
チケットの粒度を相手に細かくしてもらうというのは理想論かな、と思います。

### とは言え、Jiraチケを自分で切るわけにもいかず。

タスクを引き受けてる所で自分からチケットを切ってしまうと、
依頼なのか自分のToDoリストなのか、ワケ分からなくなるので、

Jiraの場合は、チケットのサブタスクを自分で登録していくという手段がありえますが、
Jiraのサブタスクはチケットに紐づくので、どっちにサブタスクとして入れようか迷ったり

「リファクタリング」とか「ネットで調べる」とか「バグを発見したので直す」
的な事を、正直ベースでサブタスクに入れてしまうと、何を言われるか分からないし、
オープンな場所に自分の工程をさらすの、気持ち悪いですよね。

また、複数プロジェクト同時進行がある場合、
Jiraはプロジェクト単位の管理なので横断して確認するの大変かもです。

### チケットを細かく切られた場合
スクラムで全部報告するの大変だし、スクラムで報告する区切りで言えば
やはり、チケット単位の方が嬉しいだろうと思います。

### Asanaは「自分のスケジュール」を組みやすい
個人のいつまでに何やるリストとしては、Asanaの方が使いやすい。
タスクの粒度も自分の好みで１時間単位とか細かくできるし、

チームの関係性にもよりけりですが、関係者が見てない所に書く方が、
バッファを抜きにした、本当の工数が自分で分かると思います。

### なので・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/ffcc470a-f517-9093-8474-19e0c1db3e76.png)

こうしたら良いと思うんですよね。
ある程度仕事の進捗状況の共有が必要なら、直属の上司にだけ共有する事もできますし。

どうですか？
tmuxで絵文字が補完される時に表示が崩れる

シェルで絵文字が補完される時に表示が崩れることがあった。

## 再現方法
- tmuxで画面を左右に分割している
- コマンドの補完で絵文字が入力された時（`git commit -m "絵文字"`）

## 原因
tmuxが依存しているutf8procがインストールされていなかった。

## 解決方法
utf8procをインストール後、tmuxを再インストール、再起動する。


Homebrewを利用している場合

```bash
brew uninstall tmux
brew install utf8proc
brew install tmux
```

utf8procにチェックがついていればOK

```bash
brew info tmux
.
.
.
==> Dependencies
Build: pkg-config ✔
Required: libevent ✔, ncurses ✔, utf8proc ✔
.
.
.
```

## 参考になった情報
- https://github.com/tmux/tmux/issues/836
学習記録#2

#やったこと
Udemy「PythonによるWebスクレイピング〜入門編〜【業務効率化への第一歩】」の１４−１６（§５の終わりまで）

- formatの使い方
- url末尾が/?page=1とか2となっているページの情報をまとめて取得する方法
- スクレイピングした情報はstr型
- 2次元の表を作るのにPandasが便利


.format()で波かっこで囲まれた部分に引数を埋め込める。→下みたいにすると、page=1, page=2, page=3ってなる。

```Python:.formatの使い道
for page in range(1,4):
  'page={}'.format(page)
```
これをbrowser.get()の引数に使えば連番ページの情報を取得できる。
#読んだもの
https://qiita.com/thesugar/items/1cd91eb3f5de7d390490
環境構築するときに読めばよかったかも
#その他
倍速で動画を見て内容を掴む→同じ動画を等速で見ながらエディタを叩くで勉強した。
[第一次更新][漏洞通告]CVE-2020-2555/Oracle Coherence&WebLogic反序列化远程代码执行漏洞

### 漏洞描述
近日,亚信安全网络攻防实验室监测到1月份被Oracle修复的基于T3协议触发的漏洞(CVE-2020-2555)细节在ZDI被公开.`Oracle Coherence`为Oracle融合中间件中的产品,是业界领先的内存数据网格解决方案,它能为公司和组织提供对常用数据的快速访问。在WebLogic 12c及以上版本中默认集成到WebLogic安装包中.`Oracle Coherence`中的反序列化远程代码执行漏洞允许未经身份验证的攻击者通过精心构造的T3网络协议请求进行攻击.成功利用该漏洞的攻击者可以在目标主机上执行任意OS命令,严重危害服务器安全.

### 漏洞编号
CVE-2020-2555

### 漏洞威胁等级
高危

#影响范围
Oracle Coherence 3.7.1.17
Oracle Coherence&WebLogic 10.3.6
Oracle Coherence&WebLogic 12.1.3.0.0
Oracle Coherence&WebLogic 12.2.1.3.0
Oracle Coherence&WebLogic 12.2.1.4.0
### 漏洞验证
选用WebLogic 12.1.3为靶机进行验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/288dd62b-355b-b589-912d-c89c68db2f3f.png)

经过亚信安全网络攻防实验室分析和复现发现,实际上`WebLogic 10.3.6`也受到该漏洞影响.

该漏洞利用链中的两个类`com.tangosol.util.extractor.ReflectionExtractor`和`com.tangosol.util.filter.LimitFilter`存在于`coherence.jar`中,而10.3.6版本自带该jar.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/7376dba9-3284-2d70-62f9-a4d110a622c5.png)

以下为10.3.6的版本演示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/c42c7fa3-f2e2-5fb6-39fa-e3cc3a9116fc.png)




### 修复建议
安装更新补丁即可
https://www.oracle.com/security-alerts/cpujan2020.html

### 时间轴
[0] 2020/03/05 Sivathmican Sivakumaran在ZDI公开漏洞细节
[1] 2020/03/06 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告
[2] 2020/03/07(凌晨) 亚信安全网络攻防实验室发现`WebLogic 10.3.6`同样受到影响并发布漏洞更新
### 鸣谢
感谢一起研究的以下小伙伴

Qianxin-Lufei/Ntears、
afanti
AlibabaCloud pyn3rd
### Reference
https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server
https://mp.weixin.qq.com/s/nzKDO77tW-WVuPsgy3vrzg
アプリケーションのログ出力

設計時、アプリケーションが正常動作することだけを意識しがち。
システムを運用するとき、アプリケーションのログ出力設計も一緒に行えるとベスト。
がっちり設計することが難しくても、最低限外せないポイントだけでも覚えて対応しておくと、保守が格段に楽になる。

#ログがないと困ること
システム保守時に障害・問い合わせ等が発生した場合、事象の把握に手間取る。
問い合わせ等を受けて原因調査を行う場合の手順は、だいたい以下の流れ。
①現状把握
②原因の仮説立て
③仮説に沿ったデータ収集等を行い検証
ここの①を行う時、ログ設計が適切に行われている場合、情報収集スピードが向上する。

システムダウンの監視のためにログのエラー監視を行うことが多いので、監視用にも必要。

#ログがあると便利なこと
システム保守時に「このエラーが出たら必ずこのアクションを行う」とマニュアル化できると、
システムへの知識が浅い人でも仕事がしやすくなり、仕事の属人性が下がる。
エラーログは特にログ監視でエラーメールが飛ぶはずなのでマニュアル化しやすいはず。

#表示するログの大雑把な分類
##・業務的な操作原因のエラー
プログラムとしては問題ないが、システムの決まり上（仕様上）操作が許されない場合のエラー。
（例）
ECで商品注文したが、ニアミスで在庫切れとなった場合。
→在庫切れとしてエラー画面へ遷移+エラーログを出す。

##・システム起因のエラー
プログラムとして問題が起きた場合に出すエラー。
（例）
参照型変数がnullの場合に参照を行う。

基本的にこの手のエラーが本番環境で出る場合、バグか想定外の操作が起きている。

##・（おまけ）出しておいて便利だったログ
・管理画面での、ユーザ操作の追跡
「どのユーザがどういった操作をしたか知りたい」という問い合わせがあることが見越せるなら、入れておくと楽。
アプリケーション側でログインユーザ情報を保持している場合は、アプリケーション側でログインユーザ＋業務的な操作情報を出す方が追いやすい。
特に、データアップロードやステータス変更のように、操作により業務が進む（お金に絡む）アクションをログ出力すると良い。

#ログを出すにあたり気をつけると良いこと
##・次のアクションを明確に伝える
ログを見る時は、たいてい困っている。
従って「次のアクションは何か良いか」を明確に伝えるログ出力にする。
「かつて新人だった自分が、システム保守をいきなりやらされた場合でも理解できるか」を基準にすると優しくなれる。
特に業務を止める（ビジネスへ影響がある）ものは必ずリカバリできるようにしておく必要がある。

・また、エラーの場合でも処理を続行するか、エラー画面へ移動するかを決める必要あり。
システムを作る人がどうしたいのか意向をしっかりヒアリングしておく。特にお金に絡むところは慎重に。
ゲームの音声機能開発にめっちゃ便利なサービス - Game Multimedia Engine（GME）

## Tencent Cloudのご紹介

- Tencent CloudにはIaaS、Paas、SaaSに別れて、プロダクト数は２００以上

- アカウントは下記２種類
    - [中国サイト](https://cloud.tencent.com/)のアカウント：中国法人向け
    - [国際サイト](https://intl.cloud.tencent.com/)のアカウント：グローバル向け

--------

## Tencent Cloud紹介シリーズ - 1

今回はTencentらしいPaas系のプロダクト, 
[Game Multimedia Engine(GME)](https://intl.cloud.tencent.com/product/gme)を簡単にご紹介させていただきます。

--------

## Game Multimedia Engineの概要

- 高品質＆低コスト＆ワンストップで音声機能を開発できるサービス

- Tencentのゲームやソーシャル事業（WeChat、QQなど）で培ってきたテクノロジーを反映されたもの

- 提供されるSDKを利用して、簡単に音声機能を実装

--------

## GMEの主な機能 - Part1

- リアルタイム音声サービス
    - 空間位置に基づいた３D音響効果
    - 一定範囲にいるのユーザーへ音声発信
    - 順番付きの音声機能
    - 複数ユーザーでの同時通話
    - 1対N、指示者モード音声発信

--------

## GMEの主な機能 - Part2

- Voice-to-Text
    - 120カ国の言語を対応
- 音声分析
    - AIを活用したノイズキャンセリング
    - 通話内容の審査

--------

## GMEの特徴

- マルチプラットフォームの対応
    - iOS, Android, Windows, XBox, PlayStaion,...

- 様々なSDKを提供
    - Unreal, Cocos, Unity, PS4, XBOX, H5,...

- 3D音声効果
    - 8方向, 空間距離に応じた音声のボリューム調整

--------
## GMEの利用シーン1 - MOBA

- 複数プレヤー間の通話  
以下, [Tencent Cloud中国サイト](https://cloud.tencent.com/document/product/607/10838)から引用

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117156/b1abcba7-a709-3b27-5c7e-7831f2220124.png" width="800">

--------

## GMEの利用シーン2 - MMORPG
- 1対N、指示者モードでの音声発信  
    - 以下, [Tencent Cloud中国サイト](https://cloud.tencent.com/document/product/607/10838)から引用

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117156/6bfecb99-9c97-37f7-713e-951ef8e92cc3.png" width="800">

--------

## GMEの利用シーン3 - カラオケ
- 音楽の伴奏、音声の変換  
    - 以下, [Tencent Cloud中国サイト](https://cloud.tencent.com/document/product/607/10838)から引用

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117156/54f07fe1-4592-004d-24a9-ebc2883f2fde.png" width="400">

--------

## GMEの利用シーン4 - 人狼系ゲーム

- 順番付きの会話   
    - 以下, [Tencent Cloud中国サイト](https://cloud.tencent.com/document/product/607/10838)から引用
  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117156/84d23432-5ad3-30ba-084e-16e30cca3b2a.png" width="400">

--------

## その他

- 公式ページ：[日本語](https://intl.cloud.tencent.com/product/gme), [中国語](https://cloud.tencent.com/product/gme)

- [SDK関連](https://intl.cloud.tencent.com/document/product/607/18521)

- [料金関連](https://intl.cloud.tencent.com/document/product/607/17808)

- [Tencent Cloudへの問い合わせ](http://tencentjapan.com/tencent_cloud/)
PG::UndefinedTable: ERROR:  table " " does not existとでて、マイグレーションできない

[Dockerで構築されたRailsをHerokuへデプロイ](https://qiita.com/kazama0119/items/7b6b56d45255934a1cb3)の一部を、こちらに書いています。

ネットで調べた情報をもとにマイグレーションを行おうとしてもうまくできなく、
長時間つまずいたため同じような状態に陥った人は参考にしてみてください。

##問題点


```terminal
$ heroku run rails db:migrate
```
を実行した時に、正常では出ない量の、文字が現れてました。
確認してみると、途中で`ROLLBACK`されており、

```terminal
PG::UndefinedTable: ERROR:  table "***" does not exist
```
***というテーブルが存在しないよ。というエラー文が表示されていました。

##原因

以前、テーブルを削除するマイグレーションファイルを作成した時に、元のマイグレーションファイルを削除していました。
そのため、今回テーブルを削除するマイグレーションファイルが読み込む時に、元のファイルがないのでテーブルが作成されておらず、削除するはずのテーブルが見つからないという状態でした。

##行ったこと

①元のファイルがないので、削除するはずのテーブルが作られなく、削除する指示する必要がないため、***というテーブルの削除を指示するファイルを削除し、マイグレーションを行いました。

```terminal
$ heroku run rails db:migrate
```

②再びコンテナにプッシュ

```terminal
$ heroku container:push web
```

①も②もこれまでと同じエラー文が出たため、マイグレーションの状態を確認しました。
すると、以下のように、削除したはずの***というファイルをマイグレーションにしようとしていました。

```terminal
$ heroku run rails db:migrate:status

   up     20200227071559  Create 〜
   up     20200229041915  Change 〜
  down    20200229044809  Drop table ***
```

###補足
マイグレーションファイルをrollbackせずに、削除してしまった時など、 マイグレーションのステータスに`********** NO FILE **********`と出てしまうようです。
私も気付いたら`down`であった`***テーブル`が`********** NO FILE **********`となっていました。
そのため、以下のサイトを参考に1度`dummyテーブル`を作成し対応しました。
herokuの場合、マイグレーションファイルを作成後そのままステータスを確認しても反映されていません。
そのため、私は以下の`解決方法`を実行し終えた後、ステータスを確認しました。
無事、記事のように行うことができました。
[【Rails】db:migrate:statusで*** NO FILE ***と出た時の対処](https://remonote.jp/rails-migrate-status-no-file)

##解決方法

コンテナと、DBを1度リセットし、実行し直すとマイグレーションできました。

[【Heroku】heroku container:push web で変更が反映されない](https://teratail.com/questions/240393)
[【Heroku】DBを1から作り直したい時にやること（rails db:reset）](https://opiyotan.hatenablog.com/entry/heroku-db-reset)

```terminal
$ heroku container:rm web
$ heroku pg:reset DATABASE_URL
 ▸    WARNING: Destructive action
 ▸    postgresql-fitted-20135 will lose all of its data
 ▸    
 ▸    To proceed, type **** or re-run this command with --confirm ****

> ****
Resetting postgresql-fitted-20135... done

$ heroku container:push web
$ heroku container:release web
```

以上を行った上で、マイグレーションを実行。

```
$ heroku run rails db:migrate
```
Dockerで構築されたRailsをHerokuへデプロイ 

理解が浅く、間違った部分があったり、強引な方法になっている可能性もあるのでご了承ください。
また、アドバイス等あれば是非ご教示いただければ幸いです。

##状況

Dockerで構築されたRailsのサービスをherokuへデプロイする際に、
Dockerのコンテナ内から、`$ git push heroku master`とデプロイを行おうとしても、以下のエラーが出て進めませんでした。

```terminal
 Mysql2::Error::ConnectionError (Unknown MySQL server host 'db' (0))
```

他の方の記事で解決方法になっているようなことを行っていても、エラー内容が変わらず解決しなかったです。
いくつかの記事を見ていくうちに、Dockerコンテナからではなくローカルで操作しているのではないかと思い、ローカルから行うことにしました、
(もしかしたらDockerのコンテナからでもできるのかもしれないです。)


## Herokuをターミナルから操作できるように

ターミナルからherokuで使うコマンドを入力しても`heroku: command not found`とメッセージが帰ってくるため、
まずは、Herokuをターミナルから操作するためのコマンドツールをインストールしました。

```
$ brew install heroku/brew/heroku
```


その後は、[こちら](https://qiita.com/fuku_tech/items/dc6b568f7f34df10cae7#heroku%E3%81%B8%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)の記事を参考に、進めていったのですが、

DBセットアップのところでつまずきました。
詳しくはこちらの記事にまとめていますので、参考にしてみてください。

---
[PG::UndefinedTable: ERROR:  table " " does not existとでて、マイグレーションできない](https://qiita.com/kazama0119/items/6fe7b5dfc6b7d465c829)

##pushできない
`$ git push heroku master` とデプロイをしようとしても、`Everything up-to-date`と返ってきて、デプロイができない。



作業しているブランチ名を指定しないといけなかった。
(masterにマージしてから行えば、`$ git push heroku master`でできるかと思います。)

```
$ git push heroku ブランチ名:master
```

また、上の`$ git push heroku ブランチ名:master`を実行後に、以下のエラーが出てきました。
ここは、エラーに書かれている`heroku stack:set heroku-18`を実行すると解決できました。
(heroku-18がデフォルトだそうなんですが、アップグレードしないといけませんでした。)
[公式のHeroku-Stacks](https://devcenter.heroku.com/articles/stack)

```
remote: =!= Your app does not include a heroku.yml build manifest. To deploy your app, either create a heroku.yml: https://devcenter.heroku.com/articles/build-docker-images-heroku-yml
remote: Or change your stack by running: 'heroku stack:set heroku-18'
remote: Verifying deploy...
remote: 
remote: !       Push rejected to サービス名.
remote: 
To https://git.heroku.com/サービス名.git
 ! [remote rejected] ブランチ名 -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/サービス名.git'
```
```
$ heroku stack:set heroku-18
Setting stack to heroku-18... done
```

これで、エラーを解消でき、再び入力するとデプロイが完成しました。

```
$ git push heroku ブランチ名:master
```


##参考記事

・[Heroku CLIの導入と初期設定](https://blog.katsubemakito.net/macos/setup_heroku-cli)
・[Heroku公式](https://devcenter.heroku.com/articles/container-registry-and-runtime#getting-started)
・[DockerでRailsの環境構築してHerokuへデプロイする](https://qiita.com/fuku_tech/items/dc6b568f7f34df10cae7)
・[【Docker】Rails圧倒的環境構築&Herokuへ簡単デプロイ](https://qiita.com/motty93/items/9ebe4ca06225c3242297)
・[Heroku - git push heroku masterするとEverything up-to-dateとなる](http://azuuun-memorandum.hatenablog.com/entry/2016/12/21/005926)
・[【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39)
基本情報技術者　テクノロジ系　第5章　正規化とSELECT文の記述

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより


# 正規化
データベースを扱いやすく、整理、分割していく方法

## 第一正規系
繰り返し項目を持たない

同じコマに、複数のデータが入ってる場合、一つだけのデータにすること

一人の顧客データに対し、買った商品のコマに複数の商品データが入ってる時
同じ顧客データ(レコード)を増やしてでも、商品データを分けていくなど


## 第二正規系
第一を満たし、主キーの一部だけに関数従属する(主キーに部分関数従属する)、非キー属性が存在しない

顧客データに対し、日時や名前など直接対応する表を先んじて分離すること

## 第三正規系
第二を満たし、主キーの一部だけに関数従属する(主キーに部分関数従属する)、非キー属性が存在しない

分離した表をさらに分離させること

# 記録の問題

## 重複更新
各書類に記載された書類の同じ名前を変えるなど
重複処理をすることなど

## 事前登録
処理の問題で事前に登録できた方が便利です。

## 関係喪失
意図しない形で、データを削除したら、連座で別のデータを消してしまうことなど。

# SELECT文の記述

## SELECT文
表示する列名を指定

## WHERE
条件を指定

## GROUP BY
グループ単位を指定する
DartのEnumが使いにくかった話

## DartのEnumは使いにく
僕はKotlinでのAndroidアプリ開発を生業としているのですが、最近はFlutterがマイブームで、Kotlinよりも触っている時間が長くなりつつあります。
僕はAndroidアプリの開発で、Enumの値に値を持たせる手法をよく使うのですが、Flutterでもそのような実装をしたいなあと思った時があり、特にググったりせずにとりあえず書いてみました。

```convenience_store.dart
enum ConvenienceStore(String name){
    SEVENELEVEN('セブンイレブン'),
    LAWSON('ローソン'),
    FAMILYMART('ファミリーマート')
    // 省略
}
```

Kotlinの知識から、Dartもこんな感じかなあというノリだったのですが、見事に撃沈。
`;`が期待されちゃってます...
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252756/6deb5381-2d67-ebc6-dd2f-107f217c2557.png", width="400"/>

それじゃあEnumの値に値を持たせるのってどうやるの？ということでいろいろ探してみたら、 `extension` メソッドを使えばそれっぽくなるらしいのでやってみました。

```convenience_store.dart
enum ConvenienceStore{
    SEVENELEVEN,
    LAWSON,
    FAMILYMART
    // 省略
}

extension ConvenienceStoreExt on ConvenienceStore{
  String get name {
      switch(this){
        case ConvenienceStore.SEVENELEVEN:
          return 'セブンイレブン';
          break;
        case ConvenienceStore.LAWSON:
          return 'ローソン';
          break;
        case ConvenienceStore.FAMILYMART:
          return 'ファミリーマート';
          break;
        }
        // 省略
    }
}
```

ひとまず怒られることはなくなりましたが、なんだか記述量が半端なく多いですね...
それはさておき、nameメソッドにアクセスできるようになりました！

```dart
print(ConvenienceStoreExt.SEVENELEVEN.name) // 'セブンイレブン'と表示される
```

## おまけ
Kotlinで同様のEnumを定義するとこのように書けます。

```kotlin
enum class ConvenienceStore(name: String) {
    SEVENELEVEN("セブンイレブン"),
    LAWSON("ローソン"),
    FAMILYMART("ファミリーマート")
}
```

うん、実家のような安心感。

## 感想
DartのEnumの発展を願っております。
i386.rpm is for architecture i386 ; the package cannot be built on this systemとなったときの対応方法

- 環境
    - EC2インスタンス : Ubuntu Server 18.04 LTS(64 ビット x86)
    - Alien version 8.95

# 事象 : rpmパッケージをdebパッケージに変換したくてAlienコマンドを使ったら怒られた

```bash
$ sudo alien -c oracle-instantclient12.2-basiclite-12.2.0.1.0-1.i386.rpm 
oracle-instantclient12.2-basiclite-12.2.0.1.0-1.i386.rpm is for architecture i386 ; the package cannot be built on this system
```

# 原因 : 32bit用のrpmを64bitの環境で変換しているから
`i386.rpm`ってなっているのは32bit用らしい。へーーーー。

- 参考
    - [Convert 32 bit rpm Packages to deb on a 64 bit System](https://www.maketecheasier.com/convert-32bit-rpm-to-deb-64bit/)
    - [使ってるUbuntuが64bitなのか32bitなのか確認する - Qiita](https://qiita.com/ottyajp/items/5fb5ce6cd452073bd822)
    - [【alien】パッケージの形式を変換する | 日経クロステック（xTECH）](https://xtech.nikkei.com/it/atcl/column/14/230520/072800002/)
    - [rpm のファイル名にあるi386とかi686とは](https://kazmax.zpp.jp/linux/linux.html)

```bash
# ビット数を確認してみる
$ getconf LONG_BIT
64
```

## 対応方法1 : tgzパッケージに変換してからdebパッケージに変換する

```bash
# tgzパッケージに変換してから
$ sudo alien -ct oracle-instantclient12.2-basiclite-12.2.0.1.0-1.i386.rpm 
oracle-instantclient12.2-basiclite-12.2.0.1.0.tgz generated
# debパッケージに変換する
$ sudo alien -c oracle-instantclient12.2-basiclite-12.2.0.1.0.tgz 
2-basiclite_12.2.0.1.0-2_all.deb generated
# できた
$ ls -la | grep basiclite
-rw-r--r--  1 root root 20911000 Mar  6 13:53 2-basiclite_12.2.0.1.0-2_all.deb
-rw-rw-r--  1 root root 22974764 Mar  6 12:38 oracle-instantclient12.2-basiclite-12.2.0.1.0-1.i386.rpm
-rw-r--r--  1 root root 28482082 Mar  6 13:36 oracle-instantclient12.2-basiclite-12.2.0.1.0.tgz
```

## 対応方法2 : 64bit用のrpmをとってくる
なぜかうっかり32bit用をとってくるのか・・・自分が憎い。
今回は、Oracle Clientのrpmなので、
[Instant Client for Linux x86 (32-bit)](https://www.oracle.com/database/technologies/instant-client/linux-x86-32-downloads.html)ではなく
[Instant Client for Linux x86-64 (64-bit) | Oracle 日本](https://www.oracle.com/jp/database/technologies/instant-client/linux-x86-64-downloads.html)からrpmパッケージをダウンロードしてくればエラーにはならない。

```bash
$ ls -la | grep rpm
-rw-rw-r--  1 root root 26731248 Mar  6 21:42 oracle-instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm
$ sudo alien -c oracle-instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm 
oracle-instantclient12.2-basiclite_12.2.0.1.0-2_amd64.deb generated
```

## 対応方法3 : (未実施)ファイルを書き換える
- [x64 Ubuntu でスケッチをビルドしてみました - GR-CITRUS - がじぇっとるねさすコミュニティ - Renesas Rulz - Japan](https://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-citrus/3447/x64-ubuntu)
- [64 bit - How do I convert a x86 RPM to a x86 DEB within a x64 system? - Ask Ubuntu](https://askubuntu.com/questions/322624/how-do-i-convert-a-x86-rpm-to-a-x86-deb-within-a-x64-system)
私はエンジニアになれるのか？

2020/6/20【追記】
1.投稿時のタイトルには①とふっていたのですが、消しました。
②が出てくることがあったらまたふります。
まだエンジニアにはなれていないので、続編があるかもしれません。
2.大幅な加筆修正をしています。文体も変わっています。

#何を書きたいのか

未経験からエンジニアになろうとした人間が
SESに入社し、エンジニアになるまでにしたこと。
入社はしていますが、まだエンジニアではないので現在進行中です。

#転職時の私

職業：パチンコホールのホールスタッフ
こちらの会社には新卒で入社しています。

スキル：
HTMLは中学生の時に勉強し、CSSも少しわかる程度。
Java,C言語は大学で入門レベルの講義を受けましたが、内容は覚えていません。
（配列という単語がある、ということを知っているレベル）
そのほかに情報系の素養はなく、
学生時代は文系で、数学も全く得意ではありません。

OS：
Windows。
Linuxはこれも大学の講義で少しだけ触ったことがあります。

バックグラウンド：
もともとパソコンが好きでした。
ただ、エンジニアになりたいと思ったのは大学４年の時でした。
当時も内定をいただいていましたが、事情があり入社しませんでした。

大学時代に、情報分野の講義を受けたのは興味があったからです。


#教材
- Udemy
- Youtube「ゲヱム道館 Gamedokan」
- progate「Java」
- Youtube「黒本先生のやさしくない！？Java」
- 本

基本的には内定が取れるまで仕事から帰って勉強する、の繰り返しでした。
勉強していますという姿勢を見せたくて、というのもありますが
入社前から大学や趣味で勉強してましたという人たちと一緒に何かしていくには
相応の努力が必要だと考えたからです。

###Udemy
はじめはC言語を学ぼうとしていました。
転職をする前の私は、何がメジャーな言語かを知らず、古めの言語を学べば基礎が身につくと考えたためです。

いざ参考書を買って読もうと思ったのですが、分厚くてひるみました。
そこで、Udemyで公開されている講義を見てみました。
確かに有料ですが、環境構築から動画で説明してもらえるので私のような初心者にはうってつけでした。

###Youtube「ゲヱム道館 Gamedokan」
Youtubeは、気軽にモチベーションを上げることができて好きでした。
Udemyの講義で例えば難しい概念を習っても、実際に使っているイメージがわきません。
「C++を使ってテトリスを作ってみた」などを見ると、ゼロからゲームができていく面白さが感じられて、もっと勉強したいと思いました。
ただ、動画を見ながらコードを写そうとしても、スピードにもついていけないし
文法をしっかり覚えてないせいで、写しているだけのはずなのに（！？）エラーばかり出た記憶があります。


###Progate「Java」
転職活動を本格的に始めてから、Javaがメジャーな言語であること、
入社したい会社の案件の半数がJavaであると知り、
急いでJavaの勉強を始めました。
ProgateはC言語を学んでいるときから、登録だけはしてある状態で、Javaのコースがあったのでまずはコツコツやっていくことにしました。
内定をいただいてからも２か月間、時間があったので、こちらもお金を払いオブジェクト指向で何度も躓いて復習するを繰り返していました。
セッターゲッターが難しかった記憶があります。
ただ、終わりかけまで進んだものの入社までに終わらせることができなかったので、入社後２週間で終わらせています。

でも、このProgateのおかげで入社後の研修が復習となり、研修自体は一応順調に進んでいます。
もし私が本当にまっさらな状態で研修を受けたなら、
概念を理解しかけている状態にすら、持っていけなかったとと思います。

###Youtube「黒本先生のやさしくない！？Java」
研修中に出会いました。
オブジェクト指向や、ジェネリクス、ラムダ式？の話などもしてくれています。
（私にはラムダ式は全く分かりません）
研修中、自作アノテーションを作る問題に全く歯が立たなかった私は、
ヒントにある「ジェネリクス」を理解したくて、こちらにたどり着きました。

なぜ無料なのかと声に出して叫びたい。本当にありがとうございます。
メソッドの話でスタックの話をしてくれます。
スタックとキューという単語、その意味は知っていたけれどメソッドの呼び出しがスタックなんだよというところまで結びつかなかったのですごく感動しました。

それから、始めは黒本さんという方なんだと思っていましたが、
Javaの資格試験の参考書、通称「黒本」を書いている方と気づくのに割と時間がかかりました。笑
黒本も買いました。

###本
- 基本情報技術者試験の本（栢木先生の～)猫がかわいい
- ネットワークの絵本
- C言語（結城浩）
- Cプログラミング専門課程（読んでない）
 
入社前はJavaの本を購入していないのは反省点ですね。
Progateだけでは、理解力に乏しい私はうまく進まないのに、
体系立った知識はProgateからのみのため、進めにくかったのだと思います。
入社してからは「すっきりわかる」シリーズとか「Javaの絵本」とか購入しています。
本がすごい勢いで増えてしまって困っています。
タイトルがうろ覚えなので、あとで編集します。

#開発環境
VisualStudio とVScodeのどちらもインストール済みですが、違いはよくわかりません。
VisualStudioのほうが重いみたいで、高性能なのかもしれません。
でも今のところ、コードを書いて実行はできるのでいいかなと思います。
いろいろ拡張機能とかあるみたいでインストールしたりしましたが、ちょっと疲れてしまったので最近はネット上でコンパイル＆実行できるものを使っています。

（MinGWの設定も書いてある通りに進めただけで結局パスを通すってなんだ…？状態）
→研修でわかりました！「ここから探して！」と探したいフォルダを指定することだと認識しています。

研修では、Eclipseを使用しています。
体裁も整えてくれるし、補完もしてくれますが、初心者の自分にとっては文法を覚えずに突っ走ってしまうので
プライベートではあまり使わないようにしています。



#2020年6月現在
コロナの影響もありましたが、３月末に内定をいただき
2020年6月にエンジニアの会社に入社することができました。
ただいま研修中です。
これからも勉強頑張ります。
オープンソースのCPUの除算性能 RISC-V vs ICF3-Z 

## はじめに
2020年1月15日に[8bit CPU ICF3-Z](https://icf3z.idletime.tokyo/)を制限の緩いオープンソースのライセンスで公開しました。
この記事はQrunchに2020年2月1日に投稿したものと同一です。

CPUのようなハードウェアもオープンソースな時代になってきました。CPUのオープンソースで最も有名なのはRISC-Vです。RISC-Vを見てみるとオープンソースによるメリットを見つけることができます。RISC-Vは、とても広い範囲をカバーする32bit(64bit)のCPUですが低性能な領域でも万能というわけではないように思います。

例えば通信系のハードウェアでは8bit単位で処理するものもあり32bitが無駄になる場合もあります。無駄になるだけなら問題はありませんが消費電力で不利です。

一方、8bit CPUは除算命令がなかったり、除算命令があっても8bit÷8bitで、使える範囲が狭いということがありました。8bit CPUのオープンソースも既に複数、存在していますが、高性能な除算を持ったものは、あまりないように思います。ICF3-Zはオープンソースで、少ないトランジスタ数であるにもかかわらず高速な除算が可能です。

## 除算性能の比較
**実際に比較しないと、わからない人が多いと思っています。** ICF3-ZのZeviosを小型のRISC-VコアであるlowRISCのibexと比較してみました。 ICF3-ZのZeviosは8bit CPUですが、lowRISCのibexは**除算器を持った32bit CPU**です。

lowRISCの[Webページ](https://www.lowrisc.org/blog/2019/06/an-update-on-ibex-our-microcontroller-class-cpu-core/)にXilinxのローエンドのFPGA(7シリーズ)に実装した場合の周波数が50MHz、面積2500LUTと書かれてありました。 除算のサイクル数は[別のページ](https://ibex-core.readthedocs.io/en/latest/instruction_decode_execute.html#multiplier-divider-block-mult-div)に37サイクルと記述されています。

Zeviosは同じくXilinxのローエンドのFPGA(Artix-7)に実装した場合、周波数は150MHzになります。つまりibexの3倍の周波数で動作します。ibexが1命令を実行するのにZeviosは3命令を実行できる。

|除算| ibex<br>RISC-V<br>[サイクル]|Zevios<br>ICF3-Z<br>[サイクル]|ibexを1<br>とした<br>倍率|周波数を<br>考慮した<br>倍率|
| --- | --- | --- | --- | --- |
|16bit÷8bit|37|20|1.85|5.55|
|24bit÷8bit<br>条件付き|37|21|1.76|5.29|
|32bit÷8bit|37|55|0.67|2.02|
|32bit÷16bit|37|約350|0.11|0.32|

0除算などのチェックや演算レジスタへのロード、ストアの補正として3～6サイクル追加しています。
ZeviosはXilinxのFPGA XC7A35TICSG324-1Lに実装した場合です。

## まとめ
ibexは2500LUTの面積ですが、Zeviosは400LUTの面積です。 外部I/OなどZeviosに不足しているものがあるかもしれませんが**5分の一の面積で5倍以上の性能が出る**ことは、考えるべき点ではないでしょうか。16bit÷8bitは32bit CPUであるRISC-Vに不利ということはありますが、制御など32bitの精度が必ずしも必要ない場合もあるように思います。

ICF3-Zは海外のパクリな構造ではなく僕の考えた独自アーキテクチャです。疑似パイプラインによって高周波数で動作することも、この圧倒的な面積当たりの性能(25倍)に貢献しています。

このオープンソースな8bit CPU ICF3-Zが、期待を含めれば2020年代に大きく産業に貢献していくかもしれません。

## 参考リンク
[8bit CPU ICF3-ZのZeviosの除算性能のメモ](https://crieit.net/posts/8bit-CPU-ICF3-Z-Zevios)

[8bit CPU ATmega328の除算性能を測定してみた](https://crieit.net/posts/8bit-CPU-ATmega328)

[仮想マシンの加速支援機構つきの新型8bit CPU](https://icf.hatenablog.com/entry/2019/04/16/181417)
基本情報技術者　テクノロジ系　第3章　コンパイラの原理

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより

# コンパイラの原理
コンパイラはコンパイル(プログラムを機械語に変換)する機能のこと

午後試験では、プログラムの機能について学びます。

## 最適化の方法の例

### 関数のインライン展開
指定した場所に関数(プログラム)を展開する。

### 共通部分式の展開
前後で内容が変化しない式がある時
変数に設定して、式を省略する。

例
x + yが多数の箇所で使われている場合
t = x + y
と変数に設定して
tという形で省略するなど

### 定数の畳込み
プログラム内に事前に計算結果を登録しておく方法

### 定数伝播
変数を定数で置き換える

### 無用命令の削除
不要プログラムの削除

### ループ内不変式の移動
ループ内で変化のない式は
ループ外に置いておく

### ループのアンローリング
ループ中の繰り返し処理を展開

forなどの繰り返し処理を使わず
同じ処理を一処理一処理を直に書いていると言えばわかりやすいかと。
VSCodeとNPMのくだらない使い方

##`VSCode`に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/3decfe6d-c7d8-ad74-a0c3-57b26df62cca.png)

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

##`NPM-Scripts`を入れて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/dc200258-dc74-fd6e-f75d-3a2838c259e7.png)


https://marketplace.visualstudio.com/items?itemName=traBpUkciP.vscode-npm-scripts

##`Package.json`に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/d4b22ccb-6b48-3195-288e-c6b1ba32f9ba.png)

##こんなのを書くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/1a832525-b76a-792c-b78c-fd388b2d50d8.png)

##こうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/74e67323-8405-b277-c4a7-28e2a6286bb8.png)

##お手元にローカルホスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/47afadaf-df64-9922-388d-64fb20e8bdcc.png)

##これがあれば誰でもnpmを使えます。

そもそも、こんな`package.json`をコミットする勇気はないんですが…
以上です。
CSS/stickyについて知るべき事はそんなに多くない。

####テーマ
　position:stickyをどれだけ深く掘り下げたところで、落ち着く先のパターンなんか一つや二つ。
　まずは使い方のアイデアを練って、それを可能にする。たったそれだけのお話に必要な知識はせいぜい↓こんなもの。

#####1.　sticky(z-index:2)に妹relative（z-index:1）を作る。
　stickyがうまく機能しない場合、「ブラウザがIEではないか。」→「stickyの後ろ（同じ親）にrelativeやstickyはあるか。」→「z-indexは正しい指定になっているか。」をチェックする。

#####2.　困った時はfixed(overflow:auto)を併用。
　最前面に配置する要素がtop:0でなく、且つ妹relativeを配置している場合、その妹は兄貴の下をくぐり抜けてしまう。
　これを防ぎたい場合は、兄stickyの代わりに親要素にposition:fixed;overflow:auto;top:hogeを指定し、兄はtop:0にする。

#####3.　href=#idはjsで補う。
　stickyとhref=#idの相性は悪い。
　ページ下部の一族を表示している時にページ上部の一族へjumpすると、妹が兄貴に隠れてしまう。
　header(fixed)+article(absolute)のケースと違い、
　margin-top:-25px;padding-top:25pxでは不十分なので、
　jsでlocation.href='#';location.href='#id'を並べ、そのついでに親要素.scrollBy(0,-25)で微調整するのが手っ取り早い。

####サンプル
<img width="623" alt="スクリーンショット 2020-03-06 22.09.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558375/bc1dbae6-e2a1-00f9-3c4c-0db5ab4bc338.png"><img width="614" alt="スクリーンショット 2020-03-06 22.10.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558375/b7440618-57e3-f217-3737-ad52df4520ff.png">


　上の画像のように、爺さん[例:2]からそのひ孫[例:2111]を常に綺麗に表示するsticky-list（上述した3つの観点を網羅）のサンプルコードは以下。
　href=#id機能は使わず、list表示のみを行いたい場合は、コメントアウトで挟んだ部分は削除可。

```html
<meta charset=utf-8>
<style>
*{margin:0;padding:0;box-sizing:border-box}
ul{list-style:none}
#i1{position:fixed;left:20%;width:60%;top:20%;height:60%;overflow:auto;padding-bottom:300px}
#i1 ul ul{padding-left:50px}
#i1 li{z-index:1;line-height:25px}
#i1 li.t{position:sticky;z-index:9;top:0;background:#bbb}
#i1 li li.t{z-index:8;top:25px;background:#ccc}
#i1 li li li.t{z-index:7;top:50px;background:#ddd}
#i1 li li li li.t{z-index:6;top:75px;background:#eee}
/*****textbox*****/
#i3{position:fixed;left:20%;width:60%;top:80%;height:25px;line-height:25px;text-align:center}
/****************/
</style>
<body>
<ul><li id=i1><li id=i2></ul>
<script>
const i1=1,i2=2,i3=3,lm=3,um=333;
window.onload=st;
function st(){wa()/**/;wt()/**/}
function wa(){ih(i1,ml(0))}
function ml(n){var c='<ul>';for(var i=1;i<=lm;i++){var n2=(n*10+i);
c+='<li class=t id=l'+n2+'>'+n2+(n2<=um?'<li>'+ml(n2):'')}return c+'</ul>'}
function ih(n,c){id(n).innerHTML=c}
function id(n){return document.getElementById('i'+n)}
////////textbox///////
function wt(){ih(i2,'<textarea id=i'+i3+' onkeyup=oku() placeholder=1〜3333のIDを半角入力し改行></textarea>')}
function oku(){var n=gv(i3);if(0<n.indexOf('\n')){n=n.replace('\n','');id(i1).scrollTop=0;
location.href='#l'+n;id(i1).scrollBy(0,0-(n<10?0:n<100?25:n<1000?50:75));wv(i3,'')}id(i3).focus()}
function gv(n){return id(n).value}
function wv(n,v){id(n).value=v}
//////////////////////
</script>
</body>

```

メモ張にコピペしてdesktopに「stk.html」で保存。
Azure Data FactoryでPower BIデータセットを更新する

#概要
Azure Data Factory(以下、ADF)でETLパイプラインを実行後、Power BIの更新までを実施します。
参考リンクでは更新をコールしたあと、更新結果まで確認していなかったので更新結果確認を追加しています。参考記事ではAzureKeyVaultで各ID,キーを保護しています。今回は簡単に作りましたが、参考記事のようにAzureKeyVaultを利用するほうがおすすめです。

##参考
[How To Trigger A Power BI Dataset Refresh Using An Azure Data Factory Web Activity](https://www.moderndata.ai/2019/05/powerbi-dataset-refresh-using-adf/)

#注意事項

 - ADにセキュリティグループ、サービスプリンシパルが必要です。
 - セキュリティグループをPowerBIのAPI許可グループに追加する必要があります。※Power BIのテナント設定の変更が発生します。

#方法
参考記事に従い、サービスプリンシパル等の準備を完了次第、下記ソースコードをADFにインポートしてください。
##ソースコード
[pipelineのjsonをダウンロード](https://github.com/ryoma-nagata/MyDataFactory/blob/master/process-powerbi/ProcessPowerBI.json)

#関連
Azure Data FactoryでAzure Analysis Servicesを更新する方法
[Automating Azure Analysis Services - Code Samples](https://github.com/furmangg/automating-azure-analysis-services)
OpenSSL 3.0.0 は Apache 2.0 ライセンス

タイトルの通りなのですが、これは嬉しい。今まで気付かなかった。結構話題になってたのかな？

OpenSSL のライセンスは扱いづらかったので。

[スクリプト言語 KINX](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76) という個人プロジェクトで libcurl 入れたら夢が広がるなー、と思って流れで OpenSSL の最新を確認して発見。

今のところ問題なく動いてる。

何か OpenSSL 3.0.0 で気づいたことがあればまたメモしておこう。
Cloud Endpoints Frameworkで任意のステータスコードを返す

## 概要

GAEで使用できるCloud Endpoints Frameworkは、デフォルトだとなぜか500系をすべて503で返すような仕様になっており、500と503を分けたいときなどに迷惑な動きをします。
コードを読んだ結果、この挙動を変更出来そうだったので備忘録として残しておく。

## サーブレットの設定を追加する

結論から言うと`web.xml`に`enableExceptionCompatibility `というパラメータを設定すると、設定したステータスコードでレスポンスを返す事ができるようになる。

```xml
<servlet>
    <servlet-name>EndpointsServlet</servlet-name>
    <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
    <!-- ここにパラメータを追加 -->
    <init-param>
        <param-name>enableExceptionCompatibility</param-name>
        <param-value>false</param-value>
    </init-param>
</servlet>
```

## 実装

例外が投げられたとき、com.google.api.server.spi.response.ErrorMap#getHttpStatusにステータスコードが渡されて、500系を503に変更するような処理が走ります。
このメソッドの先頭でチェックしている `enableExceptionCompatibility` という変数がサーブレットの設定を読み込んで設定されるため、上記の設定をすることで指定どおりのステータスコードをレスポンスに設定するようになります。

```java:com.google.api.server.spi.response.ErrorMap.java
public int getHttpStatus(int lilyStatus) {
  if (!enableExceptionCompatibility) {
    return lilyStatus;
  }
  if (lilyStatus >= 500) {
    return 503;
  }
  Error error = errors.get(lilyStatus);
  if (error == null) {
    return 404;
  }
  return error.httpStatus;
}
```

## 2020/03/12追記

### Guiceを使う場合

Guiceを使う場合は`EndpointsModule`を継承したクラスの中で以下のように初期パラメータを設定する。

```java
ServletInitializationParameters initParameters = ServletInitializationParameters.builder()
        .addServiceClasses(ImmutableList.of(
                HogeHogeApi.class
        ))
        .setExceptionCompatibilityEnabled(false)
        .build();

configureEndpoints("/_ah/api/*", initParameters);
```
初心者でも簡単！SNS認証を実装（API側（Faceboook）の設定編）

# はじめに
今回はAPI側（Faceboook）の設定をしていきますね。

そもそもAPIとはなんですかという話なのですが、

「API」とは、「Application Programming Interface」の略で簡単にいうと、
「「アプリケーション」と「プラグラム」を繋ぐもの」という認識でいいと思います。（間違っていたら教えてね（笑））

今回は「Facebook」とプログラムを繋ぐ設定をしていきます。

# API側の設定
では、やっていきましょう。




まず、
https://developers.facebook.com/
にアクセスします。
アクセスしたら、facebookへログイン後、ナビバーの[マイアプリ]メニューをクリックし、[新しいアプリを追加する]をクリックすると、以下フォームが表示されます。

表示されたら以下に従い、アプリ名とメールアドレスを記入し、記入し終えたら[アプリIDを作成してください]をクリックします。
<img width="1280" alt="スクリーンショット 2020-03-06 21.49.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591360/f0859c02-459b-032c-a357-2b248c62e280.png">



画面左の[設定]を選択し[ベーシック]をクリックします。すると[アプリID]と[app secret]がそれぞれ記載されてるページに移動します。両方とも後で使います。コピーしてメモ帳などに記載しましょう。

<img width="1280" alt="スクリーンショット 2020-03-06 22.15.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591360/ea1d7c3f-b84a-0268-3792-baf9224c3554.png">

画面下にスクロールし、[プラットフォームを追加]をクリックしてください。すると以下のような画面が表示されますので、[ウェブサイト]の欄を選択しましょう。

<img width="1279" alt="スクリーンショット 2020-03-06 22.20.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591360/6f95882c-bccf-7961-f3f6-8c2ceb7aecea.png">

以下のような入力欄が表示されますので、[サイトURL]の部分に自分のアプリのURLもしくはローカル環境なら、[http://localhost:3000/](http://localhost:3000/)を記入し[変更を保存]をクリックします。

<img width="1277" alt="スクリーンショット 2020-03-06 22.30.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591360/cae6a6bf-7c43-1850-3cb4-64e988f4647a.png">




以上でFacebookの開発者サイト上の設定は終了です。


次回はGoogleのAPI側設定を投稿します！！
rex0220 計算式プラグインでテーブル行番号付与

計算式プラグインでテーブル行番号を付与出来ないかと相談を受けたので、やってみました。
テーブル行を追加・削除時に、行番号を付与します。
既存レコードのテーブル行番号付与も簡単です。

# テーブル行の追加・削除操作例

![2020-03-06_22h09_56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/744beb43-a66c-ebea-427f-eea7a8c11288.gif)

# 環境

- [kintone](https://kintone.cybozu.co.jp/) 
- [計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73) 標準機能に無い、いろいろな計算式を指定可能なプラグイン

# アプリ設定

テーブル内に、数値項目で行番号を配置します。

<img width="901" alt="2020-03-06_22h11_56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/67004932-a1a9-79e3-1c44-b189da56a46d.png">


# 計算式プラグインの設定

![2023-06-25_21h32_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/37ebde87-0001-8cd7-62dc-8331d5e4ac3e.png)

## 行番号の計算式

- 行番号項目に、計算式を設定します。<br>
ROWNO(Table)+1

※ROWNO関数は、指定されたテーブル項目の０から始まる行位置を返します。

# 既存レコードのテーブル行番号付与
あとからテーブル行番号を付与した場合、既存レコードを一括計算で設定できます。

## 一括計算のプラグイン設定

- ボタン設定
<img width="1001" alt="2020-03-06_22h16_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a7fb4080-3782-35b9-e92d-a2d18926fd8c.png">

- 一覧別設定
<img width="995" alt="2020-03-06_22h17_23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/87be77b0-99ce-4d73-25b1-0893f526ed52.png">

## 一括計算の操作


![2020-03-06_22h24_15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/816ba0c6-c17a-7ec2-cb98-bc2c0248f432.gif)
アノテーションとラベル

#はじめに
kubernetesでは、各リソースを分類するタグみたいなもの（メタデータ）を付けることができます。
そのタグには「アノテーション」と「ラベル」の二種類があるので、違いやユースケースをまとめます。

#アノテーション
アノテーションは「metadata.annotations」に設定できるが、ユーザーが設定するというよりは、システムが自動で付与するもの。
※ユーザーが設定することもできる。

##ユーザーが設定する
以下のようにyamlファイルに書いて設定できる。特に意味を持たないメモ書き的に利用することが多い。

```sample-anno.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-web1
  annotations:
    ann1: value1
    ann2: value2
spec:
  containers:
    - name: nginx
      image: nginx:latest
```

##システムが自動で設定する
上記のyamlファイルでデプロイしたPodを確認すると、自動で設定されたアノテーションが確認できる。

```
$ kubectl get pod sample-web1 -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    ann1: value1　　<- ユーザが設定
    ann2: value2　　<- ユーザが設定
    cni.projectcalico.org/podIP: 192.168.69.238/32  <- システムが設定
    cni.projectcalico.org/podIPs: 192.168.69.238/32  <- システムが設定
    kubectl.kubernetes.io/last-applied-configuration: <- システムが設定|
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"ann1":"value1","ann2":"value2"},"name":"sample-web1","namespace":"default"},"spec":{"containers":[{"image":"nginx:latest","name":"nginx"}]}}
  creationTimestamp: "2020-03-06T12:50:14Z"
  name: sample-web1
・・・
```

この特性を活かして、AWSはGCPなどのマネージドKubernetesサービスで利用されているらしい。（未確認）
Kubernetesは「Build once, run anywhere」（だっけ？）が求められるので、例えばAWSでビルドされたイメージはAWS以外でもデプロイできないといけないので、環境依存がある設定にアノテーションが使われている。

なので、ユーザー自身が何かしら環境依存のあるシステムで使わない限りは意識する必要がない（と理解した）。

#ラベル
ラベルはその名の通り、各リソースにラベルを付けることができる。「metadata.labels」で設定する。

```sample-label.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-web2
  labels:
    label1: sysA
    label2: prd
spec:
  containers:
    - name: nginx
      image: nginx:latest
```

```
$ kubectl get pod -L label1,label2
NAME          READY   STATUS    RESTARTS   AGE   LABEL1   LABEL2
sample-web1   1/1     Running   0          25m
sample-web2   1/1     Running   0          52s   sysA     prd
```

ユースケースとしては、システムごと（sysA, sysB, sysCなど）、環境ごと（prd, stg, devなど）なんかが考えられる。


ラベルを基にReplicasetを作成したり、LBが転送したりするようなので、これらを試すときに意識しておこう。
Android Studio:Buttonに画像つける

最初はImageButtonつかってたけど文字もつけたくなったのでButtonに戻しました。

```xml:button.xml
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="testtesttest"
        android:drawableTop="@drawable/ic_android_black_24dp"
        android:drawableBottom="@drawable/ic_android_black_24dp"
        android:drawableEnd="@drawable/ic_android_black_24dp"
        android:drawableStart="@drawable/ic_android_black_24dp"
        android:background="@drawable/button_shape"/>
```

これでdrawable/ic_android_black_24dpが上下左右に表示できます。
backgroundに画像指定すると画像がテキストの下にでます。
今回はSVGでやりました。fillcolorで色が簡単に変えられるのでいいですね。

あとbackgroundで指定したやつでbuttonに枠付けたりbuttonの角を丸くしたり、背景塗ったりできます。

```xml:button_shape.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#ffffff"/>
    <corners android:radius="20dp"/>
    <stroke
        android:color="#ffffff"
        android:width="2dp"/>
        </shape>
    </item>
</selector>
```
MATLAB歴3年の私が、新しくPythonを勉強した話

#1. Pythonを学ぶ経緯
私は、今年の4月に就職を控えた理系の大学院生です。
研究室生活の3年間、MATLABを使って、シミュレーションを行ってきました。

これまでは、大学がライセンスを保有するMATLABを使ってきましたが、
社会人になると、MATLABを利用できなくなってしまうので、
フリーで利用できるPythonを、先日、新しく学ぶことを決めました。

まず初めに横浜の有隣堂に行き、Pythonの参考書を全て手にとって、
自分に合っていそうな参考書を選びました。

そうして選んだのが、西晃生先生が書いた
[『これ以上やさしく説明できない！Pythonはじめの一歩』](https://www.natsume.co.jp/books/e/10575)
です。分かりやすいのでオススメです！

#2. Pythonを学んで思ったこと
実際に、Pythonを学んで私が思ったことを書いていきます。

率直に言うと、MATLABと似ていて学びやすいなと思いました。
インタプリタ型で、且つ、それほど難しい概念が出てきませんでした。

ただその中でも、苦戦したことが2つ程あり、それらを紹介したいと思います。

##2.1 配列のインデックスの始まりの数字
まず一つ目が、配列のインデックスについてです。
MATLABでは、インデックスが「1」から始まりましたが、
Pythonでは、インデックスが「0」から始まります。
これは正直、今でも慣れないですね。

```MATLAB:number.m
%MATLABの場合
number = [1,2,3]
%1を指定するインデックスは1(number[1]=1)
%2を指定するインデックスは2(number[2]=2)
%3を指定するインデックスは3(number[3]=3)
```

```Python:number.py
#Pythonの場合
number = [1,2,3]
#1を指定するインデックスは0(number[0]=1)
#2を指定するインデックスは1(number[1]=2)
#3を指定するインデックスは2(number[2]=3)
```

##2.2 クラスの概念
そして二つ目が、クラス(とオブジェクト指向)についてです。
これまで、大規模なシステム開発などをしたことがなく、
研究室でシミュレーションプログラムを書く際も、
とりあえず動けばいいというスタンスでやってきたので、
なかなか理解ができませんでした。(今でもかなり怪しいです)

参考書に加えて、[「クラス」って必要？def関数でいいんじゃない？](https://snowtree-injune.com/2019/02/11/python-class-necessity/)も参考にしながら、
「クラスって、お互いに関係するデータと関数をまとめて、コードを読みやすくするための
ものなんだなぁ」と何となく納得しました。

#今後の目標
今後はPythonならではの色々なライブラリを利用してみたいと思っています。
特に、機械学習には強い関心があるので、TensorFlowなどを使ってみたいです。
学び合う会 #貿易統計 はじめに

[学び合う会　#貿易統計](https://www.kaggle.com/zanjibar/manabiai-1)　メモ

# はじめに

- kaggle に[日本の貿易統計のデータ](https://www.customs.go.jp/toukei/info/index.htm)をアップして4年なりますが、ほとんど興味をもたれないないので、業をにやして勉強会をはじめました。
- テレビのニュースで、貿易は毎日のように報道されているのに、実際のデータに触れる人はとてもまれです。日本に限らず、英語圏でもあまりいないようです。貿易統計について、国連のデータが[kaggle があがっていますが、正確さに問題があるようです。](https://www.kaggle.com/unitednations/global-commodity-trade-statistics/discussion/58902)　私があげているのなら、しょうがないですが、見た目、国連があげているデータに問題があるのは困ったことです。
- また、[日本の貿易統計](https://www.customs.go.jp/toukei/info/index.htm)はきちんと毎月アップしていて質がいいデータだという気がします。それを活用しないのはもったないと思っています。

# 貿易統計は面白いか？　もちろん面白いです。
- 高級牛肉を日本から一番購入する国はどこでしょうか？　モーニングサテライトの質問（[モーサテＱ](https://www.tv-tokyo.co.jp/nms/data/)）でやっていました。なんとカンボジアです。
- なんと日本が競走馬を輸出しています。なぜでしょうか？　調べてみてください。
- 多大な外交努力をして、ＴＰＰ，ＥＰＡ、ＦＴＡなどの貿易協定を締結しています。きちんと検証しているのでしょうか？
- なんで、中国は、パラキシレンを日本（韓国からも実は輸入しています。）から輸入しているのでしょうか？　ペットボトルの原料です。中国でなぜつくれないのでしょう。（さすが、最近はつくっているようです。）
- 生きたイルカを韓国に輸出です。なぜでしょうか？
- 多くの人がかかわってくれれば、もっと面白いこと。重要なことを発見できるでしょう。単純集計で十分面白いです。

# 貿易統計のkaggle へのアップは、教材用データを探したのが原点です。
- 教材用データは面白くありません。大きいデータでもなく、古いし、内容的にも何か発見できるわけではないです。
- いろいろ探してみつけたのが、貿易統計です、ＣＳＶで公開されているので、まとめると、十分に大きく、毎月更新されて新鮮です。そして、面白いです。

# kaggle にあげている貿易統計のデータはどんなものか？　今は、sqlite3 形式
- いろいろ試行錯誤して今、kaggle にアップしているデータは、sqlite3 形式です。（ＣＳＶでもアップしています。）
- なぜ、sqlite3 にしたかは、オンメモリを避けるためです。kaggle で主流の pandas はデータをオンメモリにします。大きなデータは複数あけるとあっという間にメモリが不足します。sqlite 形式なら、オンメモリでなくデータを開くことが可能です。
- sqlite3 にしたもう一つの理由は、データ配布です。sqlite3 を扱うアプリケーションがたくさんあります。CSV の形式だと500メガぐらいになると非常に扱いずらくなります（エクセルで開くことができません）。データ形式として、sqlite3 にしておけば、少しの学習コストで抽出だけならなんとかなります。そのため、配布形式としても結構

# 学び合う会 #貿易統計　は　現時点で何を目的とするのか？　とりあえず私が望んでいること
### 教材用データ：
 - sql,power bi,tableau public で使われる標準的な教材用データになる
 - 前処理用のよいデータ（貿易統計はいろいろ問題があります。それを回避するのは前処理のよい訓練です。）

### 政策に使えるアウトプット
 - きちんと集計してわかりやすく提示できれば、政策に使えるレベルまで行ける気がしています。
 - (例) 台湾との貿易を増やしてより緊密な関係を築く、中国依存を減らす、地域の輸出品をもっと増やすにはどうしたらいいかなどなどです。
DNSを更新した後、反映するまでまつシェルスクリプト


```
DOMAIN=hogehoge.varvarcom
bash -c 'while true; do if [[ `dig +short $DOMAIN | tail -n1` == "" ]]; then sleep 1; continue; fi; dig +short $DOMAIN; break; done'
```

Route５３では、大体５分くらい待つと、反映されます、多分。（なんかすぐに反映されることもある。


## 参考文献
- https://unix.stackexchange.com/questions/426693/how-to-extract-just-the-ip-address-from-a-dns-query
いつの間にかメーラーを起動するIntentの推奨形式が変わっていて件名や本文が入力されなくなっていたので対応した

## 発覚の経緯
普段作っている個人アプリでは、ユーザーからのお問い合わせを送ってもらうためにメールを使っています。

機能としてはただメーラーを開くだけでなく、件名や本文に任意の内容を自動で入力するようにすることで基本的な情報の問診の手間を省いていました。

3年位は問題なくお問い合わせメールが届いていたのですが、ある時から急に件名と本文の入力がないメールが来るようになりました。

最初のうちはユーザーが消してから送ってきたのかなと思っていたのですが、日に日に多くなってくる様子から何か起きていると判断しました。
手元で確認したところ、読みどおりにメールアドレスしか入力されていないメールがGmailで生成されるようになっておりました。

## 修正方法
### before
メールを起動するIntentは随分昔から使っている、インターネットのどこからコピーしてきたかも思い出せないものでした。
このコードでも少なくともいっときまでは問題なく動いていたはずです。

```kotlin
fun createMailIntent(address: String, subject: String, text: String): Intent =
    Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:$address")
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_TEXT, text)
    }
```

### after
何はなくとも困ったときのGoogle公式ドキュメントです。
https://developer.android.com/guide/components/intents-common?hl=ja#Email

いつの間にか `Uri#parse`に書くべきは`"mailto:"`までになっており、代わりにアドレスは`Array<String>`として`Intent#putExtra`に`Intent.EXTRA_EMAIL`というキーと共に渡すのが推奨形式となっておりました。

というわけで対応するように修正したのが下記のコードになります。

```kotlin
fun createMailIntent(address: String, subject: String, text: String): Intent =
    Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:")
        putExtra(Intent.EXTRA_EMAIL, arrayOf(address))
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_TEXT, text)
    }

```

## おわりに
そもそもお問い合わせの数が多くないことに加え、クラッシュもしていなかったおかげで発見が遅れてしまいました。
また、外部アプリ連携が必須なため、テストの自動化も難しく防ぐ術があったのかは今でも分かりません。
唯一出来たとするならば（当時のGoogleのドキュメントが正しかったかは分かりませんが）どこの馬の骨ともわからないコードを拾ってこずに、まずはGoogleの公式ドキュメントを参考にするくらいかなと思います。

とても地味ではありますが、アプリにメーラーを起動するIntentの処理がある場合一度見直しておくと良いかもしれません。
rex0220 計算式プラグインでテーブル行複写

計算式プラグインで行複写出来ないかと相談を受けたので、やってみました。
テーブル行を追加時に、１行前の項目値を複写します。

# 行複写の操作例

![2020-03-06_21h44_04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c397756c-e892-c792-39d5-37bf2aac8e5d.gif)


# 環境

- [kintone](https://kintone.cybozu.co.jp/) 
- [計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73) 標準機能に無い、いろいろな計算式を指定可能なプラグイン

# アプリ設定

テーブル内に、文字列、ドロップダウン、チェックボックスと複写制御用の文字列項目を配置します。

## フォーム設定

<img width="826" alt="2020-03-06_21h15_49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/94c598af-7ef1-305f-c536-c3c1ae5752e0.png">

## 複写制御用の文字列項目
初期値を"0" にします。計算を最後にするため、テーブルの右端に配置します。
タイプは、文字列・ドロップダウン・ラジオボタンでもOKです。

<img width="538" alt="2020-03-06_21h27_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9f109e1c-cfe0-9bf2-b798-b9bdf7769d98.png">


# 計算式プラグインの設定

テーブル内の複写対象項目と複写制御用項目に、計算式を設定します。

- 「循環参照を許可」をチェックします。
- 行複写対象の項目は、計算式を設定し「編集」をチェックします。



<img width="996" alt="2020-03-06_21h20_56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/15cbf28d-f913-d01d-f777-1b725170e409.png">

## 文字列項目T1
2行目以降で、複写制御=="0" の場合、１行前の値を設定
それ以外は、自項目を設定

- 文字列項目T1<br>
IF(AND(ROWNO(複写制御)>0,複写制御=="0"),<br>
SUBTABLE(文字列T1,ROWNO(複写制御)-1),文字列T1)


## ドロップダウンT1
ドロップダウン・ラジオボタンは、文字列項目と同様です。
 
- ドロップダウンT1<br>
IF(AND(ROWNO(複写制御)>0,複写制御=="0"),<br>
SUBTABLE(ドロップダウンT1,ROWNO(複写制御)-1),ドロップダウンT1)


## チェックボックスT1
複数の値を持つチェックボックスや複数選択項目は、ARRAY関数で設定します。

- チェックボックスT1<br>
IF(AND(ROWNO(複写制御)>0,複写制御=="0"),<br>
SUBTABLE(ARRAY(チェックボックスT1),ROWNO(複写制御)-1),
ARRAY(チェックボックスT1))

## 複写制御
計算処理済み"1"にします。非表示をチェックします。
 
- 複写制御<br>
"1"