node modulesのリセット方法メモ
たまにnode modulesがバグ?って動作しないときがあるでのリセット方法のメモ。
まずnode_modulesを削除する
rm -rf node_modules
次にpackage-lock.jsonを削除する
rm package-lock.json yarn.lock
npmのキャッシュをクリアする
npm cache clear --force
npmのインストール
npm install
これでいけた。
Claude Codeのアップデートに失敗したときの対応方法についてのメモ
事象
[OS] Mac
Claude Codeをアップデートしようとしたときに、以下のようなエラーが発生した。
> sudo npm install -g @anthropic-ai/claude-code npm error code ENOTEMPTY npm error syscall rename npm error path /opt/homebrew/lib/node_modules/@anthropic-ai/claude-code npm error dest /opt/homebrew/lib/node_modules/@anthropic-ai/.claude-code-2DTsDk1V npm error errno -66 npm error ENOTEMPTY: directory not empty, rename '/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code' -> '/opt/homebrew/lib/node_modules/@anthropic-ai/.claude-code-2DTsDk1V'
原因
調べてみるとどうやらClaude Codeのフォルダを置き換えようとした際にフォルダが空ではなく、削除できなかったために発生したっぽい。
解決方法
下記コマンドを打っていくことで無事にアップデートできました。
フォルダに何が残っているか確認
> ls -la /opt/homebrew/lib/node_modules/@anthropic-ai/ total 0 drwxr-xr-x 4 xxxxxxxxxxxx admin 128 7 22 08:49 . drwxr-xr-x 5 xxxxxxxxxxxx admin 160 7 5 01:41 .. drwxr-xr-x@ 12 xxxxxxxxxxxx admin 384 7 22 01:03 .claude-code-2DTsDk1V drwxr-xr-x@ 12 xxxxxxxxxxxx admin 384 7 22 08:49 claude-code
実行中のプロセスを確認
> ps aux | grep claude xxxxxxxxxxxx 224 0.0 0.0 410068928 960 s063 R+ 1:03#午前 0:00.00 grep claude xxxxxxxxxxxx 95624 0.0 0.2 436987280 39056 s061 S+ 1:01#午前 0:01.48 claude
プロセスを終了させる
kill -9 95624
フォルダを削除する
> sudo rm -rf /opt/homebrew/lib/node_modules/@anthropic-ai/claude-code > sudo rm -rf /opt/homebrew/lib/node_modules/@anthropic-ai/.claude-code-*
再度アップデートを実行する
> sudo npm install -g @anthropic-ai/claude-code
これで無事にアップデートができました。
homebrewのインストールで error: Not a valid ref: refs/remotes/origin/master が出た時の対処法
公式からコマンド叩いたらこのエラーが出たのに何でだろうって思って調べたらISSUEが出てた。
下記コマンドで無事インストールできた。
rm -fr $(brew --repo homebrew/core) brew tap homebrew/core
docker-composeでpythonコマンドを実行するメモ
docker-compose.ymlを用いてDjangoプロジェクト作成までやっていることを前提としてます。
migrationとかcreatesuperuserやるとき、docker-composeコマンド経由で命令出せるのかなと思って調べてたらあったので試してみた結果のメモです。
docker-compose run [サービス名] [実行したいコマンド]
で出来ました。
叩いたコマンド
docker-compose run --rm web python manage.py migrate
docker-compose run --rm web python manage.py createsuperuser
--rmつけないと上記コマンドを実行するたびコンテナが増えるので、つけとくと良いと思いました。
訂正(2021-02-05 17:50)
docker-compose runじゃなくてdocker-compose execでいけました。(汗
docker-compose exec web python manage.py migrate
docker-compose exec web python manage.py createsuperuser
こんな感じですね。
Java開発環境の構築メモ(Spring Tools 4 Eclipse 設定編)
インストールまで完了したので、設定を行っていく。
起動時の設定
「SpringToolSuite4.exe」をダブルクリックして、Spring Tools 4を起動する。
そうすると、作業フォルダを設定する画面が開くので、任意のフォルダを指定する。

デフォルトだと、ユーザーフォルダ内のドキュメントフォルダが指定されている。
問題なければ「Launch」をクリックする。

この画面が出たら起動成功。
ビルドツール(Gradle)の設定
続いてビルドツール(Gradle)をインストールしていく。
「Help」→「Eclipse Marketplace」をクリックする。

ウィンドウが開いたら「Gradle」と入力して検索する。
「Buildship Gradle Integration 3.0」がヒットするので「Install」ボタンをクリックする。

次に「Update」をクリックして最新の状態にしておく。

ライセンス規約の確認画面が表示されるので、内容を確認して「I accept the terms of the license agreement」を選択して「Finish」をクリックする。

アップデートが始まる(右下にUpdating Softwareと表示される)ので、しばらく待機する。
アップデートが完了したらアプリの再起動を求められるので「Restart Now」をクリックしてアプリを再起動する。

これで設定は完了!
Java開発環境の構築メモ(Windows10 + OpenJDK 11 + Spring Tools 4 Eclipse)
①OpenJDKのダウンロード~環境変数設定
OpenJDK11を下記URLよりDLする。
「jdk.java.net/13」をクリックする。(OpenJDK11じゃないけど問題ない)

「Archive」をクリックする。

下にスクロールすると「11.0.2 (build 11.0.2+9)」があるのでWindows 64bitの「zip」をクリックする。

ダウンロードが完了したら、解凍してCドライブ直下に配置する。

そしたら次は、環境変数の設定をする。
タスクバーにある虫眼鏡の検索から「環境変数」と入力し「システム環境変数の編集」をクリックする。
システムのプロパティが開くので、右下の「環境変数」をクリックする。

「Path」を選択して「編集」をクリックする。

「新規」をクリックして「C:\jdk-11.0.2\bin」と入力する。

そしたらOKを押してウィンドウを閉じていく。

これでOpenJDK11の設定は完了!
コマンドプロンプトで下記コマンドを実行するとバージョン確認が出来る。
java -version
javac -version
②Spring Tools 4のインストール
Spring Tools 4を下記URLよりDLする。

私がDLした時のファイル名は「spring-tool-suite-4-4.6.0.RELEASE-e4.15.0-win32.win32.x86_64.self-extracting.jar」となっていた。
ファイルはユーザーフォルダ等に移動しとく。(これは任意のフォルダでOK)
コマンドプロンプトで下記のコマンドを打ち込んでエンターを押す。
java -jar spring-tool-suite-4-4.6.0.RELEASE-e4.15.0-win32.win32.x86_64.self-extracting.jar

そうすると解凍が始まって「sts-4.6.0.RELEASE」フォルダが作られている。
「SpringToolSuite4.exe」をダブルクリックすることで、Spring Tools 4を起動出来る。
これでSpringTool4の設定のインストールも完了!
(解凍しただけなので、インストールではないかもしれない…)
次はSpringTool4の設定をしていこう。
Docker for Windowsのインストール方法(ver2.2.0.4)
Dockerを触ってみようと思い立ったので、インストール方法とかまとめるよ!
OSはWindows 10 Proだよ!
Dockerのバージョンは2.2.0.4だよ!
では進めていきます。
Hyper-Vの有効化
まずは、Hyper-Vの有効化から。
これをしないとDocker動かない。
コントロールパネルの「プログラムと機能」から

左にある「Windowsの機能の有効化または無効化」をクリック。

「Hyper-V」にチェックを入れる。

そして設定を有効にするために、Windowsを再起動する。

続いて、Dockerのダウンロードをする。
Docker for Windowsのダウンロード
下記サイトよりexeファイルをダウンロードします。
docs.docker.com
Download from Docker Hubをクリックして

Get Dockerをクリックするとダウンロードが始まる。

次にインストールをしていく。
Docker for Windowsのインストール
ダウンロードした「Docker Desktop Installer.exe」をダブルクリックして、インストーラーを起動する。
元からチェックが2つ付いているので、そのままOKをクリックする。

※補足
Enable required Windows Features
必要なWindows機能を有効にするかどうか。
Add shortcut to desktop
デスクトップにショートカットを作成するかどうか。
Use Windows containers instead of Linux containers
Linuxコンテナーの代わりにWindowsコンテナーを使用するかどうか。
(後で設定変更可能らしい)
OKを押すとインストールが始まる。

しばらくすると、インストールが完了する。

Windowsを再起動する。
そうすると、こんな画面が表示された。(自動では表示されないかも)

そして、右下のタスクバーにはくじらさんのマークが!

これでDockerのインストールまで完了!
簡単だね~!
【Android】BottomSheetBehaviorの実装方法メモ
記事見てみると、サポートライブラリが旧情報しか無かったので困惑した為、メモを残そうと思う。
AndroidXで実装する!
こんな感じで実装出来た!

ボタンを押したら、BottomSheetBehaviorの機能を使って、リストを下から表示させるというもの。
注意点として、レイアウトは「coordinatorlayout」を使わないと実装出来なかった事かな。
使わないでも実装出来るのかは謎い。詳しい人教えて欲しいっす。
レイアウトが他にもいくつかあって、いまいち使い分け方が理解出来ていないので、自分の中での課題ですね。
開発環境
Android Studio = 3.5.3
compileSdkVersion = 29
targetSdkVersion = 29
minSdkVersion = 21
サポート ライブラリ = Androidx
Lang = Java
ソース
package com.hiropon.test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
public class MainActivity extends AppCompatActivity {
private BottomSheetBehavior behavior;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// BottomSheetの処理
View bottomSheet = findViewById(R.id.bottom_sheet);
behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
ArrayAdapter<String> menu_adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
menu_adapter.add("test1");
menu_adapter.add("test2");
menu_adapter.add("test3");
menu_adapter.add("test4");
menu_adapter.add("test5");
ListView menuList = findViewById(R.id.list_menu);
menuList.setAdapter(menu_adapter);
Button btnPlayer1 = findViewById(R.id.Button1);
btnPlayer1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
} else {
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/Button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="B1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:translationZ="2dp"
tools:layout_editor_absoluteX="-179dp"
tools:layout_editor_absoluteY="-16dp">
<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:orientation="vertical"
app:behavior_hideable="true"
app:behavior_peekHeight="200dp"
app:layout_behavior="@string/bottom_sheet_behavior">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
android:text="Menu"
android:textSize="18sp" />
<ListView
android:id="@+id/list_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/colorWhite" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
参考リンク
Bottom Sheets の実装方法 - ユーザーインターフェイス - Android 開発入門
[Android] ListView + Bottom Sheet でマテリアルな一覧画面を作ってみた - Qiita
BottomSheetBehaviorを使う - Qiita
縦または横一列に要素を並べるリニアレイアウト (LinearLayout) - ユーザーインターフェイス - Android 開発入門
【Android】Buttonの形を丸型にする
開発環境
Android Studio 3.5.3
compileSdkVersion = 29
targetSdkVersion = 29
minSdkVersion = 21
ソース
適当なxmlファイル名(今回はcircle_button.xml)で作って下記の通り記述する。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="#FFF388"/>
</shape>
※補足
android:shape="oval"の記述で、ボタンが楕円形になる。
ボタンのカラーは黄色にしてます。
そして、作ったcircle_button.xmlをdrawableフォルダにつっこむ。
このままだと楕円なってしまう(レイアウトの設定次第ではあると思う)ので、activity_main.xmlでボタンのwidthとHeightを同じサイズする。
<Button
android:id="@+id/Button1"
android:layout_width="50dp"
android:layout_height="50dp"
android:text="B1"
android:background="@drawable/circle_button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
今回は「android:layout_width」と「android:layout_height」を「50dp」に設定している。
あとは、上記の通り「android:background」を追加して、作ったcircle_button.xmlを設定("@drawable/circle_button")してあげれば完成!

こんな感じになります。
参考リンク
【Android】動く丸形ボタンを drawable だけで作ってみた | PisukeCode - Web開発まとめ
[Android] SHAPEタグを使って出来ること〜画像ファイルを使わずにボタンや背景をカスタマイズする〜 | Developers.IO
http://android-note.open-memo.net/sub/button__make_round_shape_button.html
【Android】BottomSheetDialogの実装方法メモ
こんな感じで実装出来た!

開発環境
Android Studio = 3.5.3
compileSdkVersion = 29
targetSdkVersion = 29
minSdkVersion = 21
サポート ライブラリ = Androidx
Lang = Java
ソース
openDialogメソッドに書いてあります。
ボタンとかレイアウトは適当です。
package com.hiropon.test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;
import com.google.android.material.bottomsheet.BottomSheetDialog;
public class MainActivity extends AppCompatActivity {
private BottomSheetDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnPlayer1 = findViewById(R.id.Button1);
btnPlayer1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
openDialog();
}
});
Button btnPlayer2 = findViewById(R.id.Button2);
btnPlayer2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
openDialog();
}
});
}
private void openDialog() {
View view = getLayoutInflater().inflate(R.layout.layout_bottom_sheet, null);
dialog = new BottomSheetDialog(this);
dialog.setContentView(view);
ImageButton btn1 = (ImageButton) view.findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),"ImageButton1が押されました",Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
ImageButton btn2 = (ImageButton) view.findViewById(R.id.btn2);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),"ImageButton2が押されました",Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
ImageButton btn3 = (ImageButton) view.findViewById(R.id.btn3);
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),"ImageButton3が押されました",Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
dialog.show();
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/Button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.306"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.498" />
<Button
android:id="@+id/Button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.709"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.498" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#ffffff">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageButton
android:id="@+id/btn1"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@mipmap/ic_launcher" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Button1"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageButton
android:id="@+id/btn2"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@mipmap/ic_launcher" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Button2"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageButton
android:id="@+id/btn3"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@mipmap/ic_launcher" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Button3"/>
</LinearLayout>
</LinearLayout>
Visual Studio Codeの日本語化手順 - Windows10
Ver 1.42
Visual Studio Codeを起動する。
↓
ViewタブのCommand Paletteをクリックする。
↓
configure display languageと入力してリストに出てきたらクリックする。(途中で予測変換でリストに表示された)
↓
install additional languagesをクリックする。
↓
Japanese Language Pack for Visual Studio Codeを選択してインストールする。
↓
Visual Studio Codeを再起動する。
以上
【Android】画面の固定方法
AndroidManifest.xml内の<activity>タグ内に下記を追記する。
横画面固定の自動回転有り
android:screenOrientation="sensorLandscape"
横画面固定の自動回転無し
android:screenOrientation="landscape"
縦画面固定はlandscapeのところをportraitにすれば良いと思う。
自分では横画面しか試してないので、縦画面を試す時になったら必要に応じて確認し、当記事を修正する。
【Android】Android Studioで実機デバッグ手順
1. 開発者向けオプションを表示させる
設定→端末情報のにある「ビルド番号」を連続でタップする。
そうすると設定の所に開発者オプションが表示される。
↓
2. 開発向けオプションのUSBデバッグをONにする
↓
3. Google USB ドライバーのインストール確認
「SDK Manager」で「SDK Tools」のタブを開く。
「Google USB Driver」がインストールされていることを確認します。
されていなければインストールする。
↓
3. PCと端末をUSBで接続する
つなぐと、Android端末側に接続を許可して良いかのメッセージ?が表示されるので許可する。 私の場合は、初回に表示されなかった?(スルーしてた?)と思う。 ↓
4. Android Studioでプログラムを実行する
Android Studioを起動して、実行時のデバイス選択画面に該当の端末が表示されるので選択して実行ボタンをクリックする。
私の場合は、No Deviceとなって端末と接続しているのに表示がされず、それでも実行してみたら下記のエラーが表示された。
Session 'app': Installation did not succeed. The application could not be installed.
もう1度、端末とPCを接続し直したら、認証メッセージが表示されて許可したらデバイス選択画面に端末が表示された。
その後、実行したら無事にデバッグが出来た。
解決^-^
【Django】ワークフローのメモ
django-admin startproject XXXX
で、プロジェクト作成後のフロー。
- アプリケーションの作成
- モデル作成(models)・有効化とマイグレーション(Migration)
- URL設定(urls.py)・ルーティング
- ビュー(views.py)の作成
- テンプレート(templates)の作成
- 静的ファイル(static files)の作成と配置
アプリケーションの作成
①コンソールで下記コマンドを実行する。
python manage.py startapp XXXX
※XXXXは任意の名称を入れる。
モデル作成(models)・有効化とマイグレーション(Migration)
①models.pyにクラスを作成する。
class XXXX(models.Model):
title = models.CharField(max_length=255)
text = models.TextField()
author = models.ForeignKey(
'auth.User',
on_delete=models.CASCADE,
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
※XXXXは任意の名称を入れる。
②モデルの有効化
プロジェクト設定ファイル YYYY/settings.py (※YYYYはプロジェクト名) のINSTALLED_APPSに下記を追加する。
INSTALLED_APPS = [
'XXXX.apps.XXXXConfig', # 追加
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
※XXXXはアプリケーション名。
※XXXXConfigは、該当アプリケーション内のapps.pyのクラス名を入れる。
from django.apps import AppConfig
class XXXXConfig(AppConfig):
name = 'ZZZZ'
その後に下記コマンドを実行する。
python manage.py makemigrations XXXX
※XXXXはアプリケーション名。
makemigrationsを実行することで、Djangoにモデルに変更があったこと(この場合、新しいものを作成しました)を伝え、そして変更を マイグレーションの形で保存する。
migrationsフォルダ内に0000_initial.pyのようなファイルが作成されている。
下記コマンドを実行すると、SQL文を確認することが出来る。
python manage.py sqlmigrate XXXX 0001
③マイグレーション
下記コマンドを実行する。
python manage.py migrate
これで、モデルのテーブルをデータベースに作成できる。
makemigrationsで作成したファイルは消える。
URL設定(urls)・ルーティング
作成したアプリケーションにURL設定を行う。
設定ファイルが無い場合は、urls.pyを新規作成する。
````python:urls.py
作成例
from django.urls import path from . import views
app_name = 'XXXX'
urlpatterns = [ # ここにURL情報を入れていく ] ```` app_nameにはapps.pyに記載したnameと同じ名称を入れれば良いと思う。
ビュー(views)の作成
views.pyに作成するページ(URL)分のクラスとかを設定する。
テンプレート(templates)の作成
templatesフォルダ内にページ分のhtmlファイルを作成する。
静的ファイル(static files)の作成と配置
cssとかjsファイルがあれば、作成する。
配置はstaticフォルダ(フォルダ名は任意)とかを作成して、その中に入れる。
そして、プロジェクト設定ファイル YYYY/settings.py (※YYYYはプロジェクト名) の中に下記を追加する。
STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # './static'
以上