OmniAICreator/Qiita-1.07M huggingface dataset:
プログラムの書き出しの話

最近、プログラムをやっていて思うのであれば、
自分が中学校の時に、初めて触ったプログラムはN80-BASICというやつなのであるが
いまでも覚えているが、下記の書き出しが頭の中に完全に入っていた。

```N80BASIC

WIDTH 80,25
CONSOLE 0,25,0,1
LOCATE 0,0
PRINT "HELLO WORLD"

```

もちろん、あの頃はこのコードを打ったところで、
インタプリタが無機質なカーソルを示すだけで、
何のヘルプもでないのであるが。。。

いわばプログラムの書き出しというやつは
今でも同じで、本当に無機質な奴だ。

さて、今日のお題ではあるが、
新しいプログラム言語、開発環境で始まるのは、
やはりプログラム君こんにちわのような、
挨拶が重要なのである。

別にプログラムの世界だけでなく、実際の世界でも
挨拶一つが通じれば、相手は何らかの話をしてくれるだろう。

もしも、何も分からずに、ただただ相手に近づいたとしても、
それこそ、チンプンカンプンとばかりに、困った顔をされるか、
酷い場合には、あっちへ行けと追い返されるだけである。

話が少々、脱線するが・・・

俺が始めて大学の卒業旅行に行ったとき、アメリカの空港のトランジットで
チケットを自分のキャスターケースに預けてしまって、
そして空港カウンターの黒人の女性に、何とか危機を説明したのであるが、
「ノーチケット！ノーライド！」
といって、本当に追い返されたことを、いまでも覚えている。

その後は、空港のヘルプデスクから日本語が使えると思しき
老人がやってきて、俺を荷物引き取り所まで連れて行ってくれた。

俺は自分の鞄の特徴が、銀色に近いものだったので
「ゴールド」といって、何とか鞄を引き戻して、
チケットを手にすることができた。

あの時の恐怖と、一緒に行った友達が、あざ笑っているのが
今でも覚えている、初めての海外旅行のエピソードである。
（懐かしい動画が、同窓会の時に話題になり、いまでもYOUTUBEには上げている）
https://www.youtube.com/watch?v=joamkkQdKQw


さて、そんな脱線話はさておいて、本題であるが、
つまりプログラム言語と言う奴は、一番最初に何を書くのか
という決まりごとは、いつになっても変わらず、
それを知っておかないと、まったく手も足も出せないのである。

そのうち、チャットボット側から、
「　お客さん何を書きましょうか？　」
などと親切にコードの出だしを、教えてくれないものだろうか？

せめてAIが出てきた暁には、本気でこのエンジニア不足と
コンピュータとのコミュニケーションのギャップを
埋めてくれることを期待するのであるが。


そんな訳で、今日のお題としては、最近習い始めている
プログラム言語の出だしについて、初学者でも分かるように
自分なりにまとめてみようと思う。


#python  --->　import

　pythonの場合は、import　文だ。
　これは間違っていないだろう。

#C＃  --->　using

　C#の場合は、using節　だ。
 別に演歌の出だしではない。

#C ---> 　#include <   >

 ちょっと昔覚えたから、付け足しておく
 c++　も基本同じかもしれないけど

#node.js  --->　require()

 あえて、HTMLに突っ込まれるJavaScriptには言及しない

#VB.NET  --->　Imports

 残念ながら、VBAにはこのようなお決まりは存在しないので
VB.NETの場合で書いておく。
　
#JAVA ---> import

　個人的にJAVAは使ったことが無いので、知識として書き出しておく

#その他

Typescript
RUBY
PHP
GO

いろいろあるんだろうけど。
いまの所は知らないでいる。


さてさて、こういう挨拶文というのは、
自分が相手に向かって、こんにちわ
という場合も、当然の如く必要であるが、
例えば、ちょっと他の人の会話を垣間見ようと
GITHUBなどを開いた場合でも同じである。


まず、この出だしの挨拶文から、
何もかもが始まるのであって、
ここから紐解いて行かないと
プログラムは完全に理解できないのである。

この挨拶文というのは、非常に重要であって、
例えるならば、相手の国のマナーや
しきたり、教養などの全般知識が詰め込まれている。

特に、最近は名前空間とか言ったりして、
（名前空間なんて名前つけなくて良くて）
そもそも、これは単なるツリー構造のディレクトリの
名前であって、逆にそういう風に言ってほしいぐらいである。


他にも、仮想空間とかいって、PYTHONではENVなどで
作られるのであるが、これも言ってしまえば、
単なる一時的に作られるフォルダの名前に過ぎないのである。
（本当に難しいことを、難しく言うのが、このＩＴエンジニアの
嫌らしい決まりになっていて、だからこそ、回りくどくて
初学者を受け付けない、なんというか嫌らしい文化だ）


そして、最近のオブジェクト思考なんて言うのも、
昔は一人の職人が、自営で商売を始めたものを、
段々、多くの人間を雇って、組織的に働くようになって
部署をどんどん作っているようなものだ。

だいたいプログラムなんて言うのは、実際の世界のルールや
常識、決まりを、パソコンのストレージエリアに突っ込んでいるという
たんにそれだけの話なのに、どうも初学者を受け付けない
独特の雰囲気がある。


そんな訳で、自分はこれからの世の中が、ＩＴ社会になればなるほど、
これらの先端エンジニア、お宅エンジニアが我が物顔で
はびこる世の中に、誰でも初学者が簡単に通り抜けられる
風穴を開けてみたいのである。
貿易統計を学び合う会 （資料） Power BI で、年集計をインポートする

# [貿易統計を学び合う会](https://www.kaggle.com/zanjibar/manabiai-2/)の資料です

# Power BI で、1997-2019 年のデータと、HS コード、国コードをPower BI Desktop にインポートします。

- [インポート済みデータ](https://toukeibiz-my.sharepoint.com/:u:/g/personal/tadashi_toukei_biz/EfgkmZ7dSjNDqMHqfOkkFwUB0SBYS_dbKPX1nYoi94X6kA?e=2qttCa) すぐに使いたい人はこちらをどうぞ、

## [kaggle にある CSV](https://www.kaggle.com/zanjibar/japantradestat) から下記をインポート
- y_1997.csv
- hs2_jpn.csv
- hs4_jpn.csv
- hs6_jpn.csv
- hs9_jpn.csv
- country_jpn.csv

インポートは、まず、kaggle からダウンロードして、解凍します。
HS コード（品目コード）は、0からはじまるので、変換かけて、テキストにします。
国コードは、0 からはじまらないので、整数のままでいきます。

## 注意事項 HS コードの説明は、HS2 以外は抜けがあり。xxx などで補完しています。
ABC備忘録[ABC163 C - managementr] (Python)

>#問題文
$N$人の社員からなる会社があり、各社員には$1,...,N$の社員番号が割り当てられています。
社員番号1の社員以外の全ての社員には、自分より社員番号が小さい直属の上司がちょうど$1$人います。
$X$さんが$Y$さんの直属の上司であるとき、$Y$さんは$X$さんの直属の部下であるといいます。
社員番号$i$の社員の直属の上司の社員番号が$A_i$であることが与えられます。各社員について直属の部下が何人いるか求めてください。

>#制約
$2≤N≤2×10^5$
$1≤A_i<i$

[ABC163 C - managementr](https://atcoder.jp/contests/abc163/tasks/abc163_c)

#解法
入力されるAの要素がそれぞれ何個あるかを求め、それらの値を順に出力すればよい。

```Python
import collections

N = int(input())
A = list(map(int,input().split()))
c = collections.Counter(A)

for i in range(1, N + 1):
  print(c[i])
```

##collections.Counter
collectionsライブラリのCounterクラスを使うことで配列の各要素数を求められる。

```Python
l = [1,1,2,2,2,3,4,4]
c = collections.Counter(l)

print(c)
# Counter({1: 2, 2: 3, 3: 1, 4: 2})
```
遠隔環境における体験学習の実施

コロナウイルス感染症（COVID-19）の影響で、働き方や勉強会などのイベントの形態が大きく変わりました。
SlackやZoomを筆頭とするチャットツールなどが一般的に活用され始めています。

私が働いている会社の新人研修や、世の中のハンズオンの形態も変わりました。
今回は、上記の内容と気付きを書いていこうと思います。


## 体験学習を受ける側

`Amazon QuickSight` の公式オンラインハンズオンに参加してみました。ちなみにAmazonのハンズオンに参加するのはこれが初めてです。
ハンズオンは以下のような内容で行いました。

1. `Amazon Chime`（ビデオコミュニケーションツール）を利用するためのURLがSlackで共有される
1. 録画放送が流れつつ、チャットでサポートが入る（2時間。途中10分程度の休憩あり）
1. 質問タイム
1. アンケート記入

※ ハンズオンの担当者さん曰く、「今後はオンラインでの取り組みに対して、力を入れていこうと思っている」とのことなので、内容は変わるかもしれないです。


### よかったなと思うこと

* 効率よく体験学習できたこと。
    * 基本的に動画に沿ってのハンズオンでしたが、わからない部分に関してはチャットや口頭で質問できたので助かりました。他の参加者からも同じような意見が出ていました。
    * ただ動画を見るよりは効率よく体験学習することができたと思います。
    * 動画のテンポがよく、今まで受けたことのあるハンズオンと比較して「もたもた」が少なく感じました。
* 最新の情報に沿った学習ができたこと。
    * AWSは料金形態やコンソールのUIが都度変更されるイメージなので、最新の情報に沿った体験学習ができたのはよかったです。


### 反省

* ハンズオンを途中で止めることができなかった。
    * ハンズオンの途中でつまづいた際は、発言して動画を止めて良いことになっていたが、なかなか止められなかった。というのも、動画が効率よく作られているせいか、なかなか口を挟むタイミングが出てこない。どこで口を挟んでもキリが悪い。
    * 今まで受けたことのあるハンズオンでは、「ここまでついてこれていますか？」みたいな確認が入ったのですが、今回はそれがほぼなかったのが印象的でした。
* どんな前提知識が必要か事前に確認した方がよかった。
    * ハンズオンの入りは「他のBIツールとの比較」でした。
    * エレベーターピッチレベル（一言）でまとめられるくらいには、ハンズオンの対象を事前に調査しておくべきでした。
    * 今まで受けたことのあるハンズオンはそのへんをフォローしていてくれていたので、意識的にちょっと甘えていたのかもしれません。多分普通はこれがデフォルト。
* Amazon Chime はミュートから復帰した直後はマイクが入らない。ミュートから復帰した後は数秒待ってから発言するようにしよう（戒め）


## 体験学習を行う側

新人研修をいくつか実施してみました。
例年はひとつの研修しか担当しない方針なのですが、今年は訳あっていくつか持つことになりました。
具体的には以下の研修を担当しました。

* 社内共通言語
* ソフトウェアテスト（RSpec）
* 仮想化技術（Docker）
* CI/CD技術（GitHub Actions）

研修は以下のような流れで行いました。

1. Zoom（ビデオコミュニケーションツール）のURLを共有
1. アイスブレイク
1. 目的、目標、方針、最低限の理論の共有
1. 実践 → 理論 の繰り返し（途中休憩あり）
1. 一日の振り返り（研修担当者も同じ場で振り返りを行う）


### よかったなと思うこと

* 一日の振り返りを行うことで、次の研修をより良いものにすることができた。
    * 「自習時間（自由に学習内容を個人で落とし込む時間）がないと、なんとなくで終わってしまい、すぐに忘れてしまう。次は2時間ほど自習時間をとってみよう」 → 「前と比べて落とし込めるようになったが、自習時間を2時間まとめてとるよりも、研修の合間合間に自習時間があった方が落とし込める気がする。次は研修の合間合間に自習時間を取ろう」 → 「自習時間は最低1時間あった方が集中できそう」 ... みたいなサイクルが回せたのはよかったです。
* 例年の研修より、距離が近く感じた。
    * 物理的な距離は遠いが、心理的な距離は近く感じました。


### 反省

* 社内で行う研修と比較して、時間がかかった。
    * 例えば、「始め」と「終わり」には必ず遠隔環境ならではの作業が発生します（ビデオコミュニケーションツールへの接続など）
* 今までホワイトボードを利用していた説明がうまくできない。
    * ペイントツールに慣れていないだけなのかもしれません。


## その他遠隔環境における体験学習での気付き

* カメラをつなげていない限りはどんな姿勢で作業していても問題ない。
    * 楽な姿勢で作業できるのはありがたい。
* お手洗いに行きやすい。
    * チャットに一言残して、他の研修者の集中力を奪うことなくトイレに行けるのは強い。
* モニタを購入して画面を拡張しておいた方が良い。
    * 画面共有は常に表示しておいた方が作業しやすい。
    * 一つの画面に複数のウインドウを表示しても良いが、ブラウザのようなレスポンシブな設計のウインドウだった場合はUIが変化してしまい、体験学習の内容に合わなくなってしまう場合がある。
* 教え合いが発生しにくい。
    * というかグループワークがしにくい。
* 多人数（四人以上）になるときつい。
    * 体験学習を受ける側としては当事者意識が低くなる。
    * 体験学習を行う側としては会話が振りにくい。
* `画面共有` ＋ `カメラ共有` ＋ `通話` のコンボでPCが重くなる。
    * 他にも、ファイルがたくさん置かれているディレクトリを開く行為や、ソフトウェアをインストールする行為などを同時に実行すると最悪フリーズする。
    * `vscode`の`live share`を使い、画面共有を避けたりもしたが、手間がかかる上に同期がうまくいかないことがあったため断念。
コンストラクタ(java) の使い方の勉強

コンストラクタの使い方がわからん。勉強だ。

[知ってること]
・名前はクラス名と同じ
・何かを初期化する役割(何をかはぼんやりとしかわかってない)
・super は親クラスのコンストラクタを呼び出す
・this は自身のクラスのコンストラクタを呼びだす
・引数と同じ名前の変数を使うときに```this.str = str``` (左のstr はいま定義したもの、右側のstr はメソッドの引数)


[わからないこと]
・コンストラクタの使いみち
・記述方法

---
[調べてわかったこと]
・コンストラクタは、クラスの
・戻り値は設定できない
・引数は設定できる
・メンバ変数(クラス内でメソッド外の変数のこと)の初期化をする

```java:sample.java
public class sample{
    int num;        // ←これ
    String name;    // ←これも
    public sample_method(){
    ~~~~
    ~~~~
    }
}
```

こんな感じかなあ。次はコードを書いて、具体的に実装の流れを勉強してみようかな。
【Rails tutorial】 Herokuへのデプロイ＆二回目以降のデプロイ方法

現在レイルズチュートリアルを進めているのでその経過をアウトプットしていきます。

今回はタイトル通りHerokuのデプロイ方法と二回目のデプロイ方法についてです。

チュートリアル通りに進めていましたが、git push heroku の部分でつまずきました。

結論から言うとconfigのdatabase.ymlの記述に問題がありました。

下の方にあるproduction:　の部分を以下のように書き直します。


production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5


簡単に言うとpostgreSQLを使うという宣言をする記述のようですね。

もしチュートリアル通りにやってうまくいかないという方はここを治すとデプロイできるかもしれないです。

そして二回目以降のデプロイ方法ですが演習の部分で元々のhello worldの表示をgoodbyeアクションの結果を表示できるようにしろという問題がありますが、指示通りにそのままgoodbyeアクションを記述してターミナルに　git push heroku と入力するとupdate　heroku Everything　と出てうまくいったような感じになりますが heroku を開くと変わらずhello worldとなっています。

これは私の場合ですが変更した結果をgit？にコミットしていなかったのが原因だったようです。

なので下のように記述しました。

git commit -a -m "Update Gemfile for Heroku"

そして再度プッシュしたところ変更が反映されていました！

今回は以上です。
PostgreSQL のwith と temporary table と view の差異を整理

with と temporary table と viewの存在意義がごっちゃになったので簡単にまとめ

# テーブルの実体を持つか否か
temporary tableは持つが、withとviewは持たない。
前者は物理的にテーブルを作成するので、disk書き込みなど生じる可能性はある。
後者はsqlに対するaliasみたいなものなので、実体持たない。呼び出される度に実行される。
# スコープ
temprary tableは 同一セッションのみ
viewはdrop viewするまで
withは一つのクエリ内のみ
# index
temporary table :  貼れる
view: 貼れない( MATERIALIZED VIEWというのを使えば貼れる)
with: 貼れない
macからwindows10をリモート操作したかった【winexe, PSTools】

## 先に結論
`brew install winexe`で使える`winexe`は使うのはWindows側の設定が大変＆セキュリティ的にどうなんだろ、ということがあるので
新しく追加されたSSHサーバー機能を使いましょう。
https://www.atmarkit.co.jp/ait/articles/1903/28/news005.html

ということで以下はやったこと。（最終的に断念したが


## まずPSTools
https://docs.microsoft.com/ja-JP/sysinternals/downloads/psexec
ホストとなるwindows上でリモートPCからコマンドを実行させるために必要。
ダウンロードして解凍、psexecが実行できるようにパスを通す。

## macにてbrewからwinexeをインストール
そのまま`brew install winexe`

## windowsホストの設定
1. ポートを開ける
 - TCP 135,137-139 (RPC)
 - TCP 445 (SMB)

2. UAC、レジストリの設定
 - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

 というキーに値が必要。詳細は
 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System`
 `LocalAccountTokenFilterPolicy REG_DWORD 1`
 コマンドにすると
 `reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1`
 リモートUACを有効化？ということらしい。

3. SMB1.0の有効化
やり方は調べたら出ますが、winexeの現行のバージョンではSMB1.0でしか通信できないそう。
（linuxのsmbにマージされたバージョンだと最新のSMBでもいけるそうですが詳しく見てない）
これはやらないと`NT_STATUS_CONNECTION_RESET`というエラーがでる。

ここまでやればホストWindows上で自分に対して`psexec`コマンドが使えると思う。
`psexec  \\[PC名 or IP] -u \\[ユーザー名] cmd`
このへんのコマンド例は他のページ等ご参照
ちなみにドメイン参加ユーザー等は、
`ドメイン\ユーザー名`とする。

winexeからだと
`winexe -U [ユーザー名] //[ホストPC名] cmd`
のような感じ。

## その後…
NT_STATUS_OBJECT_NAME_NOT_FOUND
や
NT_STATUS_INVALID_PARAMETER
が出たりする。
これ以上の解決はあきらめ、最近のリリースでWindowsでもSSHサーバーが使えるようになったようなのでそちらを使うことにした。

なお、winexecを使った後、winexesvcというサービスが登録される。
これはよくバックドアにも使われるそうで、Windowsセキュリティで警告が出ることがある。
（自分の環境では出た）
ということでwinexeは断念した。
Pythonで日経新聞ウェブサイトから個別銘柄の株価をスクレイピングする方法


株価を分析して買い時の銘柄を見つけようと思い、日経新聞のサイトからスクレイピングをしてみました。無料で株価を提供するサイトは[株式投資メモ](https://kabuoji3.com/)など色々あるのですが、不定期更新のことが多いです。日経新聞のサイトは毎日ちゃんと更新されます。

まず、サイトをスクレイピングする際には色々と[ルール](https://qiita.com/nezuq/items/c5e827e1827e7cb29011)を守らないと犯罪になってしまいますが、日経新聞の[robots.txt](https://www.nikkei.com/robots.txt)とか[利用規約](https://www.nikkei.com/info/copyright.html)をみる限りは個人利用の範囲なら問題なさそう(?)です。(ダメそうだったら教えてください)

pandasというモジュールのread_html()というメソッドを使うと秒でかけます。

```python:nikkei_scrape.py
import pandas as pd

def get_stock_prices(stock_number):
    url = "https://www.nikkei.com/nkd/company/history/dprice/?scode={}&ba=1".format(stock_number)
    headers = {
        "User-Agent": "User-Agent情報"
    }
    dfs = pd.read_html(url)
    for i in range(len(dfs)):
        if "日付" in str(dfs[i]):
            return dfs[i]
    return False
```
User-Agent情報は[このサイト](https://www.cloudgate.jp/ua.php)を開いたときに出てくる文字列をコピペして貼ればオッケーです。例えば僕の場合、`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36`でした。詳しく知りたい人は[こちら](https://qiita.com/nightyknite/items/b2590a69f2e0135756dc)。

`stock_number`には数字四桁の株式銘柄コードを入れてください。例えば1301と入れると極洋という会社の株価ページのURLである[https://www.nikkei.com/nkd/company/history/dprice/?scode=1301&ba=1](https://www.nikkei.com/nkd/company/history/dprice/?scode=1301&ba=1)をスクレイピングします。銘柄コードはググっても簡単にわかると思いますし、[東証のwebサイト](https://www.jpx.co.jp/markets/statistics-equities/misc/01.html)からも一覧のEXCELファイルがダウンロードできます。

株価のwebページ内に余計なテーブルが存在することがあり、株価のテーブルだけを取得するため、for文を回して、"日付"という単語が入っているテーブルだけを返すようにしています。

以上です。
在宅育児（と勤務）を支える技術

[2020.04.13 の保育園休園](https://qiita.com/e99h2121/items/c8878d027603745a6426) 以来、意識して利用したものたち。

### 利用するもの
#### [chromecast](https://store.google.com/jp/product/chromecast?hl=ja-JP)
- うちにあったもの。

#### [droidcam](https://www.madosyo.com/?p=2270)
- Wifi越しにAndroid端末をPCのWEBカメラに！できるアプリ。

#### web会議ツール
- Google Meetとか、zoomとか。会社その他で使うやつ。


### で、可能になるコンテンツ

#### インタラクティブなやりとり
- 娘・息子の保育園でオンライン保育園を開園してくれた。
- 会社でも。

#### [渋谷ライブカメラ](https://www.youtube.com/watch?v=kQFo1bVV81c)
- 作業している日中、リビングに垂れ流し。バス好きな息子１歳がたまに通るとバスを見て盛り上がる。

#### [ペンギン水槽ライブカメラ](https://www.youtube.com/watch?v=UgRsxuZQVwM)


### 以上をどう生かすかと言えば、やはりスケジュール管理
- [時間割](https://note.com/e99h2121/n/nf6980cf97d16)
- 平日と土日の区別。土日はのんびりすること。

### そして運動
- 折角なので緊急事態宣言解除までプランクチャレンジ
- 家の中でとにかく足踏みして1日5000歩達成チャレンジ

### とはいえ基本は
- [食事睡眠、日光浴](https://twitter.com/yseimu/status/1249151648993284103?s=21)
基本情報処理技術者試験のアルゴリズム(java) のコードリーディング

基本情報処理技術者試験(以下、基本情報)のアルゴリズム問題をjava で受験する予定なので勉強中。

最近ちょっと方針がわかってきた。

1. クラス名・メソッド名直後の空欄はサービス問題
2. メソッド内の空欄は引数や戻り値から推測しよう
3. 条件2.でダメなら仕様をよく読んで推測しよう
4. 「this」「super」があったらまず「コンストラクタ」の話
 
1. クラス名・メソッド名直後の空欄はサービス問題
---
問題の選択肢を見る。クラス名直後の空欄は「extends」、「implements」、「throws」のいずれかである(たぶん)。空欄の直後が例外処理(〜exception みたいなやつ)なら「throws」で確定。空欄の直後がクラスなら"継承" なので空欄は「extends」、インターフェース名なら「implements」 が当てはまる。

```java:sample.java

public class human{
    ~~~~
    ~~~~
}

public class sample [[  空欄a  ]] human{
    ~~~~
    ~~~~
}

// human はクラスなので[[  空欄a  ]] は「extends」
```

```java:sample.java

public interface human{
    ~~~~
    ~~~~
}

public class sample [[  空欄a  ]] human{
    ~~~~
    ~~~~
}

// human はインターフェースなので[[  空欄a  ]] は「implements」
```

```java:sample.java

public int sample [[  空欄a  ]] IOException{
    ~~~~
    ~~~~
    return 0;
}

// 直後に例外が来てるので[[  空欄a  ]] は「throws」
```

だいたいこんな感じだと思って解いてる。

こういうサービス問題はまっさきに埋めてしまおう。

2. メソッド内の空欄は引数や戻り値から推測しよう
---
インスタンスの型やメソッド名直後の戻り値を追いかけると回答を絞れることも多い。焦らずデータの流れを追っていこう。

3. 条件2.でダメなら仕様をよく読んで推測しよう
---
while() のかっこ内の条件文や、呼び出される関数の名前などの仕様ははじめの日本語文に書いてある。しっかり読んでみよう。

4. 「this」「super」があったら「コンストラクタ」の話
違う使い方が出ることもあるが、コンストラクタの話を思い出すように気をつけている。
super は親クラス(継承とか)のコストラクタを呼び出すときに使うらしい。でも明示的に書かなくても勝手に呼び出されるんだそうだ。this は自身(子クラスかな) のコンストラクタを呼び出すときに使うんだそうな。詳しいコードのことも調べて勉強しとかんといかんなあ。
あと、メソッドの引数と同じ名前の変数を使うときに、```this.str``` みたいに使うらしい(メソッドの引数が```str``` のとき)。

python でコード書いてたときは関数内で、引数と同じ名前の変数をつけるときに使ってたかなあ。機能面よくわかってないまま使ってた。

```python3:sample.py
class sample_class():
    def sample_method(self, str):
        self.str = str
        print(str)


str = 'こんにちは'
aaa = sample_class()
aaa_aaa = aaa.sample_method(str)
```
this じゃなかった。self だった。
、、、忘れとる、、、！！
Markdown Preview Enhancedでprinceを利用してPDF化するときに日本語が文字化けする

いくつか試してみてどれが有効か分かりませんが、探しても情報がほとんどなかったので参考になれば良いかな、と思って残します。

環境

* VSCode
* WSL: Ubuntu-18.04

## WSLからwindowsのフォントを参照可能にする

sudo vim /etc/fonts/local.conf

```xml
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/c/Windows/Fonts</dir>
</fontconfig>
```

参考

* https://www.atmarkit.co.jp/ait/articles/1812/27/news033.html

## WSLにprinceをインストールする

https://www.princexml.com/download/ でダウンロードリンクを見つけてください。

princeのダウンロード

```bash
wget https://www.princexml.com/download/prince_13.5-1_ubuntu18.04_amd64.deb
```
 
princeのインストール

```bash
sudo apt install ./prince_13.5-1_ubuntu18.04_amd64.deb
```

## markdown-preview-enhancedのCSSをカスタマイズする

`style.css`を編集します。

`ctrl`+`shift`+`p`でコマンドパレットを開き、`Markdown Preview Enhanced: Customize Css`を実行してください。

以下のように`prince`の設定を追加してください

```scss
.markdown-preview.markdown-preview {
  // modify your style here
  // eg: background-color: blue;
    &.prince {
    // your prince css here
    @font-face {
        font-family: serif;
        src: local("MS Mincho")
    }
  }
}
```

参考

- https://shd101wyy.github.io/markdown-preview-enhanced/#/prince
- https://www.princexml.com/doc/styling/#redefining-the-generic-font-families
[rails] migrate:reset でのエラー

#はじめに
railsでアプリを作成していた際、db:migrateをした際に、エラーが発生しめmigrate:resetをしたのですがその際初めてのエラーが発生したので、その備忘録として書きたいと思います。

## 最初のエラー
新しくテーブルを作成するためにマイグレーションファイルを編集して実行したところファイル内に記述していたテーブル名に記述ミスがあり、エラーが発生しました。

````
class CreateHoges < ActiveRecord::Migration[5.2]
  def change
    create_table :hoges do |t|
      t.references :huge
      t.text :text
      t.timestamps
    end
    add_foreign_key :hoges, :missname, column: :huge_id  # missnameが記述ミス
  end
end

````

そのため、記述を直し改めてマイグレーションファイルを実行したところ以下のエラーが発生しました。

````
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: table "hoges" already exists: CREATE TABLE "hoges"
````

どうやらテーブルは既に存在しているといって、エラーが起きているようです。
まさかと思いテーブルを確認しても出来ていません。
rails db:migrate:status で確認してもステータスは downになっていました。

## 原因
どうやらmigrationの際に、処理が途中まで進んで、残りでエラーが起きているときは、テーブルは生成されているけれどもテーブルを生成したmigrationは未実行のステータスになっていることがあるようです。
(create_tableのあと、add_foreign_keyしたところにエラーがあって、というパターン)

## migrate:reset
ならば、一度データベースを全て削除した上で、再度実行したら直りそうです。
以下のコマンドを実行

````
rails db:migrate:reset
````

そしたら、またもやエラー

````
rake aborted!
ActiveRecord::NoEnvironmentInSchemaError:

Environment data not found in the schema. To resolve this issue, run:

        bin/rails db:environment:set RAILS_ENV=development
````
なんだこれは、と思い調べたところ、どうやら指示されるようにコマンドを入力したら直りそうです。
以下の記事が、とても参考になります。
[ActiveRecord::NoEnvironmentInSchemaErrorについて](https://blog.freedom-man.com/no-environment-in-schema-error)

## 解決
まず指示されるまま以下のコマンドを実行

````
 rails db:environment:set
````

そして、再度以下のコマンドを。

````
rails db:migrate:reset
````

ようやく正常にテーブルを作成することができました。

# おわり
今回はmigrate:resetで解決しましたが、もし他のテーブルに影響を与えない方法があるならば、教えていただければ幸いです。
最後まで読んでいただき、ありがとうございました。
Cコンパイラを作るときのlibcとの付き合い方


Cコンパイラを作っていると、セルフホストを目指した瞬間、今まで味方だったlibcとの対決を迫られる熱い展開になります

# 前提

+ [低レイヤを知りたい人のためのCコンパイラ作成入門](https://www.sigbus.info/compilerbook)
+ C言語でCコンパイラを書いてセルフホストを目指す場合の話
+ x86_64のLinuxとgcc
+ 上記の環境に限った話かどうかについては明記しない予定

# libcとの付き合い方

## libcを使わない

+ つまり自分でlibc（の一部）を書きます
+ ファイルIO（標準出力も含む）とメモリ操作（例えばalloc/cpy/cmpな各種）など、いくつか必須っぽいものがある
+ libcにはシステムコールラッパーとしての役割がある
    + 自分でlibcを実装する場合にはシステムコールをアセンブリで出力する
    + システムコールのABIは、C言語の関数呼び出しABIとは異なる
    + 引数と返り値の扱いについてはABIが同じOSもあるが、x86_64 Linuxでは異なるはず（未確認）
    + いずれにせよ、通常の関数のように `call` では呼べない
+ 必要なものだけ書くなら数は多くないはず（難易度は不明）
    + ちなみに、私がセルフホストを達成した時点で使っていたlibcの関数その他は[30個ぐらい](https://github.com/guignol/ccompiler/blob/10a19be80215bcb4ca76132d8a1a4bbb442d47d2/std_alternative.h)でした
+ 必要最低限な自作libc代替を使ったCコンパイラ作成は、制限プレイとして楽しそう

## libcの実装とヘッダファイルを使う

+ まず、「gccによる（自作コンパイラの）コンパイル」では普通（？）のCプログラムとして（例えば）`#include <stdio.h>`します
+ 「自作コンパイラによるコンパイル」では、大きく以下の2パターンがあります

### 「自作コンパイラによるコンパイル」でlibcのヘッダファイルを使う場合

+ `#include`や各種マクロの展開などは、gccのプリプロセッサに任せることができます
    + `gcc -E ${BEFORE} > ${AFTER}`
    + プリプロセッサを作りたい人はここで頑張ります
+ ただし、プリプロセス後のlibcのヘッダファイルには様々なものが含まれます
    + 自作コンパイラで対応予定だけど未実装のもの（例えば、`struct`） 
    + 自作コンパイラで対応予定のないもの（例えば、`float` `unsigned long int`）
    + gcc拡張っぽいもの
+ この様々なものに対応するか無視する必要があります
    + この対応及び無視の負担がどの程度なのかは不明

### 「自作コンパイラによるコンパイル」でlibcのヘッダファイルを使わない場合

+ 呼び出そうとしている関数が実際に存在するかどうかのチェックを自作コンパイラで行わず、リンカに任せます
+ つまり以下のようなソースを自作コンパイラの入力とします

    ```
	int main(void) {
		// 関数宣言も#includeも無しでいきなり呼び出す
		printf("Hello, world!");
		return 0;
	}
    ```

+ 自作コンパイラで関数宣言を扱わない段階までは、これが簡単です。

## libcの実装を使うが、libcのヘッダファイルを使わない

### 関数宣言

+ C言語は互換性の問題からか、関数の引数をチェックしない関数宣言が可能です
    + cf. [【C言語】引数なしの関数には void を書いた方がよいという話](https://0x19f.hatenablog.com/entry/2019/04/17/213231) 
+ 例えば`int printf();`という宣言を用意すると、自作コンパイラでも扱いやすいし、gccも正当なものとして扱ってくれます
    + libcで定義されているものを型違いで再宣言すると、gcc等はwarningが出ます

### その他のテクニック

+ 複雑な構造体がポインタで扱われていて、自分で直接操作しないのであれば。`void *`として扱うのが簡単かもしれません。具体的には、`FILE *`

# 成果

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Cコンパイラのセルフホスト達成した！<a href="https://t.co/hhoBGS3kJo">https://t.co/hhoBGS3kJo</a></p>&mdash; ぎ (@guignol_ninja) <a href="https://twitter.com/guignol_ninja/status/1243907541609771008?ref_src=twsrc%5Etfw">March 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
JetsonNanoでraspimouseを動かすROS nodeを作った

# TL;DR

* JetsonNanoでラズパイマウス [http://products.rt-net.jp/micromouse/raspberry-pi-mouse] のとりあえずモーターを動かすROS node件driver を作ったので公開と、解説記事になります。
[https://github.com/imoted/raspimouse_with_Jetson_nano_ROS]

* This package is derived from "pimouse_ros_2" package[https://github.com/ryuichiueda/raspimouse_ros_2]

* buzzar, light sensor, switch, LEDは、また今度

![IMG_2851.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/8345865c-b8c0-c060-fbfb-36cdc1ccf39d.jpeg)



## 必要な物

* Ubuntu
  * Ubuntu 18.04 

https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit

* ROS Melodic

* 電気接続
  * raspimouse P2 pin31 - Jetson nano J41 pin35
  * raspimouse P2 pin33 - Jetson nano J41 pin33 
  * raspimouse P2 pin32 - Jetson nano J41 pin32
  * raspimouse P2 pin36 - Jetson nano J41 pin31
  * raspimouse P2 pin29 - raspimouse 3V

以下注意
JetsonNanoのIOボードのIOピンは、TXB0108 という双方向ドライバで3.3Vに昇圧してあるが、70pF以上の容量をドライブできない。
Raspberry pi MouseのモーターのEnableピンのFET irlml6402は
633pFの入力容量があり、そのまま直接ドライブすると、発振する。
そのため、Enableピンには３．３V入力させて固定する。

http://www.tij.co.jp/jp/lit/ds/symlink/txb0108.pdf
http://akizukidenshi.com/download/ds/ir/irlml6402.pdf

それぞれのヘッダピンアサイン
https://github.com/rt-net/RaspberryPiMouse_Hardware/blob/master/supplement/RaspberryPiMouseV2_circuit.pdf
https://www.jetsonhacks.com/nvidia-jetson-nano-j41-header-pinout/

* ５V電源を、つなぐこと。
  * raspimouseのP2からJetson nano J25につなぐ。J48をジャンパするのを忘れないこと
 
* Mechanical setup
  * git にjetson3.stlというraspiの固定スペーサーにそのままJetson Nanoを載せられる3Dプリント部品を一緒にpush。

* ROS nodeから直接Jetson nanoのIOのメモリ番地を叩くので、raspimouse driverは必要なし。

## Installation

### 1. Setup the Jetson nano 

* PWM pin assign on Jetson nano
  * Connect PWM pwm0 function to pin32 and pwm2 function to pin33  by following the instruction 

https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%2520Linux%2520Driver%2520Package%2520Development%2520Guide%2Fhw_setup_jetson_io.html%23wwpID0E0JE0HA

### 2. Install the ROS1 Melodic

Please refer to [ROS WiKi](http://wiki.ros.org/melodic/Installation) for installation, or run the following ros setup scripts.

### 3. clone and build

```
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_worksapce
```

Add the follwing line to `~/.bashrc`:

```
source ~/catkin_ws/devel/setup.bash
```

```
cd ~/catkin_ws/src
git clone https://github.com/imoted/raspimouse_with_Jetson_nano.git
rosdep install raspimouse_with_Jetson_nano
catkin build
```

### remaining issue

* implement LED, light sensor, buzzar driver
* software and circuit fix to drive the motot enable
* implement the RT-USB-9axisIMU2
更なるステップへ　〜検索する力〜

まず「検索する力」とは何なのかを改めて考えさせられた。そして驚いたのが、百戦錬磨のプロでもWeb上で検索しながら開発していること。

以下は検索の質を上げるための方法

＜検索を行うにあたって意識するべきポイント＞
・2〜４個の範囲でキーワードで検索する
・必ず1ページ目に目を通す。少なくとも２ページ目まで。
・抽象的な言葉調べる時は、何に関連した言葉なのかをつける
・2~3年前の情報でも正常に動作しないケースがあるため、期間を指定し1年以内にする。
（時代の流れは早いなと思った。特にテクノロジーは日々変わっていく。ボーッと生きるんじゃねえぞ、私。）

＜googleの検索をより有効に使う方法＞
・期間指定（※上記と同じこと）
・マイナス検索
→　-⚪︎⚪︎とすれば、そのキーワードを取り除くことができる。
・フレーズ検索
→　キーワードと検索結果を完全一致させる。ピンポイントで使おう。

個人ブログ・Yahoo!知恵袋で調べるのはあまりおすすめしない。確かに言われてみれば自分も調べていてこれらは大衆が集まって根拠のないことを言い合うことが多いなと思っていた。

本格的に学ぶ前の段階だけど、これだけでもとても濃い内容だと思った。そして普段の日常で何気なく私たちは「ググる」と言っているが、私も含めほとんどの人が「検索する」ということを真剣に考えていないと痛感した。

本ブログのQiita（キータ）や、世界のエンジニアが集うStack Overflow（スタック オーバーフロー）。ブログを通じて知識を共有し合うことに、「パソコン１台で世界と繋がることができる」ワクワク感を覚えた。

「検索」は、「繋がり」でもある。誰かと誰かとの繋がり、何かと何かの繋がり、この連続が人生を豊かにしてくれると思う。

テクノロジーの門をたたき、プログラミングを学ぶことを選択して本当に良かったと思う。
vuexのmutationsの動きを理解する

# vuex
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/fcffc717-eb98-37f9-b6c0-76030b6ceaa9.png)


画像は、[Vue.js + Vuexでデータが循環する全体像を図解してみた - Qiita](https://qiita.com/m_mitsuhide/items/f16d988ec491b7800ace)を引用させていただきました。

この流れに沿って、本の詳細を表示するsetBookInfoメソッドの動きを見てみます。

①→コンポーネント側のsetBookInfoをコミットすることで、Vuex側のsetBookInfoが発火する。
②、③→発火された結果、mutationsからstateに値が渡される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/57c03bdc-c2ba-6cbf-3986-a22981930e89.png)


④→computedプロパティで、コンポーネントからvuexストアを参照することができる。参照した結果、template側で値を使うことができる。
※そのコンポーネントだけでVuexの値を参照したい場合は、computedで参照するのが望ましいが、複数のコンポーネントからVuexの値を参照したい場合は、gettersを使用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/c6b95eed-32ba-3217-e648-8b23ca95c38f.png)


非同期処理や、actions,gettersについては、使い所などまだ理解できていないので、わかり次第また更新します。
理解間違っていましたら、ご指摘いただけると幸いです。

getters:複数コンポーネントで、Vuexストアから値を参照するときに使う。
state:値の状態
mutations:stateを変更するためのメソッドのようなもの。同期処理でなければならない。
actions:mutationsをコミットするためのもの。非同期処理でなければならない。
Python #Numpy基礎

学習メモ・備忘録

#Numpyについて
豊富な数学計算ライブラリをもち、効率的な数値計算を行うことのできる代表的なライブラリ。

## ndarray型
代表的な数値計算パッケージの`Numpy`で使用する基本データ型。

##### 記述例
~~~python
# ndarray型の作成
import numpy

a = [0, 1, 2, 3]
b = numpy.array(a)   # リストからndarray型を作成
print('b = ', b)

c = [1, 2]
d = [2, 3]
e = [3, 4]
f = numpy.array([c, d, e])   # 二次元のndarray型を作成
print('f = ', f)

g = numpy.array(a, dtype = numpy.float16)   # データ型を指定してndarrayを作成
print('g = ', g)
~~~
実行結果
>b =  [0 1 2 3]
>f =  [[1 2]
> [2 3]
> [3 4]]
>g =  [0. 1. 2. 3.]

## 基本的な数値演算を行うメソッド
ndarray型のデータやリストに対して、Numpyに用意されているメソッドを使うと様々な数値演算ができる。代表的な物を以下に紹介する。

~~~python
import numpy

h = numpy.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

i = numpy.median(h)   # 中央値
j = numpy.mean(h)   # 平均値
k = numpy.std(h)   # 標準偏差
l = numpy.var(h)   # 分散

print(i)
print(j)
print(k)
print(l)
~~~
実行結果
>4.5
>4.5
>2.8722813232690143
>8.25

## 非数と無限大
Numpyでは数値でないことを示す非数`nan`と無限大を表す`inf`を使用できる。

### 非数値`nan`
`nan`は`0`を`0`で割ると現れる値である。あらゆる値との比較で`False`を返す特殊な値であるため、自分自身との比較でも`False`を返す。そこで、`is`を用いて`nan`との同一性を確認することができる。

~~~python
from numpy import nan

m = float32(0) / float32(0)
n = m == nan
o = nan == nan
p = m is nan

print(m)
print(n)
print(o)
print(p)
~~~
実行結果
>nan
>False
>False
>True

### 無限大値`inf`
`inf`は絶対値のある値を`0`で割ることで現れる値である。`==`を用いた比較でも`is`を用いた比較でも`True`を返す。


~~~python
from numpy import inf

q = float(10) / float(0)
r = q == inf
s = q is inf

print(q)
print(r)
print(s)
~~~
実行結果
>inf
>True
>True

## 注意したいリストとの違い
リストと`ndarray`型は共に配列を扱う代表的なデータ型であり、使い方も似ているが、非なる点もあるので注意。

### 演算子の利用
`+`演算子は、リスト同士ではリストの結合、`ndarray`同士では値同士の加算を意味する。整数値との`+`演算はリストの場合エラーになるが`ndarray`では整数値の加算を表す。
`*`演算子は、リスト同士ではエラーにるが、`ndarray`同士では値同士の乗算を表す。整数値との`*`演算はリストの場合はリストの繰り返しを表し、`ndarray`では整数値の乗算を表す。


##### リストにおける演算子
~~~python
t = [0, 1, 2]
u = [3, 4, 5]
print(t + u)
# print(t + 2)    エラー
# print(t * u)    エラー
print(t * 2)
~~~
実行結果
>[0, 1, 2, 3, 4, 5]
>[0, 1, 2, 0, 1, 2]

##### `ndarray`における演算子
~~~python
import numpy

v = numpy.array([0, 1, 2])
w = numpy.array([3, 4, 5])
print(v + w)
print(v + 10)
print(v * w)
print(v * 2)
~~~
実行結果
>[3 5 7]
>[10 11 12]
>[ 0  4 10]
>[0 2 4]

### 多次元配列
`ndarray`はリストとは異なり、各次元の要素の数が異なるデータは作成できない。すなわち、`ndarray`型で作成するデータは全て行数と列数が一致した多次元配列でなければいけない。長さの異なるリストから二次元配列を作成しようとすると、リストと`ndarray`では以下のように異なった挙動を見せる。

~~~python
import numpy

x = [[0, 1], [2, 3, 4], [5, 6]]
y = numpy.array([[0, 1], [2, 3, 4], [5, 6]])

print(x)
print(y)
~~~
実行結果
>[[0, 1], [2, 3, 4], [5, 6]]
>[list([0, 1]) list([2, 3, 4]) list([5, 6])]

## インデックス指定・スライス指定

`,`と`:`を用いてリストや`ndarray`の要素を抽出できる。

~~~python
import numpy

z = numpy.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])

print(z[0, 2])    # インデックス０の中のインデックス２
print(z[2, 1:])    # インデックス２の中のインデックス1以降
print(z[ :, 2])   # 全てのインデックスの中のインデックス２
~~~
実行結果
>2
>[7 8]
>[2 5 8]
Pythonのデコレータを利用したグローバル変数の初期化

# はじめに
githubでpipのリポジトリを見ていたら、面白いデコレータの使い方をしていたので共有します。

# TL;DR
- デコレータは関数を修飾するためだけでなく、**関数を実行するため**に用いることもできる。
- [本題](#デコレータの内部で関数を実行する)

# importした時のグローバル変数の値
まず、以下のようなパッケージをimportした時にグローバル変数がどのような値をとるのでしょうか。関数`spam`も`egg`もグローバル変数`global_variable`を更新するためだけの関数です。

```python:mypackage/__init__.py
GLOBAL_VARIABLE = 0

def spam():
    global_variable = 1
    globals().update(locals())

def egg():
    global global_variable
    global_variable = 2
```

```python:main.py
import mypackage
if __name__ == "__main__":
    print(mypackage.global_variable)
```

関数を定義しているだけで実行していないので、`global_variable`の値は宣言時から変化していません。実行結果はもちろん以下のようになります。

```zsh
$python3 main.py
0
```


では、`mypackage/__init__.py`の末尾で関数を呼び出してみるとどうなるでしょうか。

```python:mypackage/__init__.py
GLOBAL_VARIABLE = 0

def spam():
    global_variable = 1
    globals().update(locals())

def egg():
    global global_variable
    global_variable = 2

spam()
egg()
```

この場合、関数が呼ばれて`global_variable`の値が`spam`内でも`egg`内でも上書きされるので、実行結果は以下のようになります。

```zsh
$python3 main.py
2
```
しかし、この方法だと、実行したい関数の数が増えるとその分だけ呼び出すためのコードを書かねばならず、面倒ですね。そこで、**デコレータ**の出番です。

# デコレータの内部で関数を実行する
ここからが本題です。さっそくコードを見ていきましょう。以下のような`call_aside`関数を考えましょう。

```python:mypackage/__init__.py
global_variable = 0

def call_aside(f, *args, **kwargs):
    f(*args, **kwargs)
    return f

@call_aside
def spam():
    global_variable = 1
    globals().update(locals())

@call_aside
def egg():
    global global_variable
    global_variable = 2
```

```python:main.py
import mypackage
if __name__ == "__main__":
    print(mypackage.global_variable)
```

なんと実行結果は、

```zsh
$python3 main.py
2
```

のようになります！最初、こうなる理由が分からなくて、結構悩みました。しかし、仕組みは分かると単純です。`call_aside`関数に注目すると、

```python
def call_aside(f, *args, **kwargs):
    f(*args, **kwargs) # <- execute f
    return f
```

というように、内部で関数を呼び出しています。したがって、`call_aside`で修飾しただけで、mypackageがimportされた時点で`spam`と`egg`が実行さるので、上のように`global_variable`の値が変化したというわけです。これなら、importされた時点で実行したい関数の数が増えても装飾するだけで済みますね :tada:

## 補足

Pythonのデコレータについて調べると、**「ある関数の前後に処理を追加する」「前後に処理を追加した関数を返す」**ためにデコレータを用います、とデコレータを解説しているものが多いと思います。

```python
def decorator(f):
  def wrapper(*args, **kwargs):  
    print("前処理")
    f(*args, **kwargs)
    print("後処理")
  return wrapper
```

このような使い方だと、`wrapper`関数は定義されただけで実行されていません。このデコレータで関数を装飾しても、装飾された関数を呼び出すまでは、グローバル変数の値を更新する等の影響は及ぼしません。

## 参考
[pypa/pip/blob/master/src/pip/_vendor/pkg_resources/\_\_init\_\_.py](https://github.com/pypa/pip/blob/master/src/pip/_vendor/pkg_resources/__init__.py#L3234)

## 最後に
ある程度Pythonを読み書きできるようになったら、`CPython`や`Pypa`など公式のgithubを眺めてみてください。そこには、ツヨツヨの方達のコードが無限にあるので、新たな発見があったり、参考になるコードがあったりすると思います。
GitHubをCLIで操作出来るghコマンド地味に便利

# はじめに
CLIでGitHubを操作出来る`gh`コマンドが地味に便利なので簡単に使い方を紹介します。
レポジトリは以下。
https://github.com/cli/cli

# 導入
インストール
`brew install github/gh/gh`

# コマンド
### pull request
作成する
`gh pr create`

ドラフトで作成する
`gh pr create -d`

マージしたいブランチを指定
`gh pr create -B <ブランチ名>`

作成画面をブラウザで開く
`gh pr create -w`

ステータスごと(Current branch、Created by you、Requesting a code review from you)に表示
`gh pr status`

### issue
作成
`gh issue create`

作成画面をブラウザで開く
`gh issue create -w`

ステータスごと(Issues assigned to you、Issues mentioning you、Issues opened by you)にissueを表示
`gh issue status`


# 最後に

他にも出来ることはあるので、興味がある方は是非マニュアルを見てみて下さい！
https://cli.github.com/manual/
【Rails】wheneverを用いたバッチ処理の実装

# 目標

1分おきにメソッドを実行する。

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[ログイン機能実装](https://qiita.com/matsubishi5/items/5bd8fdd45af955cf137d)
・[投稿機能実装](https://qiita.com/matsubishi5/items/1a5aeab651b5822d1f2c)

# メソッドを定義

```ruby:book.rb
class Book < ApplicationRecord
  def self.create_book
    Book.create(title: 'テスト', body: 'テスト')
  end
end
```

#バッチ処理を実装

###1.`Gem`を追加

```ruby:Gemfile
gem 'whenever', require: false
```

`require: false` ➡︎ アプリケーションには反映させずに、ターミナルにのみ反映させる。

```terminal:ターミナル
$ bundle
```

###2.`「schedule.rb」`を作成

```terminal:ターミナル
$ bundle exec wheneverize .
```

###3.`「schedule.rb」`を編集

```ruby:config/schedule.rb
env :PATH, ENV['PATH'] # 絶対パスから相対パス指定
set :output, 'log/cron.log' # ログの出力先ファイルを設定
set :environment, :development # 環境を設定

every 1.minute do # 1分毎に実行
  # 「Book」モデルの、「self.create_book」メソッドを実行
  runner 'Book.self.create_book'
end
```

###4.`「cron」`を反映

```terminal:ターミナル
$ bundle exec whenever --update-crontab
```

#バッチ処理でよく使うコマンド

`crontab -e` ➡︎ cronをターミナル上で編集

`$ bundle exec whenever` ➡︎ cronの設定を確認

`$ bundle exec whenever --update-crontab` ➡︎ cronを反映

`$ bundle exec whenever --clear-crontab` ➡︎ cronを削除
ubuntu に apt で golang をインストール

# ubuntu に apt で golang をインストール

## 手順

```
sudo add-apt-repository -y ppa:longsleep/golang-backports
sudo apt update -y 
sudo apt install -y golang-go
```

※ -y をつけて自動でインストールできるようにしている。

## メモ

ubuntu 19.10 では go 1.14.2 がインストールされた (2020/4/26 現在)
ubuntu 20.04 では go 1.13.8  がインストールされた (2020/4/26 現在)


## リンク

https://github.com/golang/go/wiki/Ubuntu
https://launchpad.net/~longsleep/+archive/ubuntu/golang-backports
https://github.com/longsleep/golang-deb
https://go.googlesource.com/go
https://qiita.com/Sylba2050/items/29211a4cf4caa60162c0
MacでのUSB-serial の製造元の確認方法

#USB-serialのICが何かわからない。
いま接続がおかしいUSB-serialは、amazonの商品説明を読んでなんとなくPL-2303だと思っていた。Windows10に接続するとPL-2303の最新版のデバイスドライバを自動的にインストールする。
だけど違うみたい。

#Macに接続した
接続する前に,PL-2303のドライバをインストールした。

で、接続した結果が、以下の通り。
USB2.0-Serial:

  製品ID:	0x7523
  製造元ID:	0x1a86
  バージョン:	2.62

これは、画面左上のアップルマークをクリックして、「このMacについて」を選び、出てきたダイヤログメッセージの「システムレポート」をクリック。　
これで表示された画面からUSBを選んで表示させた。(と書いてみたけど、知らん人はわからんよね。）

#製造元IDを調べる
製造元IDを　ググった。　[これ](https://www.the-sz.com/products/usbid/index.php?v=0x1A86)　が見つかった。

USBシリアルの製品IDと同じところに書いてあるのは、 「HL-340 USB-シリアルアダプタ」 でした。
Rubyの『テスト自動化』（Minitest）について、簡単にまとめてみた。

#はじめに
これは、[プロを目指す人のためのRuby入門（チェリー本）](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976)を読んで理解を自分なりにまとめて書き記した物です。
個人的にわからない箇所を書き記したものとなっていますので、全て書いているわけではありません。
しかし、みんながつまずく箇所は似通っているのでは？と思うのでその点に関しては、要点を絞った内容が書けているのではと思います（たぶん）。

今回書くのは、その中でも『第３章：テストを自動化する』（Minitestの基本）についてです。

それでは、内容の方へ入りましょう！

#テストを自動化する
ここで学ぶ事は、
**・Minitestの基本**
です。

そして、テスト自動化とは名前の通り『勝手にテストを行ってくれて、ミスがないか確認してくれるものの事』です。
ミスがないかの確認を毎回毎回行うことは効率が悪いためです。

##●Minitestの基本
まずは、テスト用のフレームワークを用意します。
Rubyにおいてはそのフレームワークの一つとしてMinitestがあります。

Minitestを使うメリットは、
**・Rubyと一緒にインストールされるため、セットアップが不要**
**・学習コストの低さ**
**・Railsのデフォルトのテスティングフレームワークのため、Railsを開発するときにも知識を生かしやすい。**

今回のテストを行うにおいての簡単な手順としては、
1.　Rubyプログラム（テストコード）を書く
2.　テストコードの実行
3.　テスティングフレームワークが結果をチェックして、結果報告

では、実際にテストコードを書いていってみましょう。

```test_ruby.rb
require 'minitest/autorun' # Minitestのライブラリの読み込み

class RubyTest < Minitest::Test
  def test_ruby #メソッド名はtest_で始めるのが必須
    assert_equal 'RUBY', 'ruby'.upcase #この部分が検証される部分。
    #assert_equalはMinitestのメソッド。意味は後で説明
  end
end
```

```
assert_equal　期待する結果,　テスト対象となる値や式
```

この本で紹介されているのは、以下の3つのメソッド
（他にもメソッドは存在します。知りたい方は、[MinitestのAPI公式ドキュメント](http://docs.seattlerb.org/minitest/)へ）

```
#①aとbが等しければテストはパス
assert_equal b, a

#②aが真であればパス
assert a

#③aが偽であればパス
assert a
```

そして、先ほどの```test_ruby.rb```のテストを実行した結果が

```
$ ruby ruby_test.rb
Run options: --seed 35176

# Running:

. #←テストの進歩状況を表しています。（今回はテストメソッドが1個だけのためドットが一つだけ）

Finished in 0.000979s, 1021.4507 runs/s, 1021.4507 assertions/s. # テストの実行スピード
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
```

failuresとerrorsがどちらも0ならテストをパスしたことになります。
今回はテストにパスした例になりますが、次は失敗例をみてみましょう。

###●テストの実行結果、失敗例

```test_ruby.rb
require 'minitest/autorun' 

class RubyTest < Minitest::Test
  def test_ruby
    assert_equal 'Ruby', 'ruby'.upcase # assert_equal 'Ruby'に変更
  end
end
```

```
$ ruby ruby_test.rb
Run options: --seed 18225

# Running:

F

Failure:
RubyTest#test_ruby [ruby_test.rb:5]: ←ruby_test.rb:5からruby_test.rbの5行目でテストが失敗していることが確認できる。
Expected: "Ruby" ←期待された結果
  Actual: "RUBY" ←実際の結果


rails test ruby_test.rb:4



Finished in 0.001320s, 757.5753 runs/s, 757.5753 assertions/s.
1 runs, 1 assertions, 1 failures, 0 errors, 0 skips
```

実行結果の説明をします。
今度はドットではなく、『F』に変わりましたが、これはFailureのFです。
その後は、どこで失敗したかが記載されています。

###●実行結果がエラーの場合
```
$ ruby ruby_test.rb
Run options: --seed 35712

# Running:

E　

Finished in 0.001649s, 606.4282 runs/s, 0.0000 assertions/s.

  1) Error:
RubyTest#test_ruby:
NoMethodError: undefined method `upcase' for nil:NilClass
Did you mean?  case
    ruby_test.rb:5:in `test_ruby'

1 runs, 0 assertions, 0 failures, 1 errors, 0 skips
```

今度は、『F』だったところが、Errorの『E』へと変わりました。

1) Error:以降はエラー内容の詳細になります。

1 runs, 0 assertions, 0 failures, 1 errors, 0 skips
から、1件のエラーで終わったことが確認できました。
NoCodeをいくつか調べてみた(プロジェクト管理ツール編)

「[NoCodeをいくつか調べてみた](https://qiita.com/jansnap/items/8f6f8fd1a50817fefdf8)」の続きです。


# 作ろうとしたサービス
- ビジネスマッチングのプラットフォーム(会員制)、WEB版だけでアプリは不要な場合。

# ツール紹介
- ホームページ簡単制作ツール(STUDIO、Webflow、Caard)は除外。
- アプリケーション作成ツールは、[こちらのページ](https://qiita.com/jansnap/items/8f6f8fd1a50817fefdf8)にまとめました。
- オンラインショップ系は、[こちらのページ](https://qiita.com/jansnap/items/5d598277686a6627a228)にまとめました。


## プロジェクト管理ツール
- [Notion](https://www.notion.so/)
    - Todoリスト、Wiki、Issueトラッカー、表形式のデータベース、などのプロジェクト管理ツール一式が作れる
    - Markdown記法が使える
    - WEBとアプリの両対応。
- [Coda](https://coda.io/)
    - 文書ファイルやスプレッドシートやWikiなどをひとまとめにして管理できる
- [Airtable](https://airtable.com/)
    - 業種とテンプレートを選んで、スプレッドシート形式でデータを管理できる


# 印象
- 既存のプロジェクト管理ツールやスプレッドシートと比較すると、1サイトにまとまるのが利点か。
Ruby on Railsでサーバー起動に苦労した話

#起こった現象
Ruby on Railsで```rails new hoge```としてファイルを作ったが、```run  git init from "."```のところで止まってしまった。
当然、```rails s```としてもサーバーは起動せず、```webpacker:install```しろというようなエラーがでた。

現象としては下記のブログと同じ。
https://yoji4910.hatenablog.com/entry/2020/02/06/184457
ただ、このブログ記事にある通り-Gをしても治らなかった。

環境は以下の通り
・Windows10
・Ruby2.6
・Ruby on Rails6

#対処法
色々調べたら下記Qiita記事を見つけた。
https://qiita.com/libertyu/items/1eb74adc817ab8971100
この記事の通り、```rails webpacker:install```をしたら、下記のようなエラーが出た。

> 'node' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 'nodejs' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。

というわけで下記からNode.jsをダウンロード、インストールした。
https://nodejs.org/ja/download/

こんどこそと思い、```rails webpacker:install```をするとYarnがないとエラーがでた。
これは上記のQiita記事と同じエラーなので、下記からYarnをダウンロード、インストールした。
https://classic.yarnpkg.com/ja/docs/install/#windows-stable

そしてもう一度```rails webpacker:install```をするとやっと成功した。

```rails s```をしてサーバー起動できた！
http://localhost:3000/
にアクセスすると、ちゃんと動いてることが確認できました。
![123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627130/09b20c57-a152-3ab9-d27d-267d8459848a.png)

#感想
めんどくさかった。
どのRuby on Railsの記事を見ても、ほとんどが```rails new hoge```でファイルが作成できることしか書いてなかった。
AWS 基礎

#前提
AWSについて基本的な言語の意味などを書いていきます。
こちらについては、これからも更新していきます。

#本題
・リージョン
AWSの各サービスが提供されている地域のこと。
日本では東京リージョンがおすすめ。
応答時間が早くなるため

・アベイラビリティゾーン
独立したデータセンターのこと
リージョンのなかに最低でも2つはアベイラビリティゾーンが存在する
リージョンを選び、どのアベイラビリティゾーンを使うか選ぶ


#VPC
AWS上に仮想ネットワークを作成できるサービス
リージョンを選択する
VPCは東京リージョンに設定
東京には3つのアベイラビリティゾーンがある
ap-northeast-1a
ap-northeast-1b
ap-northeast-1c


#サブネット
VPCを細かく区切ったネットワーク
1つはインターネットに接続できてもう一つは接続できないようにする
パブリックサブネットとプライベートサブネット
分割単位は/24がおすすめ

##パブリックサブネット
インターネットと接続する

##プライベートサブネット
内部のみの接続

IPアドレスをまず決める

・IPアドレスとは
インターネット上の住所

・２進数
各桁を０か１を使って数値を表す
コンピューターは２進数で計算を行う

・ビット
２進数の1桁（０か１）
最小単位

・バイト
８ビットを１バイト
１バイトは８ビット
２バイトは１６ビット


・１０進数
０〜９の１０種類の数値を使って数値を表す
普段使用している数値表現

・IPアドレスの範囲を表記
ネットワーク部
ホスト部（下辺部）

・CIDR表記
IPアドレスの後ろに/を書き、その後ろにネットワーク部が先頭から何ビット目までなのかを記載する

・サブネットマスク表記
IPアドレスの後ろに/を書き、ネットワーク部を表すビットと同じ部分を１にホスト部を表すビットと同じ部分を０にする

・設定するネットワークのIPアドレス

１、VPC作成
２、サブネット作成
３、ルーティング設定

２、サブネット作成
パブリックサブネット作成
プライベートサブネット作成

EC2とは


AMIとは
EC２インスタンスが起動する時に必要となる
小規模システム向け。
中学校の委員分け

## これなに

生徒の希望を元に「クラスの委員を割り当てる問題」を組合せ最適化で解きます。
[中学校の委員分けを最小費用流で最適化してみた話](https://qiita.com/defineprogram/items/b8eb70bb92101241703b)のPython版です。

## 方針

- 生徒の委員の希望を1レコードとしたpandas.DataFrameを作成します。
  - 第1希望のコストを10、第2希望のコストを30とします。
- DataFrameを使って数理最適化モデル（コスト最小化）を作成します。
- [数理最適化モデル](https://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0)をソルバーで解いて割り当てを出します。

## 数理最適化モデル

- 変数：DataFrameの列として作成（1行1変数）。
- 目的関数：希望コストの総和最小化
- 制約条件
  - 生徒がなれる委員は1つまで
  - 委員は定数を満たす

## 入力

DataFrameを作成します。

```
import pandas as pd
from pulp import lpDot, lpSum
from ortoolpy import model_min, addbinvars, addvals

lst = [['タプリス', '風紀委員', 10], ['青葉', '学級代表', 10], ['かぐや', '風紀委員', 10],
       ['チノ', '学級代表', 10], ['ミラ', '風紀委員', 10],
       ['タプリス', '学級代表', 30], ['青葉', '図書委員', 30], ['かぐや', '図書委員', 30],
       ['チノ', '風紀委員', 30], ['ミラ', '学級代表', 30]]
need = {"学級代表": 1, "図書委員": 2, "風紀委員": 2}
df = pd.DataFrame(lst, columns=['Name', 'Committee', 'Cost'])
addbinvars(df)

print(df)
```

|    | Name     | Committee   |   Cost | Var     |
|---:|:---------|:------------|-------:|:--------|
|  0 | タプリス | 風紀委員    |     10 | v000001 |
|  1 | 青葉     | 学級代表    |     10 | v000002 |
|  2 | かぐや   | 風紀委員    |     10 | v000003 |
|  3 | チノ     | 学級代表    |     10 | v000004 |
|  4 | ミラ     | 風紀委員    |     10 | v000005 |
|  5 | タプリス | 学級代表    |     30 | v000006 |
|  6 | 青葉     | 図書委員    |     30 | v000007 |
|  7 | かぐや   | 図書委員    |     30 | v000008 |
|  8 | チノ     | 風紀委員    |     30 | v000009 |
|  9 | ミラ     | 学級代表    |     30 | v000010 |

Var列が変数（1:割り当てる、0:割り当てない）

## モデル作成と求解

```
m = model_min()
m += lpDot(df.Cost, df.Var)  # 希望コストの総和
for _, gr in df.groupby('Name'):
    m += lpSum(gr.Var) <= 1  # 生徒がなれる委員は1つまで
for k, gr in df.groupby('Committee'):
    m += lpSum(gr.Var) == need[k]  # 委員は定数を満たす
m.solve()
addvals(df)
```

## 結果

```
print(df[df.Val > 0])
```

|    | Name     | Committee   |   Cost | Var     |   Val |
|---:|:---------|:------------|-------:|:--------|------:|
|  0 | タプリス | 風紀委員    |     10 | v000001 |     1 |
|  3 | チノ     | 学級代表    |     10 | v000004 |     1 |
|  4 | ミラ     | 風紀委員    |     10 | v000005 |     1 |
|  6 | 青葉     | 図書委員    |     30 | v000007 |     1 |
|  7 | かぐや   | 図書委員    |     30 | v000008 |     1 |

## 補足

元記事では最小費用流問題にしてます。その場合、[NetworkX](https://networkx.github.io/)の`min_cost_flow`が使えます。

ただし、モデルを改造するのであれば、本記事のように数理最適化モデルの方が対応しやすいでしょう。数理最適化の計算時間も十分速いです。
NoCodeをいくつか調べてみた(マーケットプレイス系(オンラインショップ)編)

「[NoCodeをいくつか調べてみた](https://qiita.com/jansnap/items/8f6f8fd1a50817fefdf8)」の続きです。


# 作ろうとしたサービス
- TemplateMonsterやTheme Forestのような、電子コンテンツのダウンロード販売サイト

# ツール紹介
- アプリケーション作成ツールは、[こちらのページ](https://qiita.com/jansnap/items/8f6f8fd1a50817fefdf8)にまとめました。
- プロジェクト管理ツールは、[こちらのページ](https://qiita.com/jansnap/items/dcf045579daa5d1059c4)にまとめました。


## マーケットプレイス系(オンラインショップ)

(既存のショッピングカートのシステム/SaaSとの違いや使い分けは要検討。EC-CUBEやopencartでいいじゃんという話し。)

- [sharetribe](https://www.sharetribe.com/)
    - Go(79ドル〜/月)とFlex(299ドル〜/月)の2つのプランがある
    - 利用例： [WheelPrice](https://www.wheelprice.com/) (自動車部品を売買できるサイト)
    - FlexプランだとフロントがReactなのでカスタマイズできる
    - デジタル物は(今のところ)販売できない(公式ページ:[Is it possible to sell digital files in a marketplace?](https://help.sharetribe.com/en/articles/674504-is-it-possible-to-sell-digital-files-in-a-marketplace))

- [arcadier](https://www.arcadier.com/)
    - 物品販売やサービス予約のテンプレートがある。
    - カテゴリや対応言語を選んで、デザインを入れて完成。
    - タグで検索する機能がある。
    - サーバ管理などのインフラ込みのサービス。
    - Youtubeの「[【NoCode】コードを書かずにメルカリのようなサービスを１時間で作ってみる](https://www.youtube.com/watch?v=Dd4GptSGvMY)」が参考になる。
    - 一番安いプランで68ドル/月(6ヶ月契約)。ユーザ数は制限なし。
    - デジタル物は(今のところ)販売できない。(公式ページ：[Can I sell digital products?](https://support.arcadier.com/hc/en-us/articles/115001758373-Can-I-sell-digital-products-))

- [KREEZALID](https://www.kreezalid.com/)
    - 物以外にデジタルな物も売れる(公式サイト: [Digital assets marketplaces
](https://www.kreezalid.com/use-cases#digitalassets))
    - 一番安いLiteプラン(99ドル/月)だと、~~150~~300ユーザ(売り手と買い手の合計)まで登録できる

- [yelo](https://jungleworks.com/yelo/)
    - テーマファイルが充実している印象。
    - 無料プランは14日間。有料プランは69ドル/月から。
    - この会社は他にも、ドローン配達のプラットフォームや、配送管理のプラットフォームも作っている。

- [MemberStack](https://www.memberstack.io/)
    - 既存サイトを会員制にできる
    - [gumroad](https://gumroad.com/)みたいな感じ。


# ざっくりまとめ
- マーケットプレイス系は、デジタル物を売りたいなら[KREEZALID](https://www.kreezalid.com/)、物やサービスだけなら[sharetribe](https://www.sharetribe.com/)や[arcadier](https://www.arcadier.com/)。
- 既存のショッピングカートのシステム/SaaSとの違いや使い分けは要検討。
NoCodeをいくつか調べてみた(アプリケーション作成ツール編)

# NoCodeとは
- プログラミング不要で、WEBサービスやスマホアプリが作れるらしい。
- 何社かが作成ツールをSaaSで?提供しているらしい。
- 自由度は低いかも。
    - 少量のコーディングで開発する「LowCode」という呼び方もあるらしい。プラグインで拡張みたいな感じか?


# 作ろうとしたサービス
- ビジネスマッチングのプラットフォーム(会員制)

# NoCodeの紹介・説明サイトをググって挙げる

- [NoCodeというツールを活用する。｜三上蒼太 | yenta by Atrae｜note](https://note.com/smikami/n/n5ab339b44cca)
- [誰でもWebサービスを作れる。NoCodeツールをご紹介【Zeroqode】｜NoCode Ninja｜note](https://note.com/nocodeninja/n/n290fd3a5b319)
- [NoCodeはさほど伸びないし関わらない方が良いと思う理由](http://otihateten.hatenablog.com/entry/2019/11/20/080447)
    - 「誰にとってNoCodeは有益か」「まとめ」あたりを読んで頭に入れておかないと、時間をくったわりに袋小路に突入しそう。
- [コードを1行も書かずにプロダクトを作る？NoCodeで作られたプロダクトとツールまとめ](https://codelearn.jp/articles/nocode-product)
    - スクールの宣伝も含まれているが、スルー。
- [メルカリのようなサービスを、10万円で作る方法を考えてみる｜__shinji__｜note](https://note.com/__shinji__/n/n4fc0052716e8)




# ツール紹介

- ホームページ簡単制作ツール(STUDIO、Webflow、Caard)は除外。
- プロジェクト管理ツール系は、[こちらのページ](https://qiita.com/jansnap/items/dcf045579daa5d1059c4)にまとめました。
- オンラインショップ系は、[こちらのページ](https://qiita.com/jansnap/items/5d598277686a6627a228)にまとめました。

## アプリケーション作成ツール

- [Adalo](https://www.adalo.com/)
    - スマホアプリ(とそのWEB版)をD&Dと設定だけで作れる
    - XcodeのInterfaceBuilderに似てるかも。
    - 無料プランでは、1アプリあたりのデータが50行までしか保存できない。
    - 有料プランは50ドル/月(5GBまでのデータ保存、独自ドメイン可、AppleやGoogleのストアにアプリを出せる)と、200ドル/月(左記+20GBまでのデータ保存)の2種類。
    - 予約アプリやショッピングサイトアプリなどのサンプルがある。

- [Glide](https://www.glideapps.com/)
    - GoogleSheetsのデータを、アプリで見られる。
    - 24種類あるテンプレートを選んでカスタマイズして作る。
    - シンプルで分かりやすい。
    - Webページは作れないぽい。
    - 無料プランは、データ500行まで、画像ファイル100MBまで、独自ドメイン不可。

- [bubble](https://bubble.io/home)
    - 色々できそうだが、ちょっと取っ付きづらい感じ。
    - プラグインがいっぱいある。
    - レスポンシブデザインでWEBページも作れる。

- [Zeroqode](https://zeroqode.com/)
    - 上記のBubbleで作られている
    - テンプレートを99-199ドルぐらいで買って、修正して、公開。


# ざっくりまとめ
- データ表示系アプリは[Adalo](https://www.adalo.com/)や[Glide](https://www.glideapps.com/)、もう少しこったサービスにするなら[bubble](https://bubble.io/home)。
git add .で警告。warning: adding embedded git repository:

#警告内容

```
$ git add .
warning: adding embedded git repository: リポジトリ名
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint: 
hint:     git submodule add <url> リポジトリ名
hint: 
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint: 
hint:     git rm --cached リポジトリ名
hint: 
hint: See "git help submodule" for more information.
```
###ー　原因は？　ー
**コミットしようとしたプロジェクトのフォルダの中に、別に取り込んできたリポジトリがあるからステージングできない**

思い当たることと言えば、確かにcloneしたリポジトリへ別のリポジトリのものを取り込んできていました。
原因はそこでしたね。

そして、解決策は？

#試したこと
```
hint:     git rm --cached リポジトリ名
```
で記載されている通りに```$ git rm --cached リポジトリ名```
してみましたが、

```
error: the following file has staged content different from both the
file and the HEAD:
```
とのことで、『違うファイルがステージングされる』から無理ですよ。ってことですかね。

#解決法

そこで一度/.gitをを削除します。

```
$ rm -rf リポジトリ名/.git
```

これで、```$ git add .```は問題なくパスできます。

しかし、続いてはコミット＆プッシュができない。

そこで今度は以下のコマンドを打ちました。

```
$ mv リポジトリ名 subfolder_tmp
$ git submodule deinit リポジトリ名
$ git rm --cached リポジトリ名
$ mv subfolder_tmp リポジトリ名
$ git add リポジトリ名
```

解決しました。
「物理のカギしっぽ」のサイトのスクレイピングGAS-PGM

<h1>「物理のカギしっぽ」のサイトのスクレイピングGAS-PGM</h1>

「物理のカギしっぽ」のサイトをスクレイピングするGAS-PGMです。
サンプルスプレッドシートのスクリプトエディタのページからscraping()のメソッドを実行することで処理を行います。抽出した内容は本スプレッドシートのoriginURLシート内で指定したフォルダIDのフォルダにoutput1.txt, output2.txt, ...のように連番で出力されます。
実行前にスクレイピング元のURLを本スプレッドシートのoriginURLのシートに書き込んでおく必要が
あります。

<hr>
サンプルスプレッドシート:https://drive.google.com/open?id=1sJ5n90ZSNfD6WDGjNyIUiZzwwQ7asFD9QoDL0ToDY98

GASPGM: https://github.com/NanjoMiyako/SampleGasScripts1/blob/main/kagisippo-scraping.txt

<hr>
スクレイピング元サイト
<a href="http://hooktail.sub.jp/">物理のかぎしっぽ</a>
Pandocで日本語を含む Markdown + LaTeX からPDFを出力する(Dockerコンテナ)

Pandoc + Eisvogel で日本語を含む Markdown + LaTeX からPDF出力できるDockerコンテナを作ったのですが、苦労したのでメモ。

ソースコードは[ここ](https://github.com/nnashiki/pandoc-eisvogel-ja)にあります。

# サンプル
Markdown から[こんな感じのPDF](https://github.com/nnashiki/pandoc-eisvogel-ja/blob/master/sample/sample.pdf)が出力できます。


![スクリーンショット 2020-04-26 0.08.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/06e8aeb0-474f-b424-f66e-44f7724ef498.png)
![スクリーンショット 2020-04-26 0.06.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/8e98a058-05ec-9a02-055f-fcb373ff6c0a.png)

# 解説

[こちら](https://qiita.com/sky_y/items/3c5c46ebd319490907e8#%E3%81%8A%E3%81%BE%E3%81%91docker%E3%81%A7pandoc%E3%82%92%E4%BD%BF%E3%81%86)のPandoc解説記事にてPandocの公式レポジトリがある事を知りました。(@sky_y 様ありがとうございます。)

> ただしPDFエンジンにLaTeXを用いる場合は、このままでは日本語ファイルの扱いに難があります。
> pandoc/latex ではTeX Live ()がインストールされており、tlmgrも利用できます。実際にはDockerfileを自分で書くときに、上記をイメージのベースとして、足りないTeX Liveのパッケージやフォントを追加するとよいでしょう。（別にまとめたいと思うので、しばらくお待ちください……）

記載にあった通り、`pandoc/latex` そのままでは日本語を扱えなかったため、必要なTeX Liveのパッケージを追加して、eisvogelを使えるようにしたのが今回の記事です。

## 日本語対応に必要なTeX Liveのパッケージの追加
> 日本語の LaTeX 文書を作成するためには scheme-full でインストールするか，各スキームでインストールした後に collection-langjapanese をインストールすることになります．

 from https://texwiki.texjp.org/?TeX%20Live

collection-langjapaneseを追加したところ、日本語が出力できるようになりました。

## Eisvogelのtemplateの用意

> If there are no folders called templates or pandoc you need to create them and put the template eisvogel.latex inside. You can find the default user data directory on your system by looking at the output of pandoc --version

from https://github.com/Wandmalfarbe/pandoc-latex-template

[README](https://github.com/Wandmalfarbe/pandoc-latex-template) の記載の通りに`templates/eisvogel.latex`を用意します。


## Eisvogelの動作に必要なTeX Liveのパッケージの追加
https://github.com/Wandmalfarbe/pandoc-latex-template#texlive を参考にしました。


解説は以上です。