AndroidでPOSTアプリを作成してみた。
自分用の備忘録として。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.POSTApp">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Activity _main .xmlの内容↓=====================
<?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="match_parent"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/urlInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="https://example.com/"
android:inputType="textUri" />
<Button
android:id="@+id/sendButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="POST送信を実行"
android:layout_marginTop="16dp" />
</LinearLayout>
======================================
MainActivity.ktの内容↓=============================================
package com.example.postapp
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.Body
import retrofit2.http.POST
import retrofit2.http.Url
// --- ここで必要なデータ形式をすべて定義してしまいます ---
data class MyRequest(val title: String, val body: String, val userId: Int)
data class MyResponse(val id: Int)
interface ApiService {
@POST
suspend fun postData(@Url url: String, @Body request: MyRequest): MyResponse
}
// --------------------------------------------------
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val urlEditText = findViewById<EditText>(R.id.urlInput)
val btn = findViewById<Button>(R.id.sendButton)
val retrofit = Retrofit.Builder()
.baseUrl("https://placeholder.com/") // 動的URLを使う場合もベースURLの設定は必須です
.addConverterFactory(GsonConverterFactory.create())
.build()
val service = retrofit.create(ApiService::class.java)
btn.setOnClickListener {
val inputUrl = urlEditText.text.toString()
if (inputUrl.isEmpty()) {
Toast.makeText(this, "URLを入力してください", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
lifecycleScope.launch {
try {
val data = MyRequest("Hello", "Custom URL Post", 1)
val response = service.postData(inputUrl, data)
Toast.makeText(this@MainActivity, "成功!ID: ${response.id}", Toast.LENGTH_LONG).show()
} catch (e: Exception) {
Log.e("API_ERROR", "Error", e)
Toast.makeText(this@MainActivity, "エラー: ${e.message}", Toast.LENGTH_LONG).show()
}
}
}
}
}
===============================================================
build.gradle.kts(:app)の内容↓=========================
plugins {
alias(libs.plugins.android.application)
}
android {
namespace = "com.example.postapp"
compileSdk {
version = release(36)
}
defaultConfig {
applicationId = "com.example.postapp"
minSdk = 24
targetSdk = 36
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.androidx.activity)
implementation(libs.androidx.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
// 通信ライブラリ
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
// 基本ライブラリ
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
}
=======================================
上記を下記のURLでテスト
【Day 6 & 7】衣装を色々といじってみた
■ 理想の「線」が、どんな服をも支配する
ここ数日、私はある一つの「ベースプロンプト」を磨き上げてきた。 (thick lineart:1.4) と (bold outline:1.4)。そして最新のアップデートで手に入れた flat color と cel shading。
この「太い線」と「平坦な塗り」が生み出すグラフィカルな質感は、もはや私のアイデンティティになりつつある。では、この「最強のベース」があれば、どんな衣装を着せても私の世界観に引き込めるのではないか?
今回は、お気に入りの銀髪眼鏡の彼女を、さまざまな衣装へ「着替え」させてみた記録だ。
■ 現代の日常と、様式美の極致
まずは、これまでの「巫女服」という伝統から離れ、現代的な「競泳水着+オーバーサイズパーカー」という組み合わせを試した。

水着のタイトな質感と、パーカーのダボッとしたシルエットの対比。 本来なら質感の差が難しい組み合わせだが、私のフラットな塗り方は、それらを「形」として鮮やかに切り取ってくれた。パーカーの隙間から覗くラインに、パキッとした線画が命を吹き込む。
次に挑んだのは、王道の「ミニスカメイド」。

お屋敷(Manor)の静寂の中で、ジト目で構える彼女。フリルの複雑ささえも、私のプロンプトは「美しい境界線」へと還元していく。
■ 常識を脱ぎ捨て、未知の領域へ
Day 7。実験はさらに加速する。 最後に行き着いたのは、全く予想もしていなかった「レトロな宇宙飛行士(Retro-Futurism)」だ。

1960年代のSF映画のような、つるんとした白い宇宙服。 銀髪と白いスーツが溶け合いそうなところを、強烈な黒い線画が強引に繋ぎ止める。フラットな塗りは、プラスチックのような人工的な質感を際立たせ、まるで一昔前のポップアートポスターのような完成度に到達した。
■ 結論:ベースが強ければ、世界はどこへでも広がる
今回の実験で確信した。 特定の衣装に固執する必要はない。 「自分が好きな線」と「自分が好きな色」さえ揺らがなければ、彼女が巫女であろうと、メイドであろうと、あるいは宇宙にいたとしても、それは間違いなく「私の作品」になるのだ。
次は、この確立したスタイルでどんな「動作」をさせてみようか。 実験は、まだまだ終わらない。
【Day 5】パキッとした表現を求めて
AI画像生成という大海原で、私が追い求めたのは「曖昧さのない、意思のある線」だった。 どこかぼやけた、AI特有の「塗り」の質感から脱却し、ひとつのキャラクターに確かな命を吹き込むまでの5日間の記録をここに総括する。
1. 理想の「線」を定義する
私が求めたのは、ただの美少女イラストではない。 (thick lineart:1.4)、(bold outline:1.4)。 プロンプトにこの呪文を刻み込んだときから、私の戦いは始まった。 太く、力強い輪郭線。それはキャラクターを背景から切り離し、存在感を際立たせるための「盾」であり、表現の核だ。

2. 魂を宿す「銀髪・太眉・眼鏡」
キャラクターの一貫性を守ることは、AI生成において最も困難で、最も愉しい作業だ。
-
銀髪(silver hair): 光を透過し、影をパキッと際立たせるキャンバス。
-
太眉(thick eyebrows:1.4): 彼女の意志の強さと、知的な「ジト目(jitome)」を支えるアイコン。
-
眼鏡(glasses): 知性を縁取り、光の反射(reflection)を画面に生むレンズ。
これらを BluePencil-XL というモデルの解像度で描写することで、私はようやく「彼女」と出会うことができた。

3. 日常の「隙」を描くシチュエーション
完成したキャラクターを、私は様々な場所へ連れ出した。
-
図書館の静寂: 窓からの斜光が、着崩れた巫女服の皺を鮮明にする。
-
洗面台の朝: 歯を磨くという生活感。鏡の反射とタイルの目地が、パキッとした質感を補強する。
-
現代の自室: 和室を捨て、あえて無機質な洋室(modern japanese apartment room)に彼女を置くことで、巫女服の「赤」を際立たせた。

day 5-3
4. 終わりに:描線は止まらない
5日間、私はプロンプトという筆を使い、理想の線を追い求めてきた。 たどり着いた結論はシンプルだ。「パキッとした表現」とは、作者のこだわりが細部にまで浸透した結果に他ならない。
【Day 4】光の迷宮と、断腸のモデル変更
1. 理想の「光」を求めて(追求と執着)

神社に差し込む木漏れ日、銀髪に透ける逆光、眼鏡のフレームに走る反射。 これまでのモデルで「究極の空気感」を目指し、プロンプトの微調整を繰り返してきました。 「あと少し、あと数パーセントの輝きがあれば、彼女は本物になる……」 しかし、そこで直面したのは、ツールの設定項目の迷宮と、表現の限界でした。
2. 失敗と混迷:NoobAIとPonyの壁
光の表現をさらに高い次元へ引き上げるため、私は「NoobAI」といった強力なモデルに手を伸ばしました。しかし、そこで待っていたのは残酷な結果でした。 出力されるのは、色鮮やかな世界ではなく、不気味なノイズに塗りつぶされた砂嵐のような画像。

設定を見直そうにも、Draw ThingsのUIの中で必要な項目が見つけられず、指先だけが空転する。数時間を費やしてもなお、ノイズの向こう側に彼女の姿を見ることは叶いませんでした。 「今の自分の環境と知識では、このモデルを飼いならすことはできない」 それは、表現者としての敗北感を伴う、冷たい行き止まりでした。
3. 決断:BluePencil-XLへの転換
執着を捨て、私はモデルの変更に踏み切りました。新しく選んだのは、日本発の美麗モデル「BluePencil-XL」。 NoobAIのようなピーキーな設定を必要とせず、読み込んだ瞬間に「正しい色」を吐き出してくれる安定感。 複雑な調整に頼るのではなく、モデルが持つ本来のポテンシャル「繊細な線」と「透き通るような色出し」に、私の理想をすべて託すことにしたのです。
4. 新たな課題:パキッとした強さを求めて

モデルを変えた瞬間、霧が晴れたように美しい画像が出始めました。しかし、新たな課題も生まれます。 「線が細すぎる、色が淡すぎる。」 BluePencil-XL特有の繊細さと引き換えに失われた「キャラクターの存在感」を取り戻すため、今はプロンプトに強調(Weight)を多用し、太い主線(bold line)と、目が覚めるような「赤(vibrant red)」を叩き込む試行錯誤を続けています。
5. 次なる一手:構図による「体温」の表現
さらに、ただ立っているだけではなく、「前屈み(leaning forward)」という動きを加えることで、彼女の息遣いや、風の強さをよりダイレクトに伝えたい。 ノイズまみれの失敗から学んだ「引き算」と、新天地での「足し算」。 ようやく、新しい私の「巫女」が、光の中で確かな輪郭を持ち始めました。
【Day 3】背景とポーズをキメてみた
こんにちは、犬墨です。 「犬墨見聞録」3日目の今日は、キャラクターを「どこで」「どんな姿勢で」立たせるか……「背景」と「ポーズ」への挑戦です。
衣装の細部にこだわった昨日に続き、今日は彼女が生きる「世界観」を深掘りしてみました。
1. 「場所」を呪文で呼び出す
まずは、巫女服にふさわしい神聖な場所から。

-
背景の呪文:
shrine, torii, japanese architecture, cherry blossoms
真っ白な背景を卒業し、赤い鳥居や社殿、そして舞い散る桜を配置しました。背景が加わるだけで、画面の中に「空気感」と「季節」が生まれ、彼女がそこに実在している感覚がぐっと強まりました。
2. 「屈む」という繊細なポーズ
次にこだわったのはポーズです。今回はあえて道具を持たせず、「屈む」というシンプルな動作に絞りました。

-
ポーズの呪文:
leaning forward, crouching(前かがみ・屈む)
道具(ほうき等)を持たせると作画が複雑になり崩れやすくなるため、あえてキャラクター自身の「姿勢」で魅せる選択をしました。 少し腰を落とし、前かがみになる。その控えめな動作ひとつで、境内の落とし物を拾おうとしているのか、あるいは何かをそっと見つめているのか……見る人の想像を掻き立てる「物語の入り口」が生まれた気がします。
3. 世界観の大転換:和風ポストアポカリプス
さらに実験を重ね、彼女を「滅びた世界」へと連れ出してみました。

-
背景の呪文:
post-apocalyptic, ruins, cliff, sunset -
ポーズの呪文:
arched back, stretching, looking up
荒廃した世界の崖の淵、夕陽を浴びて大きく上体そらし(ストレッチ)をする巫女さん。 「静」の神社で見せた屈む姿勢とは対照的に、大きく胸を張る「動」のポーズ。arched back(背中を反らせる)という指定で、過酷な世界でも力強く呼吸する彼女の生命力を表現しました。
今日のまとめ:こだわりは「線」に宿る
背景が複雑になっても、昨日から研究している「線の細さ(fineline)」を維持することで、キャラクターが風景に埋もれず、シャープな存在感を放ってくれました。
背景とポーズ。この二つの組み合わせで、AI生成は「ただのキャラ絵」から「心に刺さる一場面」へと進化することを実感した一日でした。
明日は、この世界をもっとエモーショナルにする「光と風」の演出に触れてみたいと思います。 また次回の見聞録でお会いしましょう。
【Day 2】色々なコスチュームを試してみる
はじめまして、犬墨(いぬずみ)です! 100日チャレンジ2日目、今日も元気に「Draw Things」と格闘しています。
昨日は「とりあえず好きな属性の女の子を出してみる」のが精一杯でしたが、今日は少し欲が出てきました。 「AIなら、一瞬でいろんな服を着せ替えられるんじゃないか?」 ということで、今日のテーマは「衣装のバリエーション」に挑戦です!
今日の試行錯誤:キャラがくっつく問題を解決!
昨日の課題だった「キャラクター同士がくっついちゃう」問題。 解決するために、プロンプトの先頭に 1girl, solo, という魔法の言葉を付け足してみました。 「女の子一人だけ、ソロで描いてね!」と強くお願いするスタイルです(笑)。
さらに、バストアップばかりにならないよう、cowboy shot(太ももから上)という呪文も導入。これで準備万端です!
私の100日後の目標(再掲)
-
大好きな「2次元調のくっきりした線画の美少女」を思い通りに描き出す!
-
AI画像生成の初心者仲間が「自分もやってみようかな」と思えるような、成長の足跡を残す。
今日の出力:Day 2(衣装チャレンジ)
妄想のクローゼットから引っ張り出した、お気に入りの3着をご紹介します!
【Entry No.1:王道のメイド服】

銀髪・メガネ・ジト目に「メイド服」。この組み合わせ、破壊力が凄いです。フリルの線もくっきり出ていて大満足!
【Entry No.2:艶やかなチャイナドレス】

china dressと指定するだけで、一気に大人っぽい雰囲気に。青い衣装と銀髪のコントラストが最高です。
【Entry No.3:正統派の巫女服】

個人的に一番ヒットしたのがこれ。銀髪ジト目と巫女服のギャップが奇跡的にマッチしました。
【本日のレシピ(巫女服版)】
-
Model: Animagine XL V3.1
-
Prompt: masterpiece, best quality, very aesthetic, absurdres, 1girl, solo, cowboy shot, teenager, full breasts, cleavage, pale skin, jitome, thick eyebrows, medium hair, low twintails, hair over one eye, glasses, over-rim eyewear, miko, japanese traditional clothes, red hakama, silver hair, flat color, sharp lineart, cel shading, looking at viewer
-
Negative Prompt: lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry
今日の感想: 1girl, solo を入れたおかげで、変な融合体が現れることなく、安定して一人を召喚できるようになりました! 衣装を変えるだけで、まるで別のアニメのワンシーンを見ているようなワクワク感があります。
これからの課題: 衣装は変わりましたが、背景がまだ単色系ばかりです。 せっかくメイド服を着たなら豪華な洋館に、巫女服なら神社に……という風に、背景(ロケーション)もセットでコントロールできるようになりたいですね!
これから100日間、失敗も成功も、ぐちゃぐちゃになった画像も(笑)、包み隠さずアップしていこうと思います。
犬墨の成長を、温かく見守っていただけると嬉しいです! これからどうぞよろしくお願いします!
【Day 1】画像生成 100日チャレンジ 始動
はじめまして、犬墨(いぬずみ)と申します!
突然ですが、今日から「100日チャレンジ」に挑戦することに決めました。 挑戦するテーマは…… 自分が120%満足できる画像を自由に生成できるようになること!
もともと絵を見るのは大好きだったのですが、自分には才能がないと諦めていました。 でも、AIの力を借りれば、私の頭の中にしかない「理想の女の子」を形にできるかもしれない。そう思って、思い切って一歩踏み出してみることにしました。
手始めに「Draw Things」への挑戦
iPhoneやMacで本格的な画像生成ができるアプリ「Draw Things」。 設定項目が多くて、正直今は「え、この項目は何…?」と頭がパンクしそうな状態です(笑)。
でも、だからこそ面白い! プロンプト一つ、設定一つでガラッと変わる世界を楽しみながら、一歩ずつ進んでいこうと思います。
私の100日後の目標
-
大好きな「2次元調のくっきりした線画の美少女」を思い通りに描き出す!
-
AI画像生成の初心者仲間が「自分もやってみようかな」と思えるような、成長の足跡を残す。
今日の出力:Day 1
まずは「最初の一歩」として生成した画像がこちらです!


【本日のレシピ(day1-1)】
-
Model: Animagine XL V3.1
-
Prompt: score_9, score_8_up, score_7_up, source_anime, highres, source_anime, flat color, 2D, anime style, clean lines, lineart, cel shading, teenager, full breasts, cleavage, pale skin, jitome, thick eyebrows, medium hair, low twintails, hair over one eye, over-rim eyewear, bikini, silver hair
-
Negative Prompt: zscore_6, score_5, score_4, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, source_real, source_photographic, 3D, realistic, photo, semi-realistic, shiny skin, glossy skin, textured skin, realistic shaded,
【本日のレシピ(day1-2)】
-
Model: Animagine XL V3.1
-
Prompt: masterpiece, best quality, very aesthetic, absurdres, teenager, full breasts, cleavage, pale skin, jitome, thick eyebrows, medium hair, low twintails, hair over one eye, over-rim eyewear, bikini, silver hair, flat color, sharp lineart, cel shading, high contrast, looking at viewer
-
Negative Prompt: lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry
今日の感想: プロンプトはGeminiに相談して作成しましたが、それだけでもかなり好みの絵柄が出力されたのではないかと思っています!特に線がくっきりしているところが気に入っています。
これからの課題: よく見るとキャラクター同士がくっついてしまっていたり、物理的に不思議な部分があったりします。「表現としてあり得ない部分」をどうやって減らしていくか……。ネガティブプロンプトの調整や、もっと別のテクニックが必要なのかもしれません。この試行錯誤も楽しんでいきたいです。
これから100日間、失敗も成功も、ぐちゃぐちゃになった画像も(笑)、包み隠さずアップしていこうと思います。
犬墨の成長を、温かく見守っていただけると嬉しいです! これからどうぞよろしくお願いします!