OmniAICreator/Qiita-1.07M huggingface dataset:
Routing Error解決のヒント

# 始めに
アプリ開発にはエラーはつきものです。
まずエラーが出た時の対処として、エラー文を読み解くことも大切ですが、
より早くエラーを解決するためには以下を考えることが必要です。


エラーが出てしまった☹︎
↓
①何をしたらエラーになったのか考える
↓
②エラー文を解読する（どこの記述がエラーなのか読み解く）
↓
③どこがどう間違えている可能性があるのか___仮説___を立てる


# Routing Error = ルーティングがおかしい
文のそのままの意味でルーティングが通常通りに機能していないエラー文です。タイトルの下には　No route matches [HTTP] "URIパターン" の記載があり、エラーになっているHTTPとURIを教えてくれています。まずはそこを確認します。また、その以下の表には rails routesコマンドを行なった時と同じ一覧があるのでエラーになっているHTTP、URIパターンと比べることができます。
[![Image from Gyazo](https://i.gyazo.com/a4e8658acbcaddc0dd870c6f552cc4bf.png)](https://gyazo.com/a4e8658acbcaddc0dd870c6f552cc4bf)

## 解決のヒント
①何をした時にエラーが起こっているのかエラー文にあるHTTPとURIを使って調べる
 - 異なるHTTPがあれば、そこのルーティングが動いた時にエラーがあることがわかる
②ルーティングの記述が間違っていないか(routes.rbファイル)
 - do~endは囲まれているのか
 - resourceの書き方、スペルに間違いはないか
③viewのパスに間違いはないのか(form_with,like_to,aのリンク先など)
 - リンクの飛ぶ先のパスはあっているのか
 - 情報の受け渡しは行われているのか
 - スペル間違いはないか（@やsのつけ忘れ）
tailwindcssをREACTでやってみた

#tailwindcssをREACTでやってみた

tailwindcssは通常のCSSとtailwindcssのCSSライブラリをプリコンパイルして、
普通のCSSにしてくれます。

公式チュートリアルの
npm経由でTailwindをインストールする


https://tailwindcss.com/docs/installation

（npm経由でTailwindをインストールするを与える書き方は  を参照）

ただし「TailwindをPostCSSプラグインとして追加する」こちらはよくわからないので無視

PostCSSなしでTailwindを使用するを参考にして、みました
つまり、CSSで記載した中身をtailwind.cssとして作成してから、index.jsでインポート
するだけで使えます。


インストールコマンドは `npx tailwindcss-cli@latest build -o tailwind.css` です


`npx tailwindcss build src/index.css -o src/index.compiled.css`　これは名前をしてしています

npx tailwindcss initをわすれずに

``` react
import "./index.compiled.css";

   <div class="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-md flex items-center space-x-4">
            <div>
              <div class="text-xl font-medium text-black">ChitChat</div>
              <p class="text-gray-500">You have a new message!</p>
            </div>
          </div>
```

CSSをビルドしなおさないと、ビルド後のファイルに反映されないのでスクリプトファイルの更新をわすれずに

>"scripts": {
  "build": "tailwind build css/style.css -o public/css/style.css"
},
【RPGツクールMV/RPGツクールMZ】マップのメモ欄を使った判定

RPGツクールMVではmeta."文字列"で判定可能。
私がプラグイン改造で実装した例を掲載します。

GALV_BasicEventShadows.js
https://galvs-scripts.com/2016/04/07/mv-basic-event-shadows/

例.マップのメモ欄に<noShadow>を含む場合にプレイヤーの影を生成しない
$dataMap.meta.文字列で判定

```javascript:
  Spriteset_Map.prototype.doActorShadows = function () {
    if ($gameSystem._playerShadow) {
      // add
      var fols = $gamePlayer.followers()._data;
      for (var i = 0; i < fols.length; i++) {
        fols[i]._shadow = true;
        this.createBShadow("f" + i + 1, fols[i]);
      }
      $gamePlayer._shadow = true;
      //マップメモ欄に<noShadow>が含まれている場合プレイヤーの影を消す(returnで処理を中断し生成しない）
      if ($dataMap.meta.noShadow) {
        return;
      }
      this.createBShadow("f0", $gamePlayer);
    } else {
      // Remove
      var fols = $gamePlayer.followers()._data;
      for (var i = 0; i < fols.length; i++) {
        fols[i]._shadow = false;
        this.destroyBShadow("f" + i + 1, fols[i]);
      }
      $gamePlayer._shadow = false;
      this.destroyBShadow("f0", $gamePlayer);
    }
  };
```

BattleVoice.js
https://plugin.fungamemake.com/archives/2606

例.戦闘中かつメモ欄に<invalidVoice>が含まれるスキルを使用した場合、ボイスSEを演奏しない。
BattleManager._action.item().meta文字列で判定

```javascript:

  var playActorVoice = function (actor, type) {
    if (!canPlayActorVoice()) {
      return;
    }
    //改変箇所。戦闘中かつメモ欄に<invalidVoice>が含まれるスキルを使用した場合、演奏しない。
    if (BattleManager._action.item().meta.invalidVoice) {
      return;
    }

```
MySQLを使ったRailsアプリをHerokuにデプロイしようとしてエラーになった話

#開発環境
* Ruby(3.0.0)
* Ruby on Rails(6.1.3)
* MySQL(8.2.3)

#エラーになった背景
```
heroku run rails db:migrate
```

上記のコマンドを入力した時に、下記のエラーが発生。

```
Mysql2::Error::ConnectionError: Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
```

#エラーの原因
HerokuのデフォルトのデータベースがPostgresqlであるため、MySQLを使う場合は下準備が必要であるため。

##解決方法
#ClearDBというアドオンを使う
```
heroku addons:create cleardb:ignite
```

上記のコマンドを入力します。
すると、ClearDBというアドオンを使うことができるようになります。

#Mysqlへの接続
次に、Rails側でそのMySQLデータベースの情報を知る必要がありますが、Railsは

```
DATABASE_URL
```

という環境変数が設定されていると、その情報を使ってデータベースに接続するという仕様になっているため、

```
heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'
```

でMySQLの情報を設定してあげると、その情報を使ってMySQLに接続できる、ということになります。
Mac(BootCamp)でWindows10 20H2に更新した際のIME日本語「かな」「英数」キー割り当て設定

Windows 10 20H2に更新するとキー割り当てが変わりました。
従来操作と同じ画面が出てこなかったのでメモしておきます。
右下のIMEで右クリック→設定をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262065/62d60bf4-4d47-c86b-2223-d740ea407129.png)
キーとタッチのカスタマイズをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262065/3318100c-f38c-9b2e-5aaa-7fd2186ab44f.png)
無変換キーに「IME-オフ」、変換キーに「IME-オン」を設定すると、かな／英数でON/OFFできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262065/35082580-8e38-6b41-fdfe-5ec3a205e55d.png)
オブジェクト指向プログラミング（ＯＯＰ）の概念の理解を助けるためのＧＩＦアニメ

大変婉曲的な操作で理解しづらいオブジェクト指向プログラミング（ＯＯＰ）について、イメージしやすいようなスライドを制作しました。
ＣＯＢＯＬ言語などの手続き的言語においても、ファイルハンドルの指定やフィールド名の多重定義(redefine)などで、オブジェクト指向プログラミングの考え方の要素が根付いていることを示唆しつつ説明しています。
![OOP_Moovie1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147091/e9f74407-b997-7b36-019a-3e6f44f2570b.gif)
tinkerを使ってみて勉強になった話

MySQLの接続がうまくいかなくて、「解決できたよ！」って記事ではないのですが
「こんな方法あるんだ！」と思ったことがあったので備忘録のため残します。

## tinker

`artisan migrate`コマンドがうまくいかず、エラーメッセージ的に接続が拒否されている内容かなと思ったのでその理由を調べたくてググっていたところ`tinker`でデバッグを調べられることが分かりました。

使い方は簡単でターミナルでコマンドを打つだけです。
Dockerの場合はコンテナに入った状態で行います。

```
php artisan tinker
```

そうするとそのまま対話シェルが起動してコマンドを打てるようになります。
以下が実際に入力してみた内容です。

`>>>`の後にそれぞれのコマンドを入力する事で設定内容が確認できます。

```
>>> config('database.default');
=> "mysql"
>>> config('database.connections.mysql.port');
=> "3306"
>>> config('database.connections.mysql.database');
=> "my_app"
>>> config('database.connections.mysql.password');
=> "pass"
>>> config('database.connections.mysql.host');
=> "127.0.0.1"
```

私の場合は`config('database.connections.mysql.database');`が.envやdatabase.phpと違ったので「あれ？」となってエラー解決の原因究明に役立ちました！

以上です。
M1 MacbookAirでpython環境を整える（備忘録）

2021/3/21時点で
M1チップにpipなど対応していない多い模様。pandasなどもインストールできないので
とりあえず、M1チップのMacでPythonが動く環境を整える。


#xcodeをインストール
ターミナルで下記のコマンドでxcodeをインストール

```
xcode-select --install
```
下記のようなメッセージが出た場合は、インストールを選択し、そのまま進めていきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/2248cad3-19ae-d4e2-e51f-1802a2090853.png" width=30%>




#Miniforge3をインストール
Miniforge3をダウンロードしていきます。　https://github.com/conda-forge/miniforge

まず、[ここ](https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh) からarm64 (Apple Silicon)用のスクリプトをダウンロードしてホームディレクトリに置きます。
その後、ターミナルで下記のコマンドを実行します。
　

```
bash Miniforge3-MacOSX-arm64.sh
```

~/.zshrcに色々書き込まれているようなので、下記コマンドで反映

```
source ~/.zshrc
```

仮想環境を設定

```
conda create -n myenv python=3.9
conda activate myenv
```
あとはconda install・・・でinstallができる。

```
conda install -c anaconda pandas
conda install -c anaconda scipy
conda install -c conda-forge matplotlib
conda install -c anaconda networkx
```

##mysqlのインストール
まず、Homebrewをインストールします。
https://brew.sh/index_ja
からコマンドをコピーしてきて、ターミナルに貼り付け実行
brewのインストールが終わると、下記のような指示が出ているの赤枠でくくったところをターミナルで１行ずつ実行。（パスを通す作業）
![addpath.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/866651c4-a3d4-12af-947b-c352c315531d.png)
ターミナルで

```
brew help
````

を実行してhelpが表示されたらOK


```
brew install mysql
```

でmysqlをインストール

```
mysql.server start
```

でMySQLを起動

```
mysql -uroot
```
でrootユーザーログインできる。

pythonでmysqlを使うために

```
pip install mysql-connector-python
```
condaではインストールできず。。。

##文字化け防止

https://ja.osdn.net/projects/ipafonts/releases/57327
[ここ](https://ja.osdn.net/projects/ipafonts/downloads/57327/ipaexg00201.zip/)からzipファイルをダウンロードして解凍したipaexg00201フォルダを
ライブラリフォルダ内のFontsにコピー
キャッシュが残っているかもしれないので、下記コマンドでキャッシュを削除

```
rm -rf ~/.matplotlib/
```

##opencvのインストール

```
conda install opencv
```

face-recognitionはcondaでインストールできなかったので、pipでインストールした。。。cmakeをインストールしないとface-recognitionはインストールできない

```
brew install cmake
pip install face-recognition
```

mysql-connector-pythonもcondaでインストールできなかったので、pipでインストール

```
pip install mysql-connector-python
```
Clang を弄るための準備

# Clang で AST を弄りたくて
Clang で AST(抽象構文木)をイジるために色々いじってみました。

そのための下地づくりをしたいと思います。

## Clang の力を借りて何かしたいときはここから始めないといけない…。みたい。
まずは、llvmプロジェクトのリポジトリをクローンします。

```bash
$ git clone https://github.com/llvm/llvm-project.git
```
かなーり時間がかかりますがしかたありません。

で、Cmake をつかってビルド＆インストールをするのですが、私の環境ではNinjaを使うよりもGNU Make を使うほうがはるかに早いので以下を実行しました。

どれだけ違うかというと

``` 
ninja :165m
gmake :58m
```
次に、付け加えたいプロジェクトを llvm-project/clang-tools-extra のディレクトリに追加します。

```bash
$ mkdir -p ${llvm-project のディレクトリ}/clang-tools-extra/ディレクトリ名
$ vim ${llvm-project のディレクトリ}/clang-tools-extra/ディレクトリ名/ソースコード.cpp
``` 

でもって、次にこれをビルドできるようにします。

```bash
$ echo 'add_subdirectory(プロジェクト名：つまりディレクトリ名)' >> clang-tools-extra/CMakeLists.txt
$ vim clang-tools-extra/ディレクトリ名/CMakeLists.txt
```

以下の設定をCmakeLists.txtに書きます。

```cmake:CMakeLists.txt
set(LLVM_LINK_COMPONENTS support)

add_clang_executable(プロジェクト名
  ソースコード.cpp
  )
target_link_libraries(プロジェクト名
  PRIVATE
  clangTooling
  clangBasic
  clangASTMatchers
  )
```

あとはソースコード.cppを畫いて、ビルドしなおします。[2]のソースコードを参考に書いてみてください。

これを含んだパッケージをビルドしてみます。

```bash
$ mkdir llvm-project-build
$ cmake3 ${llvm-project のディレクトリ} -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra"  -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++  
```

で、ふつーにビルド＆インストールします。

```bash
$ make -j6 <-環境に合わせてください。
$ sudo make install
```

これで、ビルドがうまくいったら実行できるはずです。

```bash
$ ./bin/プロジェクト名 解析したいプログラム名 --
```

何もなければ何も起こらないのでこれでOKです。

…のはず。

これで、あとはいじっているソースコードを変更するたびに

```bash
$ make プロジェクト名
```

をすれば勝手にビルドしてくれます。


参考URL：
[1] https://llvm.org/docs/GettingStarted.html
[2] https://clang.llvm.org/docs/LibASTMatchersTutorial.html
画像がアップデートされない。。

refile（Gem）を使って画像投稿をしていて、
マイページでプロフィール画像の編集できるようにしたが、
なぜか画像が更新されない。

editアクション、updateアクションもやっている。

```markdown
def edit
    @user = User.find(params[:id])
end

def update
  @user = User.find(params[:id])
  @user.update(user_params)
  redirect_to user_path(@user.id)
end
```

viewもこんな感じ

```markdown
<%= attachment_image_tag @user, :profile_image, :fill, 60, 60, class: "img-circle pull-left profile-thumb", fallback: "no_image.jpg"%>
```

##環境
・docker
・Rails

## 試したこと

・ブラウザにキャッシュされているのかな？と思いキャッシュを削除。
・fillの部分をsizeに変更してみましたが出来ない。

## 解決

**docker-compose run**をしてみたら、なぜか出来た。

⇨新しいコンテナが作られたからかな？
⇨最初、docker-copose up -d で放置していて、それから新しいコンテナを作っていなかったから？
⇨まだ頭のモヤモヤが。。。

とりあえず、解決したので、進みます。もやもやがありますが、、、
アソシエーションしてbuildするときの1対多と1対1の記述の仕方の違いについて

# buildの使い方

アソシエーションによって記述の仕方に違いがあるが、まとっているサイトがなかったので書きました。


## １対多

```ruby

# User.rb
class User < ApplicationRecord
  has_many :posts
end

# Post.rb
class Post < ApplicationRecord
  belongs_to :user
end

# Posts_controller.rb
def new
  @post = @user.posts.build
end

```

## 1対1

```ruby

# User.rb
class User < ApplicationRecord
  has_one :account
end

# Account.rb
class Account 
  belongs_to :user
end

# Accounts_controller.rb
def new
  @account = @user.build_account
end

```

### 参考

https://railsguides.jp/association_basics.html
【AWS】mac EC2でデプロイ時エラー No space left on device　空き容量の不足の対処

#経緯
Capistrano導入後、久々にローカルでデプロイ`bundle exec cap production deploy`するとNo space left on deviceのエラーが発生しました。
解決までの経緯を紹介します。


#環境
macOS:Catalina 10.15.7
ハードディスクサイズ　８GB



#【エラー文】
Net::SCP::Error: scp: /tmp/git-ssh-.sh: No space left on device
「デバイスにスペースがない」
いろいろ調べてみましたが、要は上の通りスペースがないのが原因でした。

#結論
ファイルを削除し、再度作成しました。


#対応
何にどれくらい使ってるか調査します。

```:EC2内
df -h

ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         482M     0  482M    0% /dev
tmpfs            492M     0  492M    0% /dev/shm
tmpfs            492M  6.6M  486M    2% /run
tmpfs            492M     0  492M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  8.0G   20K  100% /  ⇦これが大きい
tmpfs             99M     0   99M    0% /run/user/1000
```
最大容量が8Gに対して`/dev/xvda1`で既に8.0G使ってる事わかりました。
`/dev/xvda1`内のもっと詳細を調査しました。

```:EC2内
sudo du -sh /*

.
.
.
.
.
0       /proc
28K     /root
448K    /run
0       /sbin
0       /srv
512M    /swapfile1
0       /sys
8.5M    /tmp
1.5G    /usr
5.7G    /var
```

どうやら以下の2つのディレクトリ内に大きファイルがあるようでした。
1.5G  /usr
5.7G  /var
どのファイルか特定します。

```:EC2内
cd /var
sudo du -sm ./* | sort -rn | head -5

 118891 ./www
   2541 ./lib
    124 ./log
     84 ./cache
     14 ./tmp
```
`118891 ./www`が半端なく大きにのでこれを削除します。

```:EC2内
sudo rm -rf /var/www
```
確認します。

```:EC2内
df -h

ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         482M     0  482M    0% /dev
tmpfs            492M     0  492M    0% /dev/shm
tmpfs            492M  416K  492M    1% /run
tmpfs            492M     0  492M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  3.4G  4.7G   42% /  #⇦減ってる
tmpfs             99M     0   99M    0% /run/user/1000
```
8GBが3.4Gとだいぶ小さくなりってます。
最後新しい入れ物を作ります。

```:EC2内
[ec2-user@xxxxxxxxxx ~]$ cd
[ec2-user@xxxxxxxxxx ~]$ sudo mkdir /var/www/
[ec2-user@xxxxxxxxxx ~]$ sudo chown ec2-user /var/www/
[ec2-user@xxxxxxxxxx ~]$ cd /var/www/
[ec2-user@xxxxxxxxxx www]$ git clone https://github.com/アカウント名/デポジトリ名.git
[ec2-user@xxxxxxxxxx www]$ cd /var/www/デポジトリ名
[ec2-user@xxxxxxxxxx デポジトリ名]$ bundle install
```

```:ローカル
bundle exec cap production deploy
```
うまく行きました！！


#参考
https://www.souichi.club/aws/out-of-disk-space/
【Rails】deviseでのユーザ名ログイン機能の実装

# 目標
deviseのユーザー登録/ログイン方法は、デフォルトでメールアドレスとパスワード。
これをユーザ名で登録/ログインできるように変更する。

# 準備
1. deviseをインストール
Gemfileに`gem 'devise'`追記 + `$ bundle install`

2. 初期設定
`rails g devise:install`

3. モデル作成　*モデル名は任意（今回はUser）
`rails g devise User`

4. View作成
`rails g devise:views users`
views/usersのカスタマイズを反映するため、デフォルトのスコープを変更。
具体的には、config.scoped_viewsをtrueに変更。

```config/initializers/devise.rb
config.scoped_views = true
```

# 実装
### ユーザ登録（Sign Up）
1. ユーザ名カラムを追加 + `rails db:migrate`

 ```ruby:マイグレーションファイル
  def change
    create_table :users do |t|
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      t.string :name, null: false # null: false（＝空の状態で保存させるのを防ぐ）
 # 中略
      t.timestamps null: false
    end
```

   > 【注意】
   nameをログイン時のキーに使用する場合（記事の最後で認証キーをnameに設定します）、ユーザーと一意に紐づけられている必要があります。
   今回はバリデーションで、nameにuniqueness:trueを設定しています。

2. ユーザ登録画面にユーザ名入力フォームを追加（views/devise/registrations/new.html.erb）
3. ストロングパラメータを設定し、ユーザ名とemailのデータ操作を許可

*ここでemailも許可する理由は、後から認証キーをemailからnameに変更するため。

```ruby:application_controller.rb
  before_action :configure_permitted_parameters, if: :devise_controller?
	# deviseの機能が使われる前に、configure_permitted_parametersを実行

  protected
  def configure_permitted_parameter
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :email])　# sign_up時にユーザ名（+email）の操作を許可
  end
```

### ログイン（Sign In）
1. ログイン画面にフォームを追加（views/devise/sessions/new.html.erb）
2. 認証キーをemail→nameに変更　*コメントアウトは外す

```ruby:config/initializers/devise.rb
config.authentication_keys = [:name]
```
AndroidStudioでメモリ容量が足りないときの対処法

#AndroidStudioでメモリ容量が足りないときの対処法

###筆者がAndroidStudioでアプリを作成しているときに、AndroidStudio側から「メモリの容量が少なくなっている」との指摘がありました。
そのときに作っていたアプリですが、変数の数が非常に多いアプリだったので、作業中に打ち込んだコードの読み込み時間が長くなってしまって、効率よく作業を行うことができなくなってしまいました。
原因を調べてみると、改善策がいくつか見つかりましたが、その中で実際に行ったら読み込み時間が改善されて、最も簡単だった方法を載せます。

AndroidStudio起動時の「Welcome to Android Studio」ダイアログ右下の「Configure」をクリックして、「Preferences」を選択する。
![2021-03-21_03.11.14_Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/25a78ec0-7e17-7c09-61ce-997c407bd636.png)
![2021-03-21_03.17.10_Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/0eb88a7a-735d-23f9-1060-46b48ebde8d7.png)


「Appearance & Behavior」内の「System Settings」から、「Memory Settings」を選択する。
![2021-03-21_03.14.07_Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/d4ee6db0-39c4-c2a4-b766-ed00a5df9096.png)


「IDE max heap size:」から、AndroidStudio使用時に使えるメモリの最大容量を変更できるので、現在よりも大きい値を選ぶ。（デフォルト値は1280だったので、2048を選択してみました）
![2021-03-21_03.14.51_Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/6c5d60e6-b362-d061-59f5-9ef1ad404d60.png)


変更するまでコードを記述するごとに読み込みが発生してしまって、作業が遅くなっていましたが、上記を変更することで読み込み時間が短くなりました。
参考になれば幸いです。
Django 検索機能まとめ

## 検索方法
基本的には、`モデル名.objects.filter()`を使う。
`filter()`の引数を変えることで様々な検索ができる



## 基本の検索
検索対象のカラム名を`column`とする

以下、検索のキーワードを`word`

| 引数 | 意味 |
|:-:|:-:|
| column=word  | 一致するもの  |
| column__iexact=word  | 大文字小文字区別なしの一致するもの  |
| column__contaiins=word  | あいまい検索  |
| column__startwith=word  | wordで始まるもの  |
| column__endwith=word  | wordで終わるもの  |
| column__icontaiins=word  | 大文字小文字区別なしのあいまい検索  |
| column__istartwith=word  | 大文字小文字区別なしのwordで始まるもの  |
| column__iendwith=word  | 大文字小文字区別なしのwordで終わるもの  |

以下、検索の値を`num`

| 引数 | 意味 |
|:-:|:-:|
| column=num  | 一致  |
| column__gt=num  | numより大きい  |
| column__gte=num  | numと等しいか大きい  |
| column__lt=num  | numより小さい  |
| column__lte=num  | numと等しいか小さい  |

## 複数条件の検索
### 条件全てを満たす
いくつかの条件を全て満たすものを検索する場合、単純に引数を複数記述すれば良い
（'論理積', 'AND検索', 'かつ'と言われるものになる）
「num1以上num2以下」は次のようになる。

```sample.py
filter(column__gte=num1, column__lte=num2)
```
条件が増えてきたときは次のような記述もできる。

```sample.py
objects.filter(条件1) \
.filter(条件2)\
.filter(条件3)\
.filter(条件4)
```

### 条件のどれかを満たす
2つの条件のどちらかを満たしているものを見つけたいときは
Q関数の引数に条件を指定して`|`でつなげて`filter`の引数にする。
（'論理和', 'OR検索', 'または'と言われるものになる）

```sample.py
from django.db.models import Q

objects.filter( Q(条件1) | Q(条件2) )
```

検索wordがいくつかある場合はQ関数をつなげるよりも、リストによる検索が便利。
`word1` or `word2` or `word3` といった検索の時は、
`objects.filter(column__in = [word1, word2, word3])`のようにする。
実際には、以下のようにフォームに入力されたものをlistに変換するなどして使う。

```sample.py
find = request.POST['find']
list = find.split()
data = Friend.objects.filter(name__in=list)
```
これは半角スペース区切りで入力された名前全てで検索する例

## 参考
Python Django3超入門
AtCoder自分用まとめ006(ABC087B Coins)

#概要
自分のために、AtCoderで身に付けた内容・コードをまとめておく。

#内容
https://atcoder.jp/contests/abs/tasks/abc087_b
>あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を C 枚持っています。 これらの硬貨の中から何枚かを選び、合計金額をちょうど X円にする方法は何通りありますか。
同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。

```:入力形式
A
B
C
X
```
##C
```C
#include <stdio.h>
int main(){
  int a,b,c,x,cnt=0;
  scanf("%d%d%d%d", &a,&b,&c,&x);
  for(int i=0;i<=a;i++)
    for(int j=0;j<=b;j++)
      for(int k=0;k<=c;k++)
        if(500*i+100*j+50*k == x)
          cnt++;
  printf("%d\n", cnt);
  return 0;
}
```
##C++
```cpp
#include<iostream>
using namespace std;
int main() {
  int a,b,c,x,cnt=0;
  cin>>a>>b>>c>>x;
  for(int i=0;i<=a;i++)
    for(int j=0;j<=b;j++)
      for(int k=0;k<=c;k++)
        if(500*i+100*j+50*k == x)
          cnt++;
  cout<<cnt<<endl;
}
```
##C++\<bits/stdc++.h\>
```cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
  int a,b,c,x,cnt=0;
  cin>>a>>b>>c>>x;
  for(int i=0;i<=a;i++)
    for(int j=0;j<=b;j++)
      for(int k=0;k<=c;k++)
        if(500*i+100*j+50*k == x)
          cnt++;
  cout<<cnt<<endl;
}
```

##Python3
```python
a, b, c, x = [int(input()) for _ in range(4)]

print(len([... 
for i in range(a+1)
  for j in range(b+1)
    for k in range(c+1)
      if 500*i+100*j+50*k == x]))
```
##Haskell
```haskell
main = do
 a <- readLn
 b <- readLn
 c <- readLn
 x <- readLn
 print $ length [() | u <- [0..a], v <- [0..b], w <- [0..c], 500*u+100*v+50*w == x]
```

##Racket
```racket
#lang racket
(define a (read))
(define b (read))
(define c (read))
(define x (read))
(display (vector-length (
  for*/vector
       ([i (+ a 1)]
        [j (+ b 1)]
        [k (+ c 1)]
        #:when(= x (+ (* i 500) (* j 100) (* k 50))))
   1)))
(newline)
```

##Vim(人間向け)
```vim
:normal "add"bdd"cdd"xdd
:let a = 0
:for i in range(0, @a)
  :for j in range(0, @b)
    :for k in range(0, @c)
      :let a += i * 500 + j * 100 + k * 50 == @x ? 1 : 0
    :endfor
  :endfor
:endfor
:put! = a
:wq
```

##Vim(ゴルファー向け)
考え中。

#参考にさせていただいた頁
- https://atcoder.jp/contests/abs/tasks/abc087_b
- https://qiita.com/hakatashi/items/bda8547114c8aecc93cb
- https://qiita.com/hsjoihs/items/25a08b426196ab2b9bb0

#感想
早く書き直したい。
Atomで単語をダブルクリック時に$まで選択するようにする方法

## 概要
PHPなどを利用していると変数のプレフィックスが`$`なので、変数をダブルクリックした際には`$`を範囲に含みたいかと思います。
Atomを使っていたらいつの間にか選択範囲から`$`が除外されていたので変更方法をメモ。

![スクリーンショット 2021-03-21 5.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647095/e99f9c67-79b8-4689-162a-da1161f4ca1e.png)
👇 こうしたい
![スクリーンショット 2021-03-21 5.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647095/dac2b50a-e9d4-125f-0f73-60af831a65ae.png)


## 方法
[Atom] → [環境設定] もしくは `⌘+,`  → [エディタ設定] を開く
「単語の一部として扱わない文字」を以下のように変更

``` 単語の一部として扱わない文字
/\()"':,.;<>~!@#$%^&*|+=[]{}`?-…
```
👇

``` 単語の一部として扱わない文字
/\()"':,.;<>~!@#%^&*|+=[]{}`?-…
```

`$`を消しただけですね。
逆に`$`を選択しないようにしたければ追加すればいいだけです。
bash_profileとbashrcの違いについて

#対象
__シェルスクリプトをなんとなく知ってる
linuxコマンドをなんとなく知ってる方が対象です。__

__今回は勉強会でbash_profileとbashrcを学んだので
かなりわかりやすく解説していきます。__


#まずはbachファイルの検索
homeディレクトから以下のコマンドを実行
ls -la | grep 'bash'
結果・bashファイル群が見つかる
注）__デフォルトでbashrcファイルがない場合があるので、ない場合はvimで作成しましょう__

```console
$ .bash_history
$ .bash_profile
$ .bash_sessions
$ .bashrc
```
bashrcの作成コマンド

```console
$ touch .bashrc
```

#bash_profileとは？
ログイン時の設定ファイルです。

#bashrcとは？
bashの起動時に読み込まれるファイルです。
主にエイリアスなどが記載されています。

どちらもbashの設定ファイルですが、読み込むタイミングが違います。
つまり、bach_profileと違いログインした時には読み込まれないファイルです。
編集しただけでは、変更の反映がされないので
反映するには、__「source .bashrc」__コマンドを使って起動させる必要があります。

#bashrcとbash_profileの違い
まず、bash_profileは上記には書いた通り、ログイン後に読み込まれる設定ファイルです。
ですが、bashrcは、ログイン後にbashを起動した時にのみ読み込まれる設定ファイルになります。
ここから、実際に動かして確認してみてください。
（環境）
・mac
・シェルはbash

```console
###homeディレクトに移動する
$ cd

###bashファイルの確認
$ ls -la | grep 'bash'

###コマンド実行後の結果
$  3 20 22:21 .bash_history
$  3 20 22:20 .bash_profile
$  3 20 22:21 .bash_sessions
$  3 20 22:19 .bashrc

###コマンド実行後の結果
$ cat .bash_profile

###コマンド実行後の結果
$ export PATH="/usr/local/mysql/bin:$PATH"
$ export PATH="$HOME/.rbenv/bin:$PATH"
$ eval "$(rbenv init -)"

###source .bashrcの記述がないことを確認あった場合はエディターで開き、一旦消す。

###bashrcに各エディタを使い下記エイリアスを記述する
alias ll='ls -la'

###vimで記述する場合
$ vi .bashrc
インサートモードに「i」ボタンで切り替え記述し、「esc」 → 「:」 → 「w」 → 「q」の順番に押し上書き保存をする。

###bashrcに記述後、下記コマンドを実行
$ source .bashrc

###実行後
$ ll
bashrcを読み込んだので、設定したエイリアスが使用できるになる。

###この状態で別でターミナルを開き先ほど設定したエイリアスのコマンドを入力する
$ ll

###実行結果
$ -bash: ss: command not found
そんなコマンドねーよと怒られる(T . T)

###常に設定したbashrcを読み込ませるためにbash_profileを編集
$ vi .bash_profile

###コマンド実行後の結果
$ export PATH="/usr/local/mysql/bin:$PATH"
$ export PATH="$HOME/.rbenv/bin:$PATH"
$ eval "$(rbenv init -)"
---この設定ファイルの一番下に下記を記述し保存
$ source .bash
-------------------------------

###この状態で別でターミナルを開き先ほど設定したエイリアスのコマンドを入力する
$ ll

###結果####
ログイン後にbash_profileが読み込まれbash_profileに記述してある
「source .bashrc」でbashrcを読み込んでるので、ログイン後毎回bashが起動するので
設定したエイリアスがログイン後bash使用できるになる。
```
このことからbash_profileとbashrcの読み込みの違いがわかると思います。
KVM で Winodws 起動時に KERNEL SECURITY CHECK FAILURE

メモです。Ubuntu 20.04 で KVM を使っているがどこかの Ubuntu アップデートのタイミングで KVM 上で動作していた Windows が KERNEL SECURITY CHECK FAILURE のエラーで起動しなくなった。

どうもこれに関連するらしい。

https://www.reddit.com/r/VFIO/comments/gf53o8/upgrading_to_qemu_5_broke_my_setup_windows_bsods/

私の環境はこんな感じ。

```
$ uname -a
Linux kvm 5.4.0-67-generic #75-Ubuntu SMP Fri Feb 19 18:03:38 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ grep 'model name' /proc/cpuinfo | uniq
model name      : AMD Ryzen 5 3600 6-Core Processor
$ qemu-img --version
qemu-img version 4.2.1 (Debian 1:4.2-3ubuntu6.14)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
$ virsh --version
6.0.0
```

KVM (qemu) の CPU の設定は 'Copy host CPU configuration' だったが EPYC-IBPB にすることで起動した。virtual-manager から変更可能。

```
  <cpu mode='custom' match='exact' check='none'>
    <model fallback='forbid'>EPYC-IBPB</model>
  </cpu>
```

新規に Windows 10 をインストールすると問題なく起動。その時のデフォルトの設定は EPYC-Rome だった。しかし古い Windows 10 は EPYC-Rome にすると同様のエラー。なんか他にも条件ありそうな気もする。。
AtCoder自分用まとめ005(ABC081B Shift only)

#概要
自分のために、AtCoderで身に付けた内容・コードをまとめておく。

#内容
https://atcoder.jp/contests/abs/tasks/abc081_b
>黒板に N 個の正の整数 $A_1,...,A_N$が書かれています．
>すぬけ君は，黒板に書かれている整数がすべて偶数であるとき，次の操作を行うことができます．
>
>  - 黒板に書かれている整数すべてを，2で割ったものに置き換える．
>
>すぬけ君は最大で何回操作を行うことができるかを求めてください．

```:入力形式
N
A1 A2... AN
```

##C
```c
#include <stdio.h>
int main(){
    int n,x,r=1<<29;
    for(scanf("%d",&n);n--;){
        int r0=0;
        scanf("%d",&x);
        for(;x%2<1;x/=2)r0++;
        if(r>r0)r=r0;
    }
    printf("%d\n",r);
    return 0;
}
```

##C++
```cpp
#include <iostream>
using namespace std;
int main() {
  int N, cnt=0;
  cin>>N;

  int A[N];
  for (int i = 0; i < N; ++i)
    cin>>A[i];

  while (true) {
    bool exist_odd = false;
    for (int i=0; i<N; i++){
      if (A[i] % 2){
        cout<<cnt<<endl;
        return 0;
      }
      else {
        A[i] /= 2;
      }
    }
    ++cnt;
  }
}
```
##C++\<bits/stdc++.h\>
```cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
  int N, cnt=0;
  cin>>N;

  int A[N];
  for (int i = 0; i < N; ++i)
    cin>>A[i];

  while (true) {
    bool exist_odd = false;
    for (int i=0; i<N; i++){
      if (A[i] % 2){
        cout<<cnt<<endl;
        return 0;
      }
      else {
        A[i] /= 2;
      }
    }
    ++cnt;
  }
}
```
##Python3
```python
import sys
N = int(input())
A = list(map(int, input().split()))
cnt = 0

while True:
  n = 2**(cnt+1)
  for a in A:
    if a%n:
      print(cnt)
      sys.exit()
  cnt += 1
```

##Haskell
```haskell
f x = if x `mod` 2 == 0 then 1 + f (x `div` 2) else 0

main = do
 getLine
 a <- map read . words <$> getLine
 print $ minimum $ map f a
```
##Racket
```racket
;errorまだ消えない
#lang racket
(define (minim lst)
  (foldl
    (lambda (x y) (if (< x y) x y))
    (first lst)
    (rest lst)))
(define (f x)
 (if (equal? (modulo x 2) 0)
     (+ 1 (f (/ x 2)))
     0))
(define n (read))
(display (minim (map f (map string->number (string-split (read-line))))))
```
##Vim(人間向け)
```vim
:normal "ndd
:let r = 99
:for i in range(@n)
  :normal "adw
  :let j = 0
  :let a = @a
  :while a % 2 == 0
    :let a = a / 2
    :let j += 1
  :endwhile
  :let r = r > j ? j : r
:endfor
:put! = r
:wq
```

##Vim(ゴルファー向け)
わからん。ちょっと考えてみる。

#参考にさせていただいたページ
- https://atcoder.jp/contests/abs/tasks/abc081_b
- https://qiita.com/drken/items/fd4e5e3630d0f5859067
- https://qiita.com/hsjoihs/items/25a08b426196ab2b9bb0
- https://stackoverflow.com/questions/47665879/finding-minimum-value-more-efficiently-in-racket
- https://qiita.com/cielavenir/items/ee1e47b844d05dcfc66e

#感想
早く書き直したい。
悪役令嬢でもわかるVReducerの使い方



https://qiita.com/yakumo_sayo/items/8c899d4bc61efe2df510

ここで改変版VReducerを作ってみた話を紹介してるけど、PythonをインストールしてPillowをインストールしてコマンドライン叩くのって割ととっかかりにくいと思うんですよね。

# スタンドアロン版VReducer

そこで、心のハードルある人向けに、とりあえずWindows版だけだけど、単体EXEとして動くプログラムをビルドしてみました。今回はこれを使ってcluster向けのVRMを作成する方法を説明していきます。

* [VReducer-Kai : VRM Converter, for cluster / VRoid Studio](https://susanoo.booth.pm/items/2835396)
 
https://susanoo.booth.pm/items/2835396

使い方は順を追って説明していきます。

# VRoid StudioからのVRM出力設定

clusterマテリアルの結合を **しない** 、髪の毛のメッシュを統合することに注意を払う点を除けば、VRoid Studio単体でのcluster向け出力時の調整とそう大きく変わるわけではありませんん。同じように、32,000ポリゴン以下、ボーン数128以下を目指して必要に応じて削っていきます。
要点は以下の画像の通りです。

![スクリーンショット 2021-03-21 3.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931697/f7ed091c-20ba-866c-50f7-49fdedf1d3e4.png)


# VReducerの実行方法

## デスクトップなどにショートカットを作っておくと便利
VReducerはデスクトップにショートカットを作成しておくと非常に便利です。
ただ別にこれは単体EXEでないとできないことでもないです。Python環境をセットアップして、Pythonのショートカットをドラッグ＆ドロップしたファイルをvreducer.pyへの引数として受け取るようにするだけでもできます。特に説明しません。

![スクリーンショット 2021-03-21 3.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931697/10b19146-87f3-8c42-34e2-e3aaf0817b3a.png)


## ドラッグ＆ドロップ実行

EXE本体もしくはデスクトップのショートカットにVRMファイルををドラッグ＆ドロップするだけで実行できます。

![スクリーンショット 2021-03-21 3.48.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931697/89d63b76-4f04-cb20-7284-0beab5abfb34.png)

実行するとVRMと同じフォルダにresultフォルダが作成され、その中にマテリアル削減後のVRMファイルが生成されます。
なお、マテリアル数が8まで減っていれば成功ですが、髪の毛のマテリアル数が多すぎるとうまく減らせない場合があります。VRoid側で各自調整してください。


# リサイズ
そのまま出力した状態のVRMでは特にclusterのワールドの512px解像度に最適化されていないので、テクスチャのリサイズは別ツールで行ってください。

https://booth.pm/ja/items/2601784

VReducer-Kai(benefit-512pxベース)は、ワンピースや体のUVマップをアトラス化せず、各テクスチャの全面を使えるようにしているなどの特徴があり、極力テクスチャの模様をキープしたい場合に効果を発揮します。
【Python】JSON形式の辞書リストから特定のキーのValueリストを取得し、さらにその最大値／最小値を取得する（備忘録）

自分用メモ

PythonでJSON形式のリスト（共通のキーを持つ辞書を要素とするリスト）から特定のキーのValueリストのみを取得する方法

ライブラリなんか使わずにサクッと取得

# JSON形式の辞書リストデータ
```python
member_list = [
    {'No': 1, 'Name': 'Yamada Taro',   'LastLoginTime': '2021-03-16 15:44:16'}, 
    {'No': 2, 'Name': 'Yamada Jiro',   'LastLoginTime': '2021-03-10 00:12:17'}, 
    {'No': 3, 'Name': 'Yamada Saburo', 'LastLoginTime': '2021-03-20 12:01:02'}, 
    {'No': 4, 'Name': 'Yamada Shiro',  'LastLoginTime': '2020-12-24 00:00:13'}, 
    {'No': 5, 'Name': 'Yamada Goro',   'LastLoginTime': '2021-03-17 11:01:55'}, 
]
```

# JSON形式の辞書リストから特定のキーの値のリストを取得
```python
# Name列を取得
name_list = [member.get('Name') for member in member_list]

# LastLoginTime列を取得
lastLoginTime_list = [lastLoginTime.get('LastLoginTime') for lastLoginTime in member_list]

print(name_list)
print(lastLoginTime_list)
```

出力結果

```
['Yamada Taro', 'Yamada Jiro', 'Yamada Saburo', 'Yamada Shiro', 'Yamada Goro']
['2021-03-16 15:44:16', '2021-03-10 00:12:17', '2021-03-20 12:01:02', '2020-12-24 00:00:13', '2021-03-17 11:01:55']
```

# 最大値／最小値を取得
```python
# 最大値を取得
max_lastLoginTime_list = max(lastLoginTime_list)

# 最小値を取得
min_lastLoginTime_list = min(lastLoginTime_list)

print(max_lastLoginTime_list)
print(min_lastLoginTime_list)
```

出力結果

```
2021-03-20 12:01:02
2020-12-24 00:00:13
```

以上
BeagleBoneBlackで学ぶYoctoLinuxの基礎 (2) ~Yoctoの起動確認とsdkのインストール~

## あらまし

[BeagleBoneBlackで学ぶYoctoLinuxの基礎 (1)](https://qiita.com/Soramame11/items/04d04e684c9fd94f758b)にて、Linuxのイメージと対応するSDKが作成された。次にSDカードへの書き込みと起動の確認、Sdkのインストールを行う。

## SDカードへの書き込み

まずは、`~/BBB/poky/build/tmp/deploy/images/`以下にイメージファイルが配置されているため、VMwareの共有フォルダ機能を用いてWindows側で見れる場所に配置する。共有フォルダは`/mnt/hgfs/[共有名]`でマウントされる。

今回の環境では、__core-image-minimal-beaglebone-yocto-2021003XXXXXX.rootfs.wic__ が該当した。同様に`.wic`の名前を持つファイルが多数あるが、いくつかはシンボリックリンクとなる。

SDカードへの書き込みは[Win32 Disk Imager](https://sourceforge.net/projects/win32diskimager/)を用いた。まずは、Win32 Disk Imagerを起動し、先ほど共有フォルダに配置した`.wic`ファイルをSDカードに書き込む。この時、ドライブレターの指定を誤ると、最悪PCを破壊することになるため、注意が必要。

## BeagleBoneBlackの起動確認

LANケーブル、シリアルコンソール、SDカードを接続し、BootSwitchを押しながらACアダプタを接続する。
この時、BootSwitchを押さずにACアダプタを接続すると、MMCに書かれたDebianが起動する。
シリアルコンソールのピン配や、BootSwitchに関しては、[eLinixの当該ページ](https://elinux.org/Beagleboard:BeagleBoneBlack)に詳細の記載がある。また、シリアルコンソールのボーレートは__115200 Buad__となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198826/c16795da-9865-0403-e187-3ac5ef244fa8.png)

シリアルコンソールの接続先は基板上に出ているピンヘッダの__#1/#4/#5__となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198826/a794ef0c-807a-da20-3e21-fc45814c5e91.png)

電源を入れると、シリアルコンソールが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198826/d82f03fa-549e-63e5-8edf-c7dbe7138d9d.png)

シリアルコンソール上にloginを促す表示がされると、先ほど`local.conf`で設定したユーザー名とパスワードでログインが可能となる。
今回は、ユーザー名 : root / パスワード : root とした。
一部のコマンドはユーザー権限では使えないため、ルート権限でのログインがよさそう。
また、このとき、`Poly (Yocto.....`ではなく、`Debian....`と表示された場合、SDカードからではなく、MMCから起動していると考えられる。

```console:BeagleBone_Serial_Console
Poky (Yocto Project Reference Distro) 3.1.6 beaglebone ttyS0

beaglebone login:
````

## IPアドレスの確認とSSHでのリモートログイン

以下の通り`ip addr`にて確認が可能。下述では、__eth0__のみを示したが、他には__lo__等も表示された。
__192.168.100.19__のIPアドレスが__eth0__に割り当てられていることがわかる。

```console:BeagleBone_Serial_Console
> ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 78:a5:04:b4:18:cf brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.19/24 brd 192.168.100.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 240b:251:520:5b00:7aa5:4ff:feb4:18cf/64 scope global dynamic mngtmpaddr
       valid_lft 2591933sec preferred_lft 604733sec
    inet6 fe80::7aa5:4ff:feb4:18cf/64 scope link
       valid_lft forever preferred_lft forever
```

## まとめ

Yoctoを利用して作成したLinux環境をSDカードに書き込み、起動させた。


sshが動作していることを確認するために、`ssh root@192.168.100.19`にて接続可能であることを確認。証明書関係のWarningが出るが、__yes__を選択すると、sshでログインが可能となる。

## SDKのインストール

`~/BBB/poky/build/tmp/deploy/sdk/`以下にSDKが生成されるため、以下を実行し、SDKを展開する。実行中に配置先のPathを聞かれるが、特にPATHが通っている場所にインストール・展開する必要はない。今回はデフォルトのパス`/opt/poky/3.1.6`を指定した。

```console
> :~/BBB/poky/build/tmp/deploy/sdk: ./poky-glibc-x86_64-core-image-minimal-cortexa8hf-neon-beaglebone-yocto-toolchain-3.1.6.sh
```
AtCoder自分用まとめ004(ABC081A Placing Marbles) bit wise

#概要
自分のために、AtCoderで身に付けた内容・コードをまとめておく。

bit処理っぽくもまとめておく。

#内容
https://atcoder.jp/contests/abs/tasks/abc081_a
> すぬけ君は 1,2,3 の番号がついた 3 つのマスからなるマス目を持っています。 各マスには 0 か 1 が書かれており、マス $i$ には $s_i$が書かれています。
>すぬけ君は 1 が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。

```:入力形式
s1s2s3
```
```:入力例
010
```
##C
```C
#include<stdio.h>
#include<stdlib.h>
int main() {
  int b, cnt=0;
  char s[9];
  scanf("%s", s);
  b = strtol(s, NULL, 2);
  for (int i=0; i<3; i++)
    if (b&(1<<i))
      cnt += 1;
  printf("%d\n", cnt);
  return 0;
}
```
##C++
```cpp
#include<iostream>
#include<bitset>
using namespace std;
int main() {
  string s;
  cin>>s;
  bitset<3> a(s);

  cout<<a.count()<<endl;
}
```
##C++\<bits/stdc++.h\>
```cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
  string s;
  cin>>s;
  bitset<3> a(s);

  cout<<a.count()<<endl;
}
```
##Python3
```python
b = int(input(), 2)
   
print(len([... for i in range(3) if (b&(1<<i))]))
```
##Haskell
わからん。。
##Racket
```racket
#lang racket
(define (cnt b i)
  (bitwise-bit-field b i (+ i 1)))
(define b (string->number (read-line) 2))
(display (+ (cnt b 0) (cnt b 1) (cnt b 2)))
```
##Vim(人間向け)
わからん。
##Vim(ゴルファー向け)
わからん。
#参考にさせていただいたページ

#感想
早く書き直したい。
巨人たちに感謝。
深層学習に必要な数学、その前に数学の分類を確認。

#深層学習に必要な数学、その前に数学の分類を確認。
タイトルのとおり。
個人的には、**集合論**という言葉が頭に浮かばずに、半日ほどロスッた経験あり。
よって、記事にする。

#数学の分類
##Wikipediaによると
https://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6

<font color="pink">**代数学**</font>、<font color="lightgreen">**幾何学**</font>、<font color="deepskyblue">**解析学**</font>の三分野に大別される、
とのこと。あとは、共通的な基礎。(気分を出すために、末尾の図の色に文字色を合わせました。引用元が違いますが。。。）


記載引用↓
>現代における純粋数学の研究は主に代数学、幾何学、解析学の三分野に大別される。また、これらの数学を記述するのに必要な道具を与える論理を研究する学問を数学基礎論という。


以下の8個に分類できるよう。

||(便宜上の）分類|
|:--:|:--:|
|1|代数学|
|2|幾何学|
|3|解析学|
|4|集合論 :tada:|
|5|情報科学|
|6|確率論|
|7|統計学|
|8|論理学|

⇒⇒区別が曖昧だったり、包含関係にあったりする。
　　厳密な分類をするためには、何のために分類か、**分類目的**によると思います。

##Wikipediaの記事の構成は？（Portal:数学）
https://ja.wikipedia.org/wiki/Portal:%E6%95%B0%E5%AD%A6/%E5%88%86%E9%87%8E

* 数学基礎論
 * 数理論理学 - 集合論:tada:
* 代数学 - 抽象代数学
 * 算術 - 数論
 * 線型代数学
 * 群論 - 環論 - 体論
 * 表現論
 * 圏論・普遍代数学
* 幾何学
 * 初等幾何学: ユークリッド幾何学 / 非ユークリッド幾何学 - 射影幾何学
 * 代数幾何学: 代数多様体論
 * 微分幾何学: 可微分多様体論
 * 位相幾何学: 代数的位相幾何学 / 微分位相幾何学 / 幾何学的位相幾何学
* 解析学
 * 実解析 - 複素解析
 * 微分積分学 - 関数解析学 - 確率論 - 微分方程式論
* 有限数学・離散数学
 * グラフ理論
 * 組合せ論
* 数理科学
 * 計算機科学 - 統計学 - 数値解析
 * 数理物理学 - 数理生物学 - 数理社会学
* 数学教育・数学史
 * 算数 - 数学 (教科)
 * アラビア数学 - インドの数学 - 和算 - 円周率の歴史

#その他（楽しい画）
https://mymodernmet.com/science-infographics-dominic-walliman/

から引用

(↓ 「SET THEORY」:tada:がある。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/9cb68e8a-ef54-4175-e099-75595fff7191.png)

#その他（この画もわかりやすい。金沢大学）
http://math.w3.kanazawa-u.ac.jp/wp/course1/curriculum/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/27522e50-b224-25f6-a62e-0d41f532afb6.png)



#まとめ
「**集合論**」しっかりあるな。。。
しかし、Wikipediaは、なんとなくよくまとまっているな。。。いつも。
Laravel用とは別のDockerfileで事前に作ったcomposerのimageを、Laravelにcopyしてきて使おうとしてPermission deniedが起きた場合の解決方法

## 何があった？
題名の通り、事前にcomposer専用imageを作り、それをLaravelのbuildに組み込もうとしたらPermission deniedが起きました。
Dockerfileとエラーはそれぞれ下記のようになっていました。

#### Dockerfile(composer)

```
FROM php:7.4-fpm

WORKDIR /usr/local/bin/composer

RUN apt-get update && apt-get install -y \
git \
zip \
unzip \
&& curl -sS https://getcomposer.org/installer | php 
```

#### Dockerfile(Laravel)

```
FROM php:7.4-fpm

COPY ./src /var/www/html

WORKDIR /var/www/html

COPY --from=composer:latest /usr/local/bin/composer /usr/local/bin/composer

RUN apt-get update && apt-get install -y \ 
git \
zip \
unzip \
&& composer install

RUN php artisan cache:clear \
&& php artisan config:clear \
&& php artisan route:clear \
&& php artisan view:clear

RUN chown -R www-data:www-data storage
```

#### エラー

```
% docker-compose build　#buildコマンドを叩いた
mysql uses an image, skipping
nginx uses an image, skipping
Building php
[+] Building 171.6s (12/14)
 => [internal] load build definition from Dockerfile                                                                                                                            0.0s
〜成功部分は省略〜
#10 175.1 Processing triggers for libc-bin (2.28-10) ...
#10 175.1 /bin/sh: 1: composer: Permission denied　#ここでエラーが発生し中断
------
executor failed running [/bin/sh -c apt-get update && apt-get install -y git zip unzip && composer install]: exit code: 127
ERROR: Service 'php' failed to build
#↑エラー文
%
```

## 原因
今回の件はPermission deniedは根本原因ではなく、composerコマンドが使えない状態でcomposerのimageを作成してしまったことが真の原因でした。
（エラー文だけ見ると`chmod -R a+x /usr/local/bin/composer`のような権限コマンドをDockerファイルに書き込めば直るように見えてしまいますが、それをしても解決に至りません。 ）
ちなみにPermission deniedはcomposerコマンドがないため、/bin/sh の中からコマンドを探そうとしたとき権限で弾かれたときのものだと予想されます。

## 解決方法
Dockerfile(composer)のディレクトリとファイル名を使用できるようにmvコマンドを下記のように追記し、その後composerのimageを作り直してから再度Laravelのbuildを行うことで無事buildを行うことができました。

#### Dockerfile(composer)

```
FROM php:7.4-fpm

WORKDIR /var/www/html　#不要なディレクトリを作らないように変更した

RUN apt-get update && apt-get install -y \
git \
zip \
unzip \
&& curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer　#追記した
```

## 参考にさせていただいた記事
https://sheefelt.hatenablog.com/entry/2019/01/06/000902
【解説】AtCoder Beginner Contest 196【A~C問題】

#はじめに
ｵｲｲｲｲｲｲｲｲｲｲｲｲｯｽ！どうも、歌うプログラマのことり兄貴(・8・)です！
「AtCoder Beginner Contest 196」、お疲れさまでした～
今朝あたりにAtCoderの取材の動画を見て、「そや！ワイもコンテストの風景を録画してみよ！」って思い立ってやってみました！

[【実況3完】AtCoder Beginner Contest 196【2021/3/20】](https://youtu.be/L1RB9n4raSk)
3完でした～

せっかくなので今回から記事とかも書いてみようと思います！
1年後のワイにはD問題とかも余裕で解説してて欲しいな～

あ、今回はPythonで書いてます！

#目次
[1.A - Difference Max](#1-a---difference-max)
[2.B - Round Down](#2-b---round-down)
[3.C - Doubled](#3-c---doubled)
[4.おわりに](#4-おわりに)

#1. A - Difference Max
####問題
整数a,b,c,dが与えられます。xをa以上b以下,yをc以上d以下になるように選んでx - y を最大化してください。

####制約
・-100 <= a,b,c,d <= 100
・a <= b, c <= dであることが保証されている

[A問題リンク](https://atcoder.jp/contests/abc196/tasks/abc196_a)

####ことり兄貴(・8・)の解答(リアタイ)
```python:Python
a, b = map(int, input().split())
c, d = map(int, input().split())
print(b - c)
```
x - y の差を大きくしたい
↓
xを最大化, yを最小化したい
↓
よって
x = b, y = cとなり、
b - c を出力すればおけです。

#2. B - Round Down
####問題
整数または小数Xが与えられるので、小数点以下を切り捨てて整数で出力してください。

####制約
・0 <= x <= 10の100乗
・X は整数、または小数点以下が100桁以下の小数であり、先頭に余計な0は付かない。

[B問題リンク](https://atcoder.jp/contests/abc196/tasks/abc196_b)

####ことり兄貴(・8・)の解答(リアタイ)
```python:Python
x = input()
t = ''
for a in x:
    if a == '.': break
    t += a
    
print(t)
```
まず10の100乗という尋常でない数...w
計算しようとしちゃいけません。
ちなみにワイは最初float型に入れてみて、誤差にビビりました()

小数点以下を切り捨てる = 小数点の直前までを出力
ということなので空文字列tを作り、forループで小数点が出現しない限り
その数字(てか実質文字扱い)をtに追加してみました。

ちなみに、
####コードダイエットガチ勢の解答
```python:Python
print(input().split('.')[0])
```
1行でもいけますｗ

入力した文字列を小数点で分割
↓
そのうち最初の要素を出力

リアタイで書きたかったなぁ、これｗ

#3. C - Doubled
####問題
整数Nが与えられます。
1以上N以下の数のうち、桁数が偶数(先頭に0をつけない)でその前半と後半が
文字列として等しいものはいくつありますか。

####制約
・Nは整数
・1 <= N <= 10の12乗

[C問題リンク](https://atcoder.jp/contests/abc196/tasks/abc196_c)

####ことり兄貴(・8・)の解答(リアタイ)
```python:Python　※下に改良版あります。
n = int(input())
i = '1'
ans = 0
while(True):
    if int(i + i) <= n:
        ans += 1
    else:
        break
    i = str(int(i) + 1)

print(ans)
```
これはちょっと最初「なんだこれは...?」ってなってしまいました。
とりあえず紙にいろいろ書いてみて
「0から100の間には11,22,33...と9コあって...」
「1000~10000の間には1111,1212,1313ってあれ？1010もか」
「あ！！そっか！これシンプルに半分見たときに1,2,3,4...ってなればいいんじゃん！」
といった具合に辿り着きましたｗ
まさかこんなにシンプルだったとは。圧倒的アハ体験。

iを'1'として宣言
↓
whileループ
iを二つ並べたものを整数としてみたときにn以下であれば答えが1つ増え、
nより大きくなったらループを終了。
といった具合。

提出するときに「TLEならんかな...？」ってちょっと心配だったけど、nが10の12乗だったとしても
最大値は9が6コ並んだやつ = 約10の6乗
とかなので普通に回りきってくれました。

ちなみに、ansを作ってしまいましたが結局それってiなので
※ただしn < 11のときの答えは0なので今回はiを0で宣言
####コードダイエットした解答
```python:Python
n = int(input())
i = 0
while int(str(i + 1) * 2) <= n:
    i += 1

print(i)
```
リアタイではiをstrとして宣言したけど、こっちのほうがスッキリかも～
ついでにwhile文にもかなり無駄があったので修正。

#4. おわりに
今回のAからCは、「気付き」と「ひらめき」って感じだったな～
気付けばパッって解けるけど、気付かないと途方もなく感じるやつ...w
筆者はこれまで[paiza.io](https://paiza.io/)をメインのコーディング環境として使っていたのですが、最近PythonでABCの過去問を解き始めるにあたって「せっかくだしコード保存してぇ」ってなってVSCodeに乗り換えました。
使いやすくてええな～！

動画もだけど、こういった記事も将来見たときに「この時の自分はこういう問題をこんな風に解いてたんだ」って感じで見れそうで楽しみなのでぜひ続けてみたい。
この記事を見てる方の参考にもなれば幸いです！！
RedHat8 NVIDIAドライバをインストールして、GF-GT710-E2GB/LP/Pを使用する

注意点
これらの手順は一例です。参考程度にご覧ください。
自己責任でお願いします。

[参考になったURL]
[Fedora25 に nVIDIA のドライバーをインストール]
https://computational-chemistry.com/top/blog/2017/03/22/fedora25-nvidia-driver/
[How to disable the Nouveau driver and install the Nvidia driver in RHEL 7]
https://access.redhat.com/solutions/1155663
※RedHatのアカウントが必要です。
[NVIDIAドライバーホームページ]
https://www.nvidia.com/en-us/drivers/unix/

uname -r
4.18.0-240.15.1.el8_3.x86_64

[手順]
/etc/default/grub の GRUB_CMDLINE_LINUX 行に以下を追加
rd.driver.blacklist=nouveau nouveau.modeset=0

追加例：
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet rd.driver.blacklist=nouveau nouveau.modeset=0"

grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

dnf install kernel-devel kernel-headers gcc make dkms acpid libglvnd-glx libglvnd-opengl libglvnd-devel

systemctl set-default multi-user.target

reboot

NVIDIAドライバーホームページより、ドライバをダウンロードし、該当ファイルに実行権限があることを確認する。
2021/3/20時点のドライバファイル
NVIDIA-Linux-x86_64-460.67.run
ドライバファイルを実行する。※Yes,Noの選択は全てYesを選択しました。
./NVIDIA-Linux-x86_64-460.67.run

mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname  -r)-yyyymmdd.img

dracut /boot/initramfs-$(uname -r).img $(uname -r)

systemctl set-default graphical.target

reboot
AtCoder自分用まとめ003(ABC081A Placing Marbles)

#概要
自分のために、AtCoderで身に付けた内容・コードをまとめておく。

#内容
https://atcoder.jp/contests/abs/tasks/abc081_a
> すぬけ君は 1,2,3 の番号がついた 3 つのマスからなるマス目を持っています。 各マスには 0 か 1 が書かれており、マス $i$ には $s_i$が書かれています。
>すぬけ君は 1 が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。

```:入力形式
s1s2s3
```
```:入力例
010
```
##C
```C
#include<stdio.h>
int main() {
  int cnt=0;
  char s[9];
  scanf("%s", s);
  for(int i=0;i<3;i++)
    cnt += s[i]=='1';
  printf("%d\n", cnt);
  return 0;
}
```
##C++
```cpp
#include<iostream>
using namespace std;
int main() {
  int cnt=0;
  string s;
  cin>>s;
  for(int i=0;i<3; i++)
    if(s[i]=='1')
      ++cnt;
  cout<<cnt<<endl;
}
```
##C++\<bits/stdc++.h\>
```cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
  int cnt=0;
  string s;
  cin>>s;
  for(int i=0;i<3; i++)
    if(s[i]=='1')
      ++cnt;
  cout<<cnt<<endl;
}
```
##Python3
```python
s = input()

print(s.count('1'))
```
##Haskell
```haskell
main :: IO ()
main = do
  s <- getLine

  putStrLn $ show $ length $ filter ('1'==) s
```

##Racket
```racket
#lang racket
(define (cnt1 s counter)
  (cond [(equal? s "") counter]
        [(equal? (substring s 0 1) "1") (cnt1 (substring s 1) (+ 1 counter))]
        [(equal? (substring s 0 1) "0") (cnt1 (substring s 1) counter)]))
(define s (read-line))

(display (cnt1 s 0))
```

##Vim(人間向け)
```vim
:normal! "ax"bx"cx
:put! = @a + @b + @c
:wq
```
##Vim(ゴルファー向け)
```vim
YPJwx@"<C-A>wx@"<C-A>0dwZZ
```
※実際には、\<C-A\>はそのまま入力しているので見えない。

#参考にさせていただいたページ
- https://atcoder.jp/contests/abs/tasks/abc081_a
- [AtCoder に登録したら解くべき精選過去問 10 問 を Vim で解いてみた](https://qiita.com/hakatashi/items/bda8547114c8aecc93cb)
- https://pizzacat83.hatenablog.com/entry/2020/02/20/204714
- https://qiita.com/cielavenir/items/ee1e47b844d05dcfc66e

#感想
もう少し慣れたら書き直したい。。
巨人たちに感謝。
【Laravel】Seedデータを作成する UserSeeder.php

## Seedデータを作成する
```
$ dokcer-compose exec workspace php artisan make:seeder UserSeeder
```
laradockを使用しているので、laradockディレクトリに移動してから上記のコマンドを実行する。
ここでは、``UserSeeder``というファイルを作成して、Userに関するデータを登録する。

```database/seeds/UserSeeder.php
<?php

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {

    }
}
```
すると、上記のようなファイルが作成される。
ここに登録したいデータに関する記述を加える。

```database/seeds/UserSeeder.php
<?php

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
      DB::table('users')->insert([
          [
              'name' => 'Tanaka Taro',
              'age' => 50
          ],
      ]);
    }
}
```

```
      DB::table('users')->insert([
          [
              'name' => 'Tanaka Taro',
              'age' => 50
          ],
      ]);
```
上記の記述で、Userテーブルにデータを登録できる。
あとは、Seederを実行するにはDatabaseSeederというクラスに作成したSeederクラスを登録する必要がある。

```database/seeds/DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserSeeder::class);
    }
}
```
これで準備完了。

あとは下記のコマンドを実行する。

```
$ docker-compose exec workspace php artisan db:seed
```
これでSeederに書いた情報がDBに登録される。

終わり
【Laravel】php artisan make:model ＊＊＊で作成したマイグレーションファイルの中身

## Laravelのmigrationファイルの中身
```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()  //upメソッドでマイグレーション時にこの中身が実行される。
    {
        Schema::create('products', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }
//Schema::createでテーブルを作成するらしい。ここでは、productsテーブルが作成されるイメージ
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
    
}
```

Laravelでは、テーブルの中身のカラムとそのデータ型は以下のように記述するらしい。

```
$table->bigIncrements('id');
$table->timestamps();
```
これで、テーブル内のカラムとそのデータ型を指定してテーブルを作成する。
しかし、migrationファイルを作成した時点ではまだカラムの情報が不足している場合は、ここで追記が必要。
リポジトリをまたがったタグやブランチの複製

Gitで別リポジトリのタグやブランチを複製したときの備忘録

## やりたいこと

- リポジトリ(src)の特定のタグ(version1.0)を、別リポジトリ(dst)のブランチ(edit_version1.0)として複製する
- リポジトリ(src)の特定のブランチ(edit_version1.0)を、別リポジトリ(dst)のタグ(version1.0)として複製する

## 手順

### リポジトリ(dst)をクローンし、複製先となるローカルブランチ(edit_version1.0)を作成

```
git clone https://github.com/dst.git
cd dst
git checkout --orphan edit_version1.0
git reset --hard
```

### リモートリポジトリ(tmp)として、リポジトリ(src)を登録

```
git remote add tmp https://github.com/src.git
```

### リポジトリ(src)から特定のタグorブランチをプル

```
※タグをプルする場合
git pull tmp version1.0 --allow-unrelated-histories

※ブランチをプルする場合
git pull tmp edit_version1.0 --allow-unrelated-histories
```

### リポジトリ(dst)へプッシュ

```
※タグ(version1.0)を付ける場合のみ実施
git tag version1.0

git remote rm tmp

※タグ(version1.0)をプッシュする場合
git push origin version1.0

※ブランチ(edit_version1.0)をプッシュする場合
git push origin edit_version1.0
```

### 作業ディレクトリの削除


```
cd ..
rm -rf dst
```

### 参考

- リモートリポジトリのタグの削除

```
git push --delete origin タグ名
```
無料で作るWebサービス Codelet 作成日記 #0 ポエム

# なに作るの？
**Codelet**というWebサービスを作る。
コード未満のコードのかけらをWeb上に置いておくサービスだよ。
例えば
`=RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1)))`
みたいなやつね。

コード未満のコードのかけらを集めるサービスだから"Codelet"と名付けたよ。（-let：小さなものを指す接尾語。
leaf-let, pig-letとかね）

## なにが不満なの？
`=RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1)))`
これ見て何かわかる？
これは、エクセルの現在のシート名を取得する数式なの。

正直こんなもの、パッと書けって言われても書けない。
「PERSONAL.XLSにでも書いておけばいいじゃん」と言われても、別の環境で表示する必要があるエクセル上では書けないし、現場によってはマクロ禁止なんてところもある。
そう、しがないSES契約ならね！

そうなると、この数式を使うしかなくて、しかも覚えてられないので毎回ググる。
でもググると大抵 侍エンジニア とか マイナビニュース とか、クソ重い上に冒頭のポエムが長くて欲しい情報まで遠いページにぶち当たる。もう言葉にならない。
何も知らない初心者には嬉しいかもしれないけど、こちとら

* シート名を表示させる数式があることは知ってる。
* 当然使いどころもわかってる。中で使ってる数式も見れば理解できる。
* クソ長いポエムは見たくない。

という気持ちでいっぱいなの。

そうなると、しょうがないから虎の巻を作るの。
ローカルにこんな虎の巻.txtを作るわけ。

```虎の巻.txt
■シート名取得
=RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1)))
■hogehogeしたいときの数式
=hogehoge()
```

間に合わせならこれでもいいっちゃいいんだけど、

* チーム内で共有しずらい（まともなコミュニケーションツールや環境がない現場も少なくないのだ！）
* 現場が変わるとまた虎の巻をイチから作り直す必要がある
* でもEverNoteとかOneNoteとかあんまり大仰なものを用意するのもイヤ

等々いろいろ問題点があるわけですよ。

## こんなWebサービスを作りたい
* 重要度：高
    * 基本的に用途とCodeletだけを書き込むBBSみたいな感じ
    * Markdonw対応
    * ログイン/検索機能は当然
* 重要度：中
    * ゲストユーザでも参照/ 投稿可能（いたずら対策として、投稿されてひと月くらいで削除する？）
    * 投稿の共有機能
        * public：ゲストユーザ含め全公開
        * protected：チーム内にのみ公開（これは重要度：低）
        * private：自分だけに公開
    * 検索時になんかいい感じのサジェスト
* 重要度：低
    * GoogleKeepみたいに、リッチリンクのプレビュー機能を付けたい
    * [Tumblrのようなユーモア](https://nlab.itmedia.co.jp/nl/articles/1705/25/news141.html)