-
Wi-Fiに繋がらない問題の解決
Wi-Fiに繋がらなくて悩んだことないですか?Wi-Fiに繋がらなくなってしまう要因はいくつかありますが、私がよく経験するものをここにまとめておきたいと思います。まず大きく分けて2つのパターンがありますお店のWi-Fiに繋がらないおうちのWi-Fiに繋がらない1. お店のWi-Fiに繋がらないこれはログインが必要な場合に起こりがちですこれの解決方法はログインしてしまえばいいということですが、問題はどのようにしてログインすればいいの?ということでしょう大体の場合、Wi-Fiに繋げた瞬間にログイン画面が出ますが、出ない時もあります。そのような時は以下手順でまずIPアドレスを調べます。(Macの場合)手順1. システム設定 => Wi-Fi => 詳細の順に進んでいくすると一番下にIPアドレスを見つけることができますそこで、IPアドレスの一桁目が3であることが確認できると思います。これは自分に割り当てられたアドレスの番地を表しており、このIPアドレスを利用することでIPアドレスを割り当てているWi-FiルータにアクセスすることができますWi-Fiルータにアクセスするためにはデフォルトゲートウェイというアドレスに確認しにいく必要があります。こちらは大体一桁目を1にすることで確認することができますつまり、この場合は192.168.1.1にアクセスすればWi-Fiルータを見にいくことができますアクセスの方法は、シンプルにブラウザの検索バーに打ち込むだけです。このようにして、Wi-Fiルータにアクセスをすれば、お店のWi-Fiにもログインをすることができます。※ Windowsの場合はコマンドプロンプトでipconfigと打てば出てくると思います2. おうちのWi-Fiに繋がらないまず前提として、普段は繋がるのに急に繋がらなくなった場合を想定していますこちらはDHCPが失敗、もしくはセキュリティによる一時的な停止などが挙げられますDHCPが失敗した場合の対処法は至って簡単で、自分でIPアドレスを割り当ててしまえば良いですDHCPとはIPアドレスを自動的に割り当ててくれるサービスで、集団で使うとたまにバグります。そういう時は自分で割り当ててしまうのが一番早く対処できます。これは先ほどのWi-Fiの設定画面で、TCP/IPを選択し、IPv4の構成から手動を選択してIPアドレスを手入力することで設定ができます。また、サブネットマスクが255.255.255.0のようになっている場合は、手動のIPアドレスでも1桁目しか触ることができないので注意しましょう。上記の図の場合だと192.168.1.2~192.168.1.254が自由に設定できるIPアドレスとなります。(255はブロードキャストアドレスと言って別の用途があります)また、この設定はルータごとに決める必要があり、他のWi-Fiに繋げた時に繋げなくなってしまうこともあるので、その時にはDHCPに戻してあげると良いでしょう。セキュリティによって一時的に停止されてしまった場合は、1日置くことで直ります。
-
誰でもできる簡単ChatGPTのfine-tuning!!
ChatGPTのファインチューニング、やっぱ難しいんじゃないのお?と思ったそこのあなた!実はとっても簡単なんです!!ではまず手順について説明していきます手順モデルの決定(chatモデルではない)プロンプトの作成キャッシュDBの割り当てデータの収集jsonlファイルの作成・正例と負例の分類ファインチューニングたったの6ステップ!しかもファインチューニングだけなら無料でできますそれでは詳しく説明していきます手順1まず最初に適当なモデルの決定を行なってください。ここではchatモデルは使いません。理由としましては、手順3のキャッシュDBを使えないからです。今回、このキャッシュDBを使うことでデータの整形がさらに簡単になることを説明していきたいので、キャッシュDBを使うことを想定して説明を続けていきます。chatモデルではないモデルの例) text-davinci-003,text-davinci-002手順2プロンプトの作成を行います。好きなプロンプトを書いてください。後々整形したい場合も出てくる可能性もあるので、最初は短めで書いてみるといいかもしれません。(json形式にするとちょっと崩れる)手順3キャッシュDBの割り当てを行います。と言っても既存のLLMモデルを扱うコードに以下の数行を書き加えるだけです。from langchain.cache import SQLiteCache langchain.llm_cache = SQLiteCache(database_path="langchain_cache.db")また、この際、VSCodeで実行している方は、SQLite Viewerという拡張機能を追加することで、簡単に中身を見ることができます。そこで何となく、どんな感じで入るかを確認しておいてください。手順4データの収集を行います。これはただ何度も実行していただくだけで結構です。正例と負例を大体それぞれ50個ずつくらいになるように集めると良いでしょう。手順5続いてjsonlファイルの作成・正例と負例の分類を行なっていきます。簡単に言うとfine-tuningに用いる学習データのためのデータの整形です。まず、sqlitedatastore.pyというファイルを作り、以下のコードを貼り付けますこちらはキャッシュDBを操作するためのSQLのコードを集めておくためのファイルになりますimport json import sqlite3 conn = None def connect(db_name="langchain_cache.db"): global conn conn = sqlite3.connect(db_name) def close(): conn.close() def get(id, fl): row_ls = conn.execute("SELECT {} FROM full_llm_cache WHERE rowid = ?".format(",".join(fl)), (id,)).fetchone() row_dict = {} if row_ls is None: return None for key, value in zip(fl, row_ls): row_dict[key] = value return row_dict def get_all_ids(limit, offset=0): return [record[0] for record in conn.execute("SELECT rowid FROM full_llm_cache LIMIT ? OFFSET ?", (limit, offset))]続いて、sqlitedatastore.pyのコードを使ってキャッシュDBを扱うためのファイルを作ります。ファイル名は何でもいいですが、ここではcache_db.pyとしておきます。そしてcache_db.pyに以下のコードを貼り付けてください。import sqlitedatastore as datastore import json class Cache_db: def connect(self): datastore.connect() def close(self): datastore.close() def get(self, id): return datastore.get(id, fl=["prompt", "response"]) def get_all(self): json_data_list = [] for ID in datastore.get_all_ids(limit=-1): json_data = self.get(ID) json_data_format = { "prompt": json_data.get("prompt"), "completion": json_data.get("response") } json_data_list.append(json_data_format) return json_data_list if __name__=="__main__": dc = Cache_db() dc.connect() jsonl_data = dc.get_all() with open('training_data.jsonl', 'w') as f: f.writelines([json.dumps(l, ensure_ascii=False)+"\n" for l in jsonl_data]) dc.close()上記のcache_db.pyを実行することで、jsonlファイルの作成は完了です。続いて正例と負例の分類ですが、こちらは自身が持つ正解を元に、training_data.jsonlをsuccessful.jsonlとfailed.jsonlに仕分けてもらえれば大丈夫です。コードでできる場合は、コードで。難しそうであれば手作業でも問題ないです。手順6最後にfine-tuningを行なっていきます。こちらはOpenAIのサイトに行って、successful.jsonlとfailed.jsonlをアップするだけで終わりますいかがだったでしょうか!以上でfine-tuningは完了です。手順は6つと少ないステップで簡単にできてしまうのがChatGPTのすごいところです。しかし、fine-tuningには少し時間がかかってしまうので、時間がある時にやっておくと良いでしょう。また、ローカルで今回fine-tuningをしたモデルを使いたい方、そしてローカルからfine-tuningをしたい方は以下のサイトを参考にすると良いかもしれませんurl: https://qiita.com/ksonoda/items/b9fd3e709aeae79629ff
-
初めて路上で運転した
運転教習に通い初めて早一月教習は二段階にて行われる今回、第一段階の卒研である仮免を先週に取得をしたため、今日から第二段階が始まった。第二段階は路上運転がメインで、初めて濡れた夜の東京を走った正直、めちゃくちゃ緊張した時速50km出してると急な黄色信号で止まれない教官にブレーキを思いっきり踏まれたし、自分も何回か踏んだでも最後に教官はこの緊張を忘れないでね、と優しく告げてくれた次はもっと安定して走れるようになりたい
-
djangoをさくらのVPSにデプロイ!〜VPSにSSH〜
本ブログに掲載している内容を順番にあげています。また、本ページではドメインの取得法について説明をします。VPSのレンタルドメインの取得 VPSにSSH <- ここ環境変数やコマンドの設定アプリケーションのデプロイuwsgiの設定nginxの設定VPSにSSH今回はVPSにSSH接続するための手順について説明します。(sshでアクセスせずに、コンソール画面からVPSを触るよって人は必要ないです。)これも方法はシンプルで以下の5つのステップに沿って行うことですぐにできますSSHキーの作成(公開鍵と秘密鍵をRSA暗号を用いて作成)公開鍵を登録しているVPSにコピペ1. SSHキーの作成(参考)まず、SSHキーを作成し、置いておく場所をカレントディレクトリとするため、移動をします$cd ~/.sshそしてSSHキーを発行するためのコマンドを打ちますここではファイル名とパスフレーズの入力を求められますが、筆者はfugaというファイル名でパスフレーズを無しにして発行をしています。また、このファイル名についても無しにすることができます。パスフレーズは秘密鍵にアクセスするためのパスワードになっており、登録すればさらにセキュリティを上げることができます。$ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/Users/ユーザ名/.ssh/id_rsa): fuga Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in fuga Your public key has been saved in fuga.pub The key fingerprint is: SHA256:NIKUL9Ezccft2pl9mxg+IHS7RH0PxucSrl+Xbxlb The key's randomart image is: +---[RSA 3072]----+ | .o...... | | .o.+. .. . | | .o.oo ... | | . .o o o..=..| | . S oo.*.=.| | ..++.+.*| | o +.++@| | ..E B+| | o=..| +----[SHA256]-----+$ls fuga fuga.pub $chmod 600 fuga左のfugaが秘密鍵で、右のfuga.pubが公開鍵になります。また、chmod 600で秘密鍵のfugaの閲覧権限を上げています。他のユーザーからアクセスできる状態であると使えないためです。これでssh-keyの作成は完了です。2. 公開鍵を登録しているVPSにコピペ続いて公開鍵を自分が登録しているVPSに渡します。渡す方法は至って簡単で、まずさくらのVPSにログインし、SSHキー管理というところに遷移しますすると右上の方にSSHキー登録というボタンがあるのでそこを押しますそうすると以下のような画面が現れてくると思います名前は適当な名前にして頂いて、公開鍵には先ほど作成した.pubの方の中身をコピペします方法としては、catコマンドを打つと全部出てくるのでそれらを全部コピーして公開鍵の枠の中に貼ります$sudo cat fuga.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC1/HXtHJYcspkTfGN2zt8+q8YcQzlfiHHbhXK2wdoY749fN8ZXyD5eb/kgJXNkpzUqpAWvXNHMdk+JTzJHLe3erzUSUQ/Gm90SaEOdcyJPxlBjRWrW/xCTjM8Xi6tZdfyv6AI8lczfMj0OietdW0ERquZ/hn0ktMbvD5BbdGlhfTQYvUa4QwlMmLQ2LQfU9hM5NOStCdG5UpmTZhDzY+aoNPmGDsvwfTNR3DsVoutekTis+dKeeP/sYsdJT+WIvQSFqyyADPP0/nii+nmn+Pjt1XSJGQBl0j1hIs7mw4beyDq5a5NfLkfwvHdiRLb5Xs/zy3AgkI+ls9XZdBJYzbl32/kiLPnd6fIgyJCNjiIzSvbXpSAyGXGomEDohaz2YahBoyT52XULPojlVLxTZ5u5H1NnT5e6ntc8kZ7a94LyArbsHiADcQJGlFO8gufHvXq5I9jk+o+a8EA7vRNXKQGqVNeHG67s8FDo4woOXqAZL5mfこれで完了です余談実際に繋げるときは複数の方法があります1. 秘密鍵だけでssh接続する方法この場合は、VPSのsshのサービスコンフィグを開き、パスワード認証をオフにする必要があります。参考(url: https://qiita.com/kazokmr/items/754169cfa996b24fcbf5)2. 秘密鍵とパスワードで接続する方法こちらは、先ほど作成した秘密鍵を用いるコマンドを付与するだけで問題ないです $ssh -i fuga [リモートユーザー]@[リモートサーバーのホスト名]ですが、わざわざユーザやホスト名を書くのが面倒な場合もあります。その場合は、~/.ssh/configを変更することで可能になりますHost [エイリアス] HostName [リモートサーバーのホスト名] User [リモートユーザー] IdentityFile ~/.ssh/fuga上記のように変更すると$ssh [エイリアス]で繋げられます秘密鍵のパスフレーズを求められたときはそのままEnterで大丈夫です
-
djangoをさくらのVPSにデプロイ!〜ドメインの取得編〜
本ブログに掲載している内容を順番にあげています。また、本ページではドメインの取得法について説明をします。VPSのレンタルドメインの取得 <- ここVPSにSSH環境変数やコマンドの設定アプリケーションのデプロイuwsgiの設定nginxの設定ドメインの取得は結構簡単です。私はさくらのVPSでVPSをレンタルしたので、さくらのVPSでのやり方について説明します。まずこちらにアクセスし、取りたいドメインが使われていないか検索します。すると次のような画面に移り、取れるドメインと取れないドメインの一覧が現れます。この場合だとfugafuga.infoが最も安くレンタルできるドメインであることが分かります最後に、登録者の情報として取得年数や名前、支払い方法などを入力すればドメインのレンタルは完了です。続いてドメインとIPアドレスを関連づける作業に移ります。まず、さくらのドメインコントロールパネルの画面を開きます開くと以下のようなコントロールパネルが現れ、自分が登録したドメインが確認できますここで、ゾーンという部分をクリックし、レコード設定を編集していきます。登録した際にも同じ画面が現れた人もいるかもしれません。もう一度確認をしておきましょうこちらのタイプというカラムにあるAがIPアドレスを記述する欄になりますTXTについてはgoogleサーチコンソールを導入した際に付け加えました以上がドメインの取得の流れになります。いかがだったでしょうか?全てGUIで操作できるのでとても簡単だったと思いますこちらで登録したドメインはもう使えるようになっているので、VPSのコントロールパネルから逆引きホスト名として登録することもできるようになっていると思います
-
Googleアナリティクスを導入する!
作成したdjangoサーバの検索状況やアクセス状況を見るため、google アナリティクスを導入参考にしたサイトはこちら(URL: https://cotodama.co/google-analytics/まず参考サイト通りにアカウントを作っていきますアカウント作成後、作成されたサイトがwordpressなどのCMSで作成されていない場合(自分のようにdjangoなどで作っている人)は、アナリティクスのソフトが入っていないので測定IDをコピペするという手段はできませんそこで、google アナリティクスの画面からプロパティ設定=>データの収集と修正=>データストリームとタブを進めていくと自分のサイトが既に登録されていることを確認できます。そこをクリックして画面を開くと一番上に実装手順というボタンがあるのでそこをクリックするとgoogle アナリティクスを実装するための手法が大きく分けて二つ提供されていることがわかります。手動でインストールするウェブサイト作成ツールまたは CMS を使用してインストールする手動によるインストール本サイトでは手動でインストールするものについて説明します。手動の場合は以下のようにscriptが貼られていると思います。このscriptを自分のサイトの大元となるbase.htmlに貼ってください。<!-- Google tag (gtag.js) --> <script async="" src="https://www.googletagmanager.com/gtag/js?id=G-EXW99DWK78"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-EXW99DWK78'); </script> 数時間後に確認をすると、「データ収集は、過去 48 時間有効になっています。」というような文字が現れるので、これで完了です。これで自分のサイトを閲覧した人の人数や収益などを管理することができますこのほかにも人気コンテンツや検索状況の改善などを確認したい場合は、Googleサーチコンソールへの登録もしておきましょう
-
djangoをさくらのVPSにデプロイ!〜VPSレンタル編〜
ある程度djangoサーバの開発が済んだので、本番環境へのデプロイに挑戦しました使ったツールDjangonginxuwsgiさくらのVPSやったことVPSのレンタルドメインの取得VPSにSSH環境変数やコマンドの設定アプリケーションのデプロイuwsgiの設定nginxの設定上記の順に徐々にpostしていく予定です。なかなか大変だったのでいろいろ抜けているとは思いますが、気づいたら筆者がその都度修正していきます。〜VPSレンタル編〜筆者は何も知らないアホなweb開発初心者だと言うことをまず知っておいてください何も知らない私は「クラウドサーバにアップするぞ!」とまず最初に意気込み、つまづきました結局、いくら頑張ってもAWSに全然アップできず、必死に悩んで調べ、月5kと言う金を払ってアップできませんでした(勉強代)まず、前提としてサーバにはいくつか種類があります。(参考)レンタルサーバ(共有サーバ)VPS(Virtual Private Server: 仮想専用サーバ)専用サーバクラウドサーバいろいろ調べた結果、個人用webサイトを作るのに適しているのはレンタルサーバかVPSであると言うことを知りましたそして、レンタルサーバにチャレンジをしたところ、ここでまたつまづきましたレンタルサーバは管理者によって、インストールできるモジュールに制限されていたり、環境変数やDBの設定が自由にできないようにされていたりすることから、djangoサーバには不適だったそうですここでいざVPSのレンタル(参考: https://i-fc.jp/web/vps-rentalserver/#xservervps今調べてみたらXserverが一番お得そう汗他のサイトを見た時に一番出てきたので検索にヒットしやすいさくらのVPSを選びました初心者はやっぱり先導者が多いところがいいかもしれませんまず、CentOSを選択し、1Gのプランを選択(プランは後から変えられないみたいなので注意)次にパスワードと公開鍵の設定公開鍵の設定は検索するとすぐ出てきますが一応(参考)ssh-keygenで作成したxxx.pubの中身を全てコピーして空いているとこに貼り付ければok(これも今考えればGithub.comからインストールした方が楽だった...)スタートアップスクリプトなどもあるようで、これを入れればletsencriptも楽になったかもしれませんね...自分は手動でやっちゃったのでそれについて後ほど説明したいと思います契約が完了したら起動できるようになっているので、サーバ画面を開いて電源操作から起動を押してくださいこれでVPSのレンタルは完了です。
-
本番環境でdjangoのadminのcssが反映されなかった件について
やっとdjangoのサーバを本番環境にアップしたと思ったらadminのcssが読み込まれないエラーその他エラー$sn.summernote is not a functionこれがどうやらwidget(adminやsummernote)は通信しながら静的ファイルを反映させていたようで、collectstaticが必要だったそうまずsettings.pyの修正 # collectstaticなどを行った際にファイルを設置するstaticフォルダの場所を記述(開発の際は必要ないのでコメントアウトしておく) STATIC_ROOT = os.path.join(BASE_DIR, 'static/') # htmlファイルなどから読み込むstaticフォルダの場所を記述 # STATICFILES_DIRS = [ # os.path.join(BASE_DIR, 'static/') # ]ここでcollect$python3 manage.py collectstatic以下のサイトも参考にしましたが、1と2のどちらの条件も満たさずにcssが読み込まれたので、単純にcollectstaticが問題だったhttps://qiita.com/yumenomatayume/items/c9786298ffb9c1a7f444
-
Djangoで全てのページに共通のコンテンツ・表示を作る
天気の情報をスクレイピングして表示したい!と考えた筆者しかし、スクレイピングしたとて一つのページでしか表示ができず、残念に思っていた今日この頃ある日、全てのページに共通させてカテゴリ一覧を表示するという神機能を知ったURL: https://blog.narito.ninja/detail/150これを参考に作ってみたBlogのアプリがあったので、その下にcontext_processors.pyを作成し、中身を書き書き def common_weather(request): context = {} url_forecast = 'https://tenki.jp/forecast/3/16/4410/13208/' fdict = scrape_weather(url_forecast) forecast = fdict["today"]["forecasts"][0] context["weather"] = "天気: "+forecast["weather"] context["temp_high"] = "最高気温: "+forecast["high_temp"] context["temp_low"] = "最低気温: "+forecast["low_temp"] context["rain_probability"] = "降水確率: " context["rain_probability_0006"] = "00-06: "+forecast["rain_probability"]['00-06'] context["rain_probability_0612"] = "06-12: "+ forecast["rain_probability"]['06-12'] context["rain_probability_1218"] = "12-18: "+ forecast["rain_probability"]['12-18'] context["rain_probability_1824"] = "18-24: "+ forecast["rain_probability"]['18-24'] return context 天気の情報はtenki.jpからスクレイピングしているscrape_weatherの中身は本題ではないのでスルーそしてこの関数をsettings.pyに追加した TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['templates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'blog.context_processors.common', 'blog.context_processors.common_weather', ], }, }, ] 実際に表示してみると。。。できた!!!
-
web上音声対話システムをどう実装するか?
現在実装済みのweb上対話システムは、対話が進むたびに画面がリロードされてしまうこれだと音声対話を実装したいと考えたとき、リロード後の先頭の対話内容を音声合成させる必要があるしかし、リロードを検出する関数はjavascriptやdjangoには用意されていないので対処法がないそこで、ここでは時間差を計算することで音声対話を実装した最後の対話を生成した時間とリロードが完了した時間差が3秒以内だった場合に、音声合成を行い、発話するように設定このlast_dateに対話を生成した日時を入れています。モデルはDateTimeFieldです。window.onload = function() { var str = {{ last_post|safe }}; const uttr = new SpeechSynthesisUtterance(str); if (Math.abs(Number("{% now 'His'%}")-Number("{{ last_date|date:'His' }}"))<3){ speechSynthesis.speak(uttr); }; console.log(uttr); }; 成功しました!!🙌実際どんなふうにweb上で音声対話を実装しているの?と気になる方はお問合せからご連絡ください。もし要望があれば詳しく載せていきたいと思います。