プログラミングの芽

面白そうな技術を使って、楽しいことやりたい

【PHP】FormでPOSTした値が空、受け取れない【Webアプリ】

こんにちは

 

結論から言います。

http://www.example.co.jp/index.php

というURL(例)を

http://www.example.co.jp/

のようにファイル名部分を隠す設定を.httaccessで行っているのが原因です。

 

この設定自体、単純にリダイレクトをしているので

http://www.example.co.jp/index.phpにはPOSTできていても

リダイレクト先のhttp://www.example.co.jp/にはPOSTできていません。

なので、$_POST[" "]で受け取ろうとしても空になります。

 

 

【Google Spread Sheet】動的な関数利用の覚書

こんにちは
個人的な趣味の話にはなりますが、現在以下の画像のようなYoutube動画についているコメントを対象に動画を探せるようなものを作っています。
f:id:atarms:20210924182449p:plain
画像赤枠以外の、右側の検索結果に関しては、予め用意したデータベースからQUERY関数で引っ張ってきています。

最初にセルに記入したA8セルの関数を示します。 B8セルに関しては考え方は同じなので省略します。

=
ARRAYFORMULA(
  IMAGE(
    VLOOKUP(
      QUERY(INDIRECT("C8:"&COUNTA(C8:C)+7),"SELECT C",1) ,
      'メモ'!$A$12:$B$18, 
      2, 
      FALSE
    )
  )
)

流れとしては
1.QUERYで動的な右側の結果をINDIRECTで参照し、C列(画像キー)を取得 2.画像キーをもとに、VLOOKUPを使って以下のような別の場所にある表の2列目のURLを取得
f:id:atarms:20210924183733p:plain
3.取得したURLをIMAGEで表示
4.このままだと1行分しか関数が実行されないので、ARRAYFORMULA関数ですべての行に対して処理

以上です。

少しだけ複雑になってしまったので、備忘録として。
もっと簡単にできる方法があればいいんですが・・・。

【Python】フォルダ内のmp3ファイルを結合して書き出す

こんにちは

ふと、フォルダ内に複数入っているmp3ファイルを1つのファイルにまとめたくなったので、ついでにここに残しておきます。

今回の仕様は
・フォルダ内のmp3ファイル(以下sound)をn個分結合して書き出し
・soundはランダムに選ばれる
・soundごとにmミリ秒の無音をインターバルとして挿入
・l%の確率で別フォルダ内のmp3ファイルを選択

以下が実装です

import os
from pydub import AudioSegment
import random

AtariDir = "./音源/あたり" 
HazureDir = "./音源/はずれ"

# get mp3 path
def getFileList(dirName):
    fileList = os.listdir(dirName)
    for i in range(len(fileList)):
        fileList[i] = dirName + "/" + fileList[i]
    # reset seed
    random.seed()
    # shuffle
    random.shuffle(fileList) 
    return fileList

# Combine n songs at random
# m[ms] intervals
def combineSounds(n,m,l):
    interval = AudioSegment.silent(duration=m)
    concated_sound = interval 
    for i in range(n):
        # There is a l% chance that "Hazure" will be chosen.
        if random.randint(1, 100) >= l:
            concated_sound += AudioSegment.from_mp3(getFileList(AtariDir)[0])
            concated_sound += interval 
        else:
            concated_sound += AudioSegment.from_mp3(getFileList(HazureDir)[0])
            concated_sound += interval 
    concated_sound.export("result.mp3", format="mp3")

# run
combineSounds(n,m,l)

展望としては
・連続して同じ音源が選択されないようにする
・無音を本当の無音にするのではなく、音源内のホワイトノイズ自動検出して用いる(もしくは予め都合の良い無音ファイルを用意しておく)

余談ですが、Github Copilotのおかげで一度もググることなく作成できました。
私レベルだと調べてる時間のほうが多いので、非常に時間短縮ができました。

【C#】元の文字列と同じ長さで文字列置換を行う

C#には文字列を置換するReplaceメソッドがあります。
通常は

置換後の文字列 = 置換前の文字列.Replace( "置換したい文字列", "置換後の文字列");

といった感じで記述します。

この中で、例えば簡単な匿名化処理として
「私の名前は山田です。」の"山田"を置き換えたいと思うのですが、ここで山田は2文字なので2文字の(例えば)"■■"で置き換えたいという事もあると思います。

一々、置換したい文字列のLengthを取ってfor文で文字列を作成するのも良いですが、できれば1行で済ませたいですよね。
以下のような1行で可能になります。

置換後の文字列 = 置換前の文字列.Replace( "置換したい文字列", String.Join("区切り文字", Enumerable.Repeat("置換後の文字列", 置換したい文字列.Length).ToArray()));

Enumerable.Repeatメソッドは、第一引数の文字列を第二引数分繰り返した配列を返すメソッドになります。
ただ、このままではEnumerable型になってしまうので、ToArray()でArray型にした後、String.JoinメソッドでString型に連結しています。

以下プログラム例です

string sentence = "私の名前は山田です。";
string word = "山田";

string sentence_replace = sentence.Replace( word, String.Join( "", Enumerable.Repeat( "■", word.Length).ToArray() ) );

sentence_replace : "私の名前は■■です。"

PS4でXLR接続のコンデンサーマイクを使う+α

こんにちは。
PS4のパーティーチャットで、XLR接続のコンデンサーマイクを使う方法をメモとして残します。
+αは1つの出力先(ヘッドホン等)に、PC出力音声+PS4出力音声+VC出力音声(通話相手の声)をまとめて出力する方法です。
つまり、PCでYoutubeとかを再生しながらPS4でVCしながらゲームができます。

PS4コンデンサマイク使いたいだけという方向けのも最後の方に書いています。

構成図

PS4出力音声+PS4VC出力音声+PC出力音声

PS4出力音声のみ

どちらも赤線は電源、オレンジ線はマイク入力、青線は音声出力となってます。

・スピーカーについて
  これはPS4の出力が光デジタルな為、ステレオプラグに変換するために使用しました。
  光デジタル→ステレオプラグが実現できればなんでもよいです。

・PC出力音声が不要の場合
  単純にオーディオインターフェースの出力をPS4コントローラに刺すだけです。(2番目の図)
  逆に言えば、PS4コントローラの出力をミキサーに入れさえすればなんとでもなります。

私が調べた際、UR12等はPCでしか使えないとありましたが問題なく使えます。
恐らく、イコライザ等が使えないといった話でしょう。アンプなどの超基本部分は使用できます。

注意点

オーディオインターフェースの電源はコンセントから取ること
  PCからUSBなどで取ると、PCのノイズの影響でマイクに雑音が入って使い物にならないです。
オーディオインターフェースのINPUT GAINは大きくし過ぎないこと
  大きくし過ぎると帯域不足でマイクが音割れします。
  ノイズが出ないラインでもこちらの音声は相手に聞こえていますので安心してください。
・PCの出力音声を相手に聞かせたいとき
  できません。PS4コントローラのマイク入力にラインレベルは耐えられません

構成図とか雑なので、何か質問があればコメントにお願いします。

さいごに

もっと簡単な接続方法があるかもしれませんが、私の手持ちでやった結果こうなりました。
少なくともファントム電源を備えたオーディオインターフェースは必要かと思います。

今回使ったもの

機能が揃っていれば、何でもいいと思います。
再現性という観点で私が使ったものを乗せておきます。

マイク

オーディオインターフェース

ミキサー

スピーカー(PS4の音声光出力をステレオプラグに変換できればなんでも良し)

PythonとOpenCVでエッジ検出

Webカメラの映像のエッジ検出をする。

手順

Webカメラから画像を取得
・RGB画像を白黒の1次元に変換
・ガウシアンフィルタで画像を平滑化(ぼかす)
・Canny法でエッジを検出

画像をぼかしたほうがエッジ検出の質が良くなります。

使う関数

白黒変換
cv2.cvtColor( 変換したい画像 , cv2.COLOR_BGR2GRAY)

ガウシアンフィルタ
kernel = np.ones((5,5),np.float32)/25
cv2.filter2D( フィルタをかける画像 , -1, kernel)

エッジ検出
cv2.Canny( 検出したい画像 , 50, 200)

ついでに

ハフ変換で円を検出
cv2.HoughCircles( 検出したい画像 ,cv2.HOUGH_GRADIENT,1,20,
param1=350,param2=25,minRadius=0,maxRadius=0)
param1はエッジ検出で設定したmax値が良いらしい
param2は検出の緩さ。

【Ender 3】フィラメントが詰まった→解決

題目の通りです。
温度を上げてもフィラメントが取れない、ノズル外しても取れないで焦りましたが、最終的にフィラメントを引っ張りながらエクストルーダをレンチで引き戻して力ずくで解決しました。
最悪これでも無理だったら、ノズルに供給するための管を切って交換しようかと考えてました。

詰まってたフィラメント
f:id:atarms:20190307210244j:plain
右が進行方向です
触るとつるつるしてて、見た目もよく見ると空気が入ったような感じになっていました。
ノズル内で詰まったのにもかかわらず、エクストルーダが無理やり押し出していたのでどんどん堆積されていった感じっぽいですね。
そのおかげで、管内にピッタリのサイズとなっていたので簡単に引き抜けませんでした。

ちなみに、フィラメントのΦ1.75mmに対しΦ2.3mmほどになってました。