はこねのはこ

はこねさんの備忘録

MacBookPro US配列 caps lookを無効にしてcontrolを割り当ててIJKLキーで矢印キーに割り当ててみた(Karabiner)

はじめに

たったさっきまでfn + IJKLで矢印キー(Arrow)に設定して喜んでました。
久々にウキウキと記事を書いて投稿してから気づきました。

あれ?...
どうせcaps lock無効にして何かに置き換えるなら
使用頻度の高いcontrolの方が良くない...?

...というわけでcontrol + IJKLで矢印キーにします。

fn+IJKLの記事はこちら hakonebox.hatenablog.com

環境

  • MacBookPro US配列
  • Karabiner

設定

Karabinerでcontrol+IJKLを矢印に割り当てる

Add ruleから追加します。 f:id:hakonebox:20190518183859p:plain

caps lockを無効にする

システム環境設定→キーボード→修飾キー
caps lockをアクションなしに設定します。
※ この時点でcapslockをcontrolにしようとしていたのですが、
Kanabinerでcapslockがcontrolとしてうまく認識できなかったので、
無効にしてKnabiner側で置き換えることにしました。 f:id:hakonebox:20190518175054p:plain

Karabinerでcaps lockをcontrolに割り当てる

add itemからcaps lockをleft_controlと設定します。 f:id:hakonebox:20190518184251p:plain

さいごに

はじめからこっちで思いつけばよかったです。

MacBookPro US配列 caps lookを無効にしてfnを割り当ててIJKLキーで矢印キーに割り当ててみた(Karabiner)

はじめに

MacBookPro使ってます。

矢印キー(ArrowKey)が地味に打ちにくいので
Karabinerでfn + IJKLキーで矢印キーにしていたのですが、
矢印を打つごとにfnに左手小指を持っていくのは地味に面倒だったので、
もっと楽にできないかと考えました。

左手をほぼ動かさずに打てるキーで使えそうなキーを考えたところ、
caps lockキーを使用していなかったので、
無効にしてfnに割り当てられないかと考えてやってみました。

環境

  • MacBookPro US配列
  • Karabiner

設定

Karabinerでfn+IJKLを矢印に割り当てる

設定していなければAdd ruleから追加します。 f:id:hakonebox:20190518175428p:plain

caps lockを無効にする

システム環境設定→キーボード→修飾キー
caps lockをアクションなしに設定します。 f:id:hakonebox:20190518175054p:plain

Karabinerでcaps lockをfnに割り当てる

add itemからcaps lockをfnと設定します。 f:id:hakonebox:20190518175736p:plain

さいごに

思ったより簡単にできました。

Tenka1 Programmer Beginner Contest 2019の反省会

はじめに

Tenka1 Programmer Beginner Contest 2019に参加しました。

競プロは通算2回目の参加。 前回のAtCoder124は仮眠を取ろうとしたら寝坊して1時間遅れで参加したので、 開始から解いたのは実は今回が初めてでした。

BeginnerSelectionを全てとき、 いくつかの過去問を解いていたことでABCは解けるはずと 変に慢心していました。

悲しみをどうしていいのかわからないので、 気持ちを忘れないように書きなぐっておこうと思います。

戒め。

反省点

A - On the Way

'No'を'no'と記載してしまい痛恨のWA

早く提出しなければいけないという焦りでミスタイプを見逃してしまいました。勿体無い。

確認10秒!! 修正10分!!

A<C<BまたはB<C<Aか判断して条件式で出すだけ。

提出したコード

a,b,c = map(int,input().split())

print("Yes" if (a<c and c<b)  or (b<c and c<a) else "No")

B - *e**** ********e* *e****e* ****e**

pythonの文字列の一文字だけ変更はできないことを忘れていました。

エラーコードで思い出せてよかったです。

今回のミスで一生忘れなくなりそう...。

それはそれでいいことかと思うことにします。

文字列をリストにする。 特定の文字以外を見つけたら文字を変更する。 リストをjoinメソッドで繋げる。

提出したコード

N = int(input())
S = list(input())
K = int(input())

buff = S[K-1]
for i in range(len(S)):
    if buff != S[i]:
        S[i] = '*'

print("".join(S))

C - Stones

大反省案件。

今思うとこんな考え方をしてしまったのが恥ずかしい。

変な法則性を見つけていくつか試して実装してしまいました。

たまたま見つけたのですが、 '#'と'.'の数を数えて差が少ない方を足していけば答えになるという考え方。

問題説明にある例は通るし、自分でサンプルとして考えたinputは処理できていたので、信じ切ってしまっていました。

制限時間がきて冷静になって問題を見ると、 ........か....####か######になるパターンだけってことに気が付いたので 本当に勿体無い時間を過ごしてしまったと思います。

戒めのためにコードを記載。

提出したコード(WA)

# WA
N = int(input())
S = list(input())

sharp_num =[]
dot_num = []

search = '#'
count = 0

for c in S:
    if search == '#':
        if c == search:
            count += 1
        else:
            sharp_num.append(count)
            count = 1
            search = '.'
    else:
        if c == search:
            count += 1
        else:
            dot_num.append(count)
            count = 1
            search = '#'
            
if search == '#':
    sharp_num.append(count)
    dot_num.append(0)
else:
    dot_num.append(count)

total = 0
for i in range(len(sharp_num)):
    total += min(sharp_num[i],dot_num[i])

print(total)

全体を通して

  1. Aの問題を解く
  2. Aの判定が終わる前にBを解き始める
  3. Bの途中でAがWAと気づき修正
  4. 混乱しながらもBを解く
  5. 混乱してすがる思いでCの変な法則に執着する
  6. 問題文の問題がクリアできたので提出後判定を確認する前にD開始
  7. Dの途中でCができていないことに気がつき冷静さが完全になくなる

これからの課題

過去問を解くのを継続し、知らないアルゴリズムを身につけ、 問題を解く手札を増やす。

さいごに

  • 確認10秒!! 修正10分!!

  • 根拠のない法則性に賭けるのはダメ絶対!!!

AtCoder ABC122-Aの解法メモ

はじめに

AtCoder122のA問題について、 if文で記載したもののfindを使用するともっとスッキリ記載できることを知ったのでメモ

問題

AtCoder 星には四種類の塩基 A, C, G, T が存在し、A と T、C と G がそれぞれ対になります。

文字 bが入力されます。これは A, C, G, T のいずれかです。塩基 bと対になる塩基を表す文字を出力するプログラムを書いてください。

atcoder.jp

最初に解いた方法

いい方法が思いつく前にif文を組んだ方が早いと感じて脳死戦法しました

b = input()

if b == 'A':
    output = 'T'
elif b == 'C':
    output = 'G'
elif b == 'G':
    output = 'C'
elif b == 'T':
    output = 'A'
else:
    pass

print(output)

解き直した方法

print("TGCA"["ACGT".find(input())])

ACGTを文字列とし、findメソッドでインデックスを求め、 対になる文字列を求めます。

コード量が少ないので、コーディングの時間短縮できそうです。

メソッド

findメソッド

文字列検索に使用するメソッドです。

検索対象のインデックスを返してくれます。

見つからなかった場合は-1となります。

s = 'hakoneko game dev'
print(s.find('d'))
# 14

print(s.find('game'))
# 9

print(s.find('app'))
# -1

print(s.find('D'))
# -1

rfindメソッド

findは文字列の先頭から検索しますが、rfindを用いると、 後ろから検索します。

s = 'hakoneko game dev'

print(s.find('k'))
# 2

print(s.rfind('k'))
# 6

Python 各桁の和を求める

はじめに

AtCoderのABC0838の問題をしていて、 思いつけなくて悔しかったやり方を見たのでメモ

やりたかったこと

各桁の数字を足した値を求める

strを用いた方法

python、for文で文字列の一文字ずつ順番に参照できることを利用した方法

def digit_sum2(num):
    total = 0
    for digit in str(num):
        total += int(digit)
    return total

提出していたコード

digit_sum関数内で、値を10で割った余りを求め、 その後桁をずらす方法で実装していた。

def digit_sum(num):
    total_num = 0
    while num > 0:
        total_num += num % 10
        num //= 10
    return total_num

num_list= []
n, a, b = map(int, input().split())

for i in range(1,n+1):
    num = digit_sum(i)
    if num >= a and num <= b:
        num_list.append(i)

print(sum(num_list))

さいごに

アルゴリズムの引き出しが上手く開かなかったです。 競プロは他の方の考え方を知れていいですね。

Unity1週間ゲームジャム[つながる]"ふらいんぐつながりまゆげ"を作った話

はじめに

今回も参加しましたUnity1週間ゲームジャム!! 今回も振り返っておきましょう。

サムネとイラストは、はいき丸さん作成です。 はいき丸 (@haikimaru) | Twitter

めちゃイカしたシャツをデザインしてもらいました。

f:id:hakonebox:20190318214511g:plain

リンク

ここからあそべます。

unityroom.com

ボリュームとか事前に考えたこと

今回は時間が確保できず、作業できても1日程度でした。

そのため、初めから大規模なものは考えず、 簡単操作ですぐに結果がわかるようなゲームデザインを考えました。

実作業時間は10時間程度でした。

システム周り

ペイント機能

テクスチャへの書き込みは下記の記事を参考にさせていただきました。

nn-hokuson.hatenablog.com

はこねこが描かれた画像の上に、透明なテクスチャを重ねています。

  • 少し左にずらした様子

f:id:hakonebox:20190318225115p:plain

  • わかりにくいですが透明なものがあります

f:id:hakonebox:20190318225332p:plain

透明なテクスチャに眉毛を描くようにすることで、 透明なテクスチャを動かすことで、眉毛のみが飛べるようにしました。

f:id:hakonebox:20190318235300g:plain

画像ツイート機能

眉毛を描くのが大きなポイントのため、描いた眉毛をツイートして共有できたほうが面白いと考え実装しました。

画像付きのツイート機能は下記の記事を参考にさせていただきました。

github.com

imgurを使用しています。

imgur.com

マウス移動量

X軸、Y軸のマウスの移動量の絶対値を取得し、 多い値をインク(まゆげーじ)から引くようにしています。

float mouse_x_delta = Input.GetAxis("Mouse X");
float mouse_y_delta = Input.GetAxis("Mouse Y");
ink_value -= Mathf.Max(Mathf.Abs(mouse_x_delta),Mathf.Abs(mouse_y_delta));

飛行量の算出

飛行する距離は、完全なランダムではなく、 マウスの移動距離や、場所、残りインクの量によって 乱数の最大値、最小値を決定しています。

条件を満たすほど飛距離が伸びるようにしています。

fly_time = Random.Range(randMin,randMax);

カメラの動き

カメラの動きを眉毛に合わせてしまうとはこねこが見えなくなってしまうため、

まゆげの上昇にあわせてカメラを後ろに引くようにしています。

if(GameManager.game_mode == GameManager.GAME_MODE.FLYING){
    this.gameObject.transform.Translate ( 0, camera_y_speed, -camera_z_speed);
}

f:id:hakonebox:20190318232043g:plain

素敵なつながり眉毛

素敵なまゆげ?を描いていただいたので、いくつか紹介いたします。

なんでまゆげかいてくれないんですかぁぁぁあああー!!!

おわりに

\眉毛を飛ばすってなんだよ(哲学)/

Django 2.xx でForeignKeyのon_deleteに関するエラーメモ

はじめに

DjangoGirlsでつまづいたところのメモ。

TypeError: __init__() missing 1 required positional argument: 'on_delete'

が発生した。

その時のコード

class Post(models.Model):
    author = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True,null=True)

    def publid(self):
        self.published_date = timezone.now()
        self.save

    def __str__(self):
        return self.title

環境

原因

ForeignKeyはversion2からは引数としてon_deleteを指定することが必須となっていた。

解決方法

第二引数にon_deleteを渡します。

from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User',on_delete=models.CASCADE) 
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True,null=True)

参考にさせていただきました

Django2.0から必須になったon_deleteの使い方 - Django2の実力をつけるチュートリアルサイトDjangoBrothers