撫養 航 - 備忘録

SEの備忘録

GPT-4の使用方法

この備忘録では、GPT-4の使用方法について簡単に説明します。GPT-4はOpenAIによって開発された大規模な言語モデルで、自然言語処理タスクにおいて高い性能を発揮します。ここでは、GPT-4の基本的な使い方と応用例を紹介します。

目次

  1. GPT-4の概要
  2. GPT-4を利用するための事前準備
  3. GPT-4の基本的な使用方法
  4. GPT-4の応用例

1. GPT-4の概要

GPT-4 (Generative Pre-trained Transformer 4)は、OpenAIが開発した大規模な言語モデルです。GPT-4は、多様なデータソースから学習し、自然言語処理タスクにおいて高い性能を発揮します。GPT-4は機械翻訳、質問応答、文章生成、要約、テキスト分類など、多くの応用が可能です。

2. GPT-4を利用するための事前準備

GPT-4を使用するには、以下の手順を踏みます。

  1. OpenAIのアカウントを作成する
  2. APIキーを取得する
  3. 必要なライブラリやツールをインストールする

詳細な手順や認証情報の取得方法は、OpenAIの公式ドキュメントを参照してください。

3. GPT-4の基本的な使用方法

GPT-4の使用方法は、PythonプログラムでAPIを利用することが一般的です。以下は、GPT-4 APIを利用して文章生成を行う簡単なコード例です。

import openai

# APIキーを設定します
openai.api_key = "your_api_key_here"

# メッセージをリスト形式で入力します
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Who won the world series in 2020?"},
]

# APIリクエストを作成します
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",  # GPT-3.5モデルを指定します
    messages=messages,
    max_tokens=50,  # 応答の最大トークン数を指定します
    n=1,  # 応答数を指定します
    stop=None,  # 応答が終了するトークンを指定します(任意)
    temperature=0.5,  # サンプリング温度を指定します(任意)
)

# 応答を表示します
print(response.choices[0].message["content"])

この例では、modelパラメータに"gpt-3.5-turbo"を指定してGPT-3.5モデルを使用しています。入力メッセージをリスト形式で渡し、APIリクエストを作成して応答を取得しています。

4. GPT-4の応用例

GPT-4は様々な応用が可能です

・質問応答システム

GPT-4は、ユーザーからの質問に対して適切な回答を生成することができます。質問応答システムの構築には、以下のようなプロンプトを使用します。

makefile

Q: パリの首都はどこですか?
A: パリはフランスの首都です。

Q: <質問>
A:

このプロンプトに続けて質問を記述することで、GPT-4は回答を生成します。

機械翻訳

GPT-4は、ある言語から別の言語への翻訳タスクにも使用できます。以下のようなプロンプトを使用して、翻訳を行うことができます。

vbnet

Translate the following English text to Japanese: "<English text>"

・テキスト要約

GPT-4は、長いテキストを短く要約することができます。以下のようなプロンプトを使用して、要約を行うことができます。

scss

Summarize the following text in one sentence: "<Long text>"

・文章生成

GPT-4は、指定されたテーマやキーワードに基づいて文章を生成することができます。以下のようなプロンプトを使用して、記事や物語の生成を行うことができます。

css

Write a short story about a boy who discovers a magical world: "<Starting text>"

・テキスト分類

GPT-4は、テキストをカテゴリに分類するタスクにも利用できます。以下のようなプロンプトを使用して、分類を行うことができます。

sql

Classify the following text into one of the categories: Sports, Politics, Entertainment, or Science: "<Text to classify>"

Realm導入手順

端末単位作業

・CocoaPodsインストール

以下コードをターミナルで入力する

sudo gem install cocoapods

Macログイン時のパスワードを入力して実行

・CocoaPodsセットアップ

インストールが終了したら以下のコードを入力

pod setup

「Setup completed」と表示されれば成功

プロジェクト単位作業

・Podfile作成

プロジェクトファイルからターミナルを起動し以下コードを入力

pod init

・Podfile内容変更

作成されたPodfileを開く

iosバージョンを最新の変更して先頭の「#」を削除する

・Realmのバージョンも確認(詳細は検索)

・インストール

プロジェクトファイルからターミナルを起動し以下コードを入力

pod install

「Pod installation complete!」と表示されれば成功

・Git準備

touch .gitignore

⌘(command) + ⇧(shift) + .(ドット記号)で隠しファイルを表示し.gitignoreファイルを開く 以下コードを入力

Pods/*
taskapp.xcworkspace

.gitignoreファイルに書いた条件のファイルはGitの対象から排除される

Xcodeを再起動して完了

Xcode

設計

・懸念点

・初回起動時のログイン作業を避ける ・外観の整合性をとる ・操作の一環性 ・直接操作させる ・操作のフィードバック ・メタファを使用(UIを現実世界のものに例える) ・ユーザの望ましくない操作を回避 ​

AppleiPhoneアプリ方針

・控えめであること ・明瞭であること ・奥行きを与えること ​

MVCパターン

  データ(Model)
なし ↓↑instance

 処理(Controller)
IBOutlet↓↑IBAction

  表示(View) ​

・アプリのライフサイクル

読み込み前 > loadView

読み込み後 > viewDidLoad ... 最初に一度だけ行いたい処理

(別画面から遷移)

表示前 > viewWillAppear

レイアウト前 > viewWillLayoutSubviews

レイアウト後 > viewDidLayoutSubviews

(画面表示開始)

表示後 > viewDidAppear

・・・

消える前 > viewWillDisappear

(画面表示終了)

消えた後 > viewDidDisappear

(別画面へ遷移)

Swift

segue

・戻ってきた時

@IBAction func ファンクション名(_ segue: UIStoryboardSegue) {
        // 処理
}

・別クラスをインスタンス

let 変数 = segue.destination as! 別クラス名

タイマー

・宣言

// タイマー
var timer: Timer!
// 時間
var timer_sec: Float = 0

・始動

インターバル秒毎にselecterで指定した以下の関数を実行する

self.timer = Timer.scheduledTimer(timeInterval: インターバル秒, target: self, selector: #selector(関数名(_:)), userInfo: nil, repeats: true)
@objc func updateTimer(_ timer: Timer) {
 // ラベルに(インターバル秒毎に)経過時間を表示する
 self.timer_sec += インターバル秒
 self.ラベル名.text = String(format: "%.1f", self.timer_sec)
}

・タイマー停止

self.timer.invalidate()

日時フォーマット

// 取得
let formatter = DateFormatter()
// 指定
formatter.dateFormat = "yyyy-MM-dd HH:mm"
// 変換
let 変数:String = formatter.string(from: 変換するデータ)

通知

・AppDelegateに記述

import UserNotifications
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
                // ユーザに通知の許可を求める
                let center = UNUserNotificationCenter.current()
                center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
                        // Enable or disable features based on authorization
                }
                center.delegate = self     // フォアグラウンド時に通知を受け取る場合は記述
                return true
        }

フォアグラウンド時に通知を受け取る場合は デリゲート「UNUserNotificationCenterDelegate」を追加して以下を記述

     func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
                completionHandler([.banner, .list, .sound])
        }
.badge ... アプリアイコンに通知件数表示
.alert ... 通知バナー表示
.sound ... 通知音

・登録

以下はローカル通知を登録する処理

// 通知のインスタンス
let content = UNMutableNotificationContent()
content.title = task.title //タイトル
content.body = task.contents //詳細
content.sound = UNNotificationSound.default //通知

// ローカル通知が発動するtrigger(日付マッチ)を作成
let calendar = Calendar.current
let dateComponents = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: task.date)
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)

// identifier, content, triggerからローカル通知を作成(identifierが同じだとローカル通知を上書き保存)
let request = UNNotificationRequest(identifier: String(task.id), content: content, trigger: trigger)

// ローカル通知を登録
let center = UNUserNotificationCenter.current()
center.add(request) { (error) in
        print(error ?? "ローカル通知登録成功)
}

// 未通知のローカル通知一覧をログ出力
center.getPendingNotificationRequests { (requests: [UNNotificationRequest]) in
        print("未通知のローカル通知一覧")
        for request in requests {
                print("/---------------")
                print(request)
                print("---------------/")
        }
}

・削除




Realm

・宣言

クラス外

import RealmSwift

クラス内

let realm = try! Realm()
var realmSample = try! Realm().objects(Sample.self).sorted(byKeyPath: "date", ascending: true)

・segue で画面遷移時

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
        let inputViewController:InputViewController = segue.destination as! InputViewController
        if segue.identifier == "cellSegue" {
                let indexPath = self.tableView.indexPathForSelectedRow
                inputViewController.task = taskArray[indexPath!.row]
        } else {
                let task = Task()
                let allTasks = realm.objects(Task.self)
                if allTasks.count != 0 {
                        task.id = allTasks.max(ofProperty: "id")! + 1
                }
                inputViewController.task = task
        }
}

UITableVeiwデリゲート

// データの数(=セルの数)を返すメソッド
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return taskArray.count  // ←修正する
}

// 各セルの内容を返すメソッド
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 再利用可能な cell を得る
        let cell = tbl_sample.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        // Realmから情報を取得
        let task:Task = realmSample[indexPath.row]
        // Cellに値を設定
        cell.textLabel?.text = task.title
        cell.detailTextLabel?.text = task.date
        return cell
}

// 各セルを選択した時に実行されるメソッド
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        performSegue(withIdentifier: "cellSegue",sender: nil)
    }

// セルが削除が可能なことを伝えるメソッド
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath)-> UITableViewCell.EditingStyle {
        return .delete
    }

// Delete ボタンが押された時に呼ばれるメソッド
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            // データベースから削除
            try! realm.write {
                self.realm.delete(self.taskArray[indexPath.row])
                tableView.deleteRows(at: [indexPath], with: .fade)
            }
        }
    }

Swift基礎

Swiftサンプルコード

基礎

### 宣言
let NUM = 1.08 //定数(let)
var num = 0 //変数(var)
​
### 型(Swiftの変数はnil(空や無)の値を代入できない)
var sapmle_1: Any = ["文字列", 1] //すべての型に対応可能
var Sample_2: String = "文字列" //文字「String」
var sample_3: Int = 1 //整数「Int」
var sample_4: Double = 1.1 //少数「Double」
var sample_5: Bool = true //論理「Bool」
​
### 配列
var sample_6: [Any] = ["りんご", "ばなな"] //配列 [型名]
sample_6.append("後ろに追加")
sample_6.insert("指定追加", at: 1)
sample_6.remove(at: 1) //指定削除
sample_6.removeFirst() //前を削除
sample_6.removeLast() //後ろを削除
sample_6.removeAll() //全て削除
​
### 辞書操作
var sample_7 = ["apple":"りんご", "banana":"ばなな"]
sample_7.removeValue(forKey: "apple")
​
### タプル
var sample_8:(String, Int) = ("drink", 200) //タプル
let (type, price) = sample_8
//print(name)
//print(price)

​ ​ ​

条件分岐

### if文
if NUM == 1.08 {
    //処理
}
​
### 三項演算子
print((0 == 1) ? "正しい" : "間違い")
​
### switch文
switch NUM {
case 1.08:
    print("")
case 1.10:
    print("")
default:
    print("")
}

### for文
for _ in 0...2 {
    //処理
}
​
### while文
while num < 10 {
    num += 1
}

汎用

関数

関数名(外部引数: 0) //呼び出し

func 関数名(外部引数 内部引数:Any) -> String {
    //外部引数を「_(アンダーバー)」にすることで呼び出し時の引数名宣言省略可能
    return "戻り値"
}

クラス

class Car {
    var name: String
    // イニシャ(エ)ライザ
    init(name: String) {
        //他のクラスからインスタンス化される時に呼ばれる処理
        self.name = name
    }
}
class MiniCar: Car {
    //オーバーライド
    override init(name: String) {
        super.init(name: name + "(小型)")
    }
}
var instance_1 = Car(name: "ブリウス")
print(instance_1.name)
var instance_2 = MiniCar(name: "ワゴンB")
print(instance_2.name)

JavaAPI

JavaAPIは機能ごとにパッケージが定義されている。 今回は多用されるメソッドについて書き方と使い方をまとめた。

クラス一覧

String
StringBuilder
ArrayList
HashSet
HashMap
Date
FileReader
FileWriter

java.langパッケージ

文字列を可変するStringBuilderクラス 数値を扱うIntegerクラス

String

以下のメソッドは取得した文字列を別の変数に入れる

大文字に変換

引数→なし 戻り値→大文字の文字列

String s = sample.toUpperCase();

小文字に変換

引数→なし 戻り値→小文字の文字列

String s = sample.toLowerCase();

1文字を取得

引数→数値 戻り値→文字列の引数番目の文字

Charcter c = sample.charAt(5);

指定個所を取得

引数→数値1、数値2 戻り値→文字列の引数1から引数2までの文字列

String s = sample.substring(3, 8);

文字の長さを取得

引数→なし 戻り値→文字列の長さ

Integer i = sample.length();

配列に分解

引数→"区切る文字" 戻り値→引数の文字で分解した配列

sample.split(" ");

StringBuilder

以下のメソッドはオブジェクトを変更する

ストレージの軽減

ストレージの軽減を試みる

sample.trimToSize();

文字列の追加

引数の文字列をリストに追加する

sample.append("text");

文字列の消去

引数の数値1から数値2までの文字列を消去する

sample.split(3, 8);

文字列の反転

既存の文字列を反転させる

sample.reverse();
# java.utilパッケージ
## ArrayList
List<String> sample = new ArrayList<String>();

追加

リストに引数の内容を追加

sample.add("text");

削除

リストにある引数の内容を消去

sample.remove("text");

取得

引数→数値 戻り値→リストの数値番目の内容

String s = sample.get(2);

素数の取得

リストの要素数を取得

sample.size();

HashSet

removeメソッド・・・削除 sizeメソッド・・・Setに含まれる要素の数を取得する containsメソッド・・・Setの中に含まれているかを確認する

追加

リストに引数の内容を追加(内容が重複した場合追加を無視)

sample.add(72);

削除

リストにある引数の内容を消去

scoreSet.remove(58);

存在確認

引数の内容がリストにあるか確認する scoreSet.contains(34);

素数の取得

リストの要素数を取得

sample.size();

HashMap

「キー」一覧

sample.keySet();

「値」⼀覧

sample.values();

Date

時間を取り出す

インスタンス生成

Date date = new Date();

フォーマット指定

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

取得

String strOut = sdf.format(date);

java.ioパッケージ

FileReader

try.catchする必要がある

pathの指定

String path = "C:\\study\\sample.txt";

インスタンス生成

FileReader fr = new FileReader(path);

一文字ずつ内容取得

int ch = fr.read();
while(ch != -1) {
 System.out.print((char)ch);
 ch = fr.read();
}

クローズ

fr.close();

FileWriter

pathの指定

String path = "C:\\folder\\file.txt";

インスタンス生成

FileWriter fw = new FileWriter(path);

pathの後に「, true」を書くことで追記方式にできる

ファイルに⽂字を書き込む

for (String 文字 : 書き込むリスト) {
 fw.write(text + \n);
}

クローズ

fw.close();

JavaJSP

この記事ではServletの中で頻繁に使用されるクラスとメソッドについて自分が見やすいようにまとめた。

JSP

ファイルを挿入

<%@ include file="footer.jsp"%>

スコープ一覧

(HttpServletRequest)リクエスト ... request.setAttribute("key", sample);
(HttpSession)セッション ... session.setAttribute("key", sample);
(ServletContext)アプリケーション ... context.setAttribute("key", sample);

EL式

取得(脆弱性あり)

${key.id}

スコープ指定の取得

${requestScope.key}
${sessionScope.key}
${contextScope.key}

JSTL

タグリブ起動

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

出力

<c:out value="${name}"/>

if文

<c:if test="${条件}">
    //TODO
</c:if>

foreach構文

<c:forEach var="sample" items="${samples}">
    //TODO
</c:forEach> 

choose構文

<c:choose>
    <c:when key="${条件}"> 
        //TODO
    </c:when>  
    <c:when key="${条件}">  
        //TODO
    </c:when> 
    <c:otherwise>  
        //TODO
    </c:otherwise>
</c:choose> 

JavaServlet

この記事ではServletの中で頻繁に使用されるクラスとメソッドについて自分が見やすいようにまとめた。

おまじない

servletおまじない

  • クラスメソッドの上にコンテキストルート以下のリンクを設定する
  • HttpServletを継承する
  • dogetメソッドをオーバーライドする
@WebServlet("/url_sample")
public class  sample extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest requset, HttpServletResponse response)
    throws ServletException, IOException {
        //TODO
    }
}

htmlおまじない

aタグ

<a href="/servlet_sample/annotation?id=25">リンク</a>

クラス、メソッド

出力

PrintWriter out = resp.getWriter();
out.println("helloworld");

リスト

List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");

乱数

1から10までのランダムな数値を返す

Random random = new Random();
int sample = random.nextInt(10);

リクエスト(req)

パラメータの取得(req)

req.getParameter("key");

セッション(req)

宣言

HttpSession session = req.getSession();

get

Integer count = (Integer) session.getAttribute("count");

set

session.setAttribute("count", count);

フォワード(req)

RequestDispatcher rd = req.getRequestDispatcher("/hello");
rd.forward(request, response);

または

req.getRequestDispatcher("/hello").forward(request, response);

レスポンス(resp)

コンテントタイプの指定(resp)

resp.setContentType("text/plain; charset=UTF-8");

現在日時の取得(resp)

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
String now = now.format(formatter);

ページのリロード(resp)

resp.setIntHeader("Refresh", 5);

リダイレクト(resp)

resp.sendRedirect("/servlet_sample/hello");