投稿

英会話力の足しになれば良いと思って「Speak」を始めた話。

イメージ
オンライン英会話を始めてはや数年が経ちました。 とりあえずの目標だったTOEICの800を取ったけど、英会話という領域に関しては手付かずだったためオンライン英会話を個人で登録して開始したのがおよそ5年前。 英会話弱者が英語を話せるようになるまで Day1 初めてオンライン英会話のレッスンを受けたのは大学生時代になるのでもう10年近く前になります。 レッスンを始めるのが怖くなるくらい喋れない状況は脱して、とりあえず25分間の日常会話ならなんとかキャッチボールをして色々会話を広げたりできるようにはなりました。 ただ、これまで対策をしてこなかったせいか、 ちょっと長めの尺で技術的な概念についての説明をする 、という分野については苦手意識があります。 今は日常的に使うことはありませんが、海外の人と英語で技術的な話をするという文脈になったときに結構あるんですよね、このケース。 例えば、SwiftのCombineとConcurrencyの違いって何?とかそのユースケースとサンプルコードは?とかそれぞれのメリットデメリットは?みたいな少し込み入った説明をするようになると頭の中でどのように話すかという観点とそれを英語に変換する観点、それに馴染みが無い表現を使われたりするとそれを理解したり。 自身の考えや感想を伝えるよりも多くの観点から物事を考えなければならないので、会話スピードについていけなくなったり、考えている相手に何か言われると聞き逃しちゃうみたいなエラーが発生する頻度が多くなる。 これって会話が成り立たなくなるってことだし、そもそも英語ってだけで本来説明できるものが説明できなくなってしどろもどろになるのは個人的にいけてない。 なので対策することにしました。 その対策方法ですが、個人的に英会力って頭で考えずに処理できる範囲を大きくしていくってのが強いと思っているんですよ。 例えば、自己紹介って何回も繰り返しているから今更何も考えなくても口から言葉が出るんですよ。あと、相手からの自己紹介して?という表現もいくつか言い方はあるけどまあ大体知っていると。 こうなるとほとんど考えずに対応できるので、楽ちんだし、自己紹介からちょっと枠を出たところに話が飛んでも余分なことを考えなくて良いから集中して相手の問いを聞いて回答できるので、エラーが発生しづらくなる。 この感覚はずっとあったんですが...

Swiftで使うQueueのテンプレート

イメージ
SwiftのQueue そもそもSwiftに標準でQueueは存在しないのでBFSを書きたいときに自分で定義する必要があるよう。 今後書きたいときには以下の内容を使おうと思ってメモとして取っておく。 struct Queue < T > { private var elements : [ T ] = [ ] mutating func enqueue ( _ value : T ) { elements . append ( value ) } mutating func dequeue ( ) - > T ? { return elements . isEmpty ? nil : elements . removeFirst ( ) } func isEmpty ( ) - > Bool { return elements . isEmpty } var count : Int { return elements . count } }

【OSLog】How to log a Swift project

イメージ
Overview I found an article on the net that summarized how to use OSLog, I wanted a working sample. I am new to logging, so I wasn’t sure how to interpret the usage of OSLog. So I summarized it in my own way. What is OSLog? It is a library for logging that is provided by Apple and can be used in Swift projects. The official documentation is here . Sample https://github.com/Kuehar/OSLogSample When the above code is run, eight buttons are lined up as shown below. import SwiftUI import OSLog struct ContentView: View { let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "ApplicationCode") var body: some View { VStack { Button(action: { logger.trace("Trace Log") }, label: { Text("Trace") }) Button(action: { logger.debug("Debug Log") }, label: { Text("Debug") ...

SwiftUIの練習のためにGithubのリポジトリ一覧を取得して表示するiOSアプリを作った話。

イメージ
 何はともあれコードを書こう ちまちまCourseraのSwiftUI関連のコースとかの勉強を進めてはいるが、実践的なアプリを作ってみたい気持ちが出てきたので、土日を使ってサンプルを作ってみた。 ソースは ここ 。 単純なアプリなので、MVCモデルで作ればいいやの考え方で処理の書き方が分からない箇所は他に作っていた方の処理を真似しつつ、なんとか作り終わった。 仕様としては トップ画面に検索バーを用意し、入力した文字列を元にGitHubに存在するユーザーを検索する クエリで得られた結果を同画面内で行単位で表示し、ユーザーをタップした場合にはそのユーザーのリポジトリを表示する。 というもの。 ここどうすんだって迷ったポイント・他人のコードを読んでなんだこれってなったポイント ModelでGitHubとの通信をしてUserやらRepositoryの情報をfetchするのは良いけどJSON周りの処理ってどう書くんだ? →とりあえず他人がどう書いているかを見て解決。JSONDecoderで一発だった @MainActorってなに? →クラス単位で@MainActorをつけておくと、そのクラスのすべてのメソッドがメインスレッドでよばれるようになる。関数につけた場合はその関数だけが呼び出される。 今回は後者のパターン。 Taskとか初めて存在を知ったんだけどこれどういう風に使えばいいの? →そもそもasync,awaitを知るところから始めるべき。 備忘として書くと、それぞれ非同期処理を書くときに使用する書き方。asyncはメソッドが非同期作業を実行することを明確にするメソッド属性、awaitはasyncな非同期メソッドを呼び出す際に使われるキーワード。そしてTaskはプログラムの一部として非同期で実行できる作業の単位のこと。細かい書き方は省くが、それぞれの非同期処理の単位を一まとめにしてくくり、実行単位をまとめるようなイメージ。 @Publishedってなんだっけ・・・ →Combineフレームワークの一部として提供されているProperty wrapper。ObservableObjectプロトコルに準拠したクラス内のプロパティを監視し、変化があった際にViewに対して通知を行う。なお、クラス内のプロパティに付与することができるが、structなどの値型には付与できな...

Principles of UX/UI Designでこんなことを学んでいるよ 第一週 User-centerd design①

イメージ
  ユーザー指向デザイン アプリを改善していく方法として、実際にそのアプリを使用しているユーザーに対してインタビュー、使用中の観察を行うことを総称して ユーザーリサーチ という。 これを行うことで、ユーザーはアプリを使用する上でどのように、何を考え、何を達成しようとしているのかを知ることが出来る。 その中でもユーザーからの意見をデザインにどのように改善していくことができるかを確認する方法として カスタマージャーニーマップ を作成するという方法が存在する。 例えば、 メニューボタンが分かりにくい 商品のカテゴライズが曖昧である バスケットボタンが存在せず、商品が追加できたか分からない ホームボタン、戻るボタンが存在せず、途中からのやり直しができない 注文のために必要な情報を全て入力したにもかかわらず、バリデーションエラーが表示される などがユーザーリサーチで分かった場合、カスタマージャーニーマップにはこれらのユーザーの体験を整理する。 カスタマージャーニーマップを作成することで、最終的には、ユーザーに共感し、再設計を改善するのに役立つ一連の教訓を得られる。 良いカスタマージャーニーマップは詳細、かつ粒度が細かく、あらゆる場面でのCXを理解することを手助けします。 一般的に、カスタマージャーニーマップは以下の5つの要素が存在していることが多い。 アクター シナリオと期待値 ジャーニーフェーズ 行動、態度、感情 機会 それぞれを見ていくと、 アクター ペルソナやユーザー。カスタマージャーニーマップ上ではデータ駆動型。1つのマップに1つの視点を用意することでより粒度が細かくなる。 シナリオと期待値 カスタマージャーニーマップが扱う状況のこと。アクターの目標やニーズ、何を達成するかの期待と関連する要素。Amazonであれば商品を選ぶ際の意思決定や注文を完了するために必要な全ての情報にいかに簡単にアクセスできるかなどが含まれる。 ジャーニーフェーズ 行動、思考、感情といったジャーニーマップの残りの情報を整理するもの。 行動、態度、感情 アクターの行動、態度、感情であり、各フェーズでマッピングされる項目。例えば、行動はアクターの実際の行動を物語化したもの。顧客から直接引用することが理想的。 機会 UXをどのように向上させることが出来るかを考察する箇所。この情報を使って何を...

LeetCodeのEasy問題を解いて勉強するSwift Climbing Stairs編

イメージ
LeetCodeのEasy問題を解いて勉強するSwift Climbing Stairs編 新しくSwiftを触ることになりそうなので ひとまずコードを書いてみることにする。 LeetCodeのEasy問題は比較的解き方を知っている(はず)なので、Python3で書いていた部分をどのような書き方に直すのかを色々思い出しつつ試行錯誤していく。 書いている人のレベル感 Swiftビギナー。基本的な文法すらあやふやなので始めて数日レベルと言っても過言ではない。 LeetCode お題が与えられ、その内容に合わせてコードを書き、提出して合ってるかどうかを確認できる。 問題はソフトウェアエンジニアのコーディング面接で出されたお題をそのまま引用していることがほとんど。 前回 LeetCodeのEasy問題を解いて勉強するSwift Last Stone Weight編 Climbing Stairs Climbing Stairs 階段を登るとき、頂上までn段の階段があり、仮に毎回、1段か2段のどちらかを登ることができる時、何通りの登り方が存在するかを返り値として書く。 典型的な問題でけんちょん本にも記載されていた・・・はず 単純な再帰でもテストケースは通るが、それだとnの値のよっては計算量が爆発する可能性があるため、今回はメモ化再帰で解く。 関数の引数として配列を渡すときの記述を知らず、調べた。 Swiftではそのような場合に参照渡しをするときに inout を使うようで、そして実際に呼び出す時に該当する引数の前に & を付ける。 なんか気持ち悪いと思いつつもそうしないとエラーを吐くんだからしょうがない。 あと、dpの時とかに使う配列の長さを設定して中身を何の値で埋めるか、みたいな所も勉強できた。単純な問題だけど意外と学びがあったように思える。 class Solution { func climbStairs ( _ n : Int ) - > Int { var memo : [ Int ] = Array ( repeating : - 1 , count : n + 1 ) return climb_Stairs ( 0 , n , ...

LeetCodeのEasy問題を解いて勉強するSwift Last Stone Weight編

イメージ
LeetCodeのEasy問題を解いて勉強するSwift Last Stone Weight編 新しくSwiftを触ることになりそうなので ひとまずコードを書いてみることにする。 LeetCodeのEasy問題は比較的解き方を知っている(はず)なので、Python3で書いていた部分をどのような書き方に直すのかを色々思い出しつつ試行錯誤していく。 書いている人のレベル感 Swiftビギナー。基本的な文法すらあやふやなので始めて数日レベルと言っても過言ではない。 LeetCode お題が与えられ、その内容に合わせてコードを書き、提出して合ってるかどうかを確認できる。 問題はソフトウェアエンジニアのコーディング面接で出されたお題をそのまま引用していることがほとんど。 前回 LeetCodeのEasy問題を解いて勉強するSwift Invert Binary Tree編 Last Stone Weight Last Stone Weight 与えられた数値が入っている配列の中に入っている最も大きい値と2番目に大きい値をぶつける。 ぶつける時に値がイコールなら両方消える。値が異なる場合には両方とも削除し、最も大きい値から2番目に大きい値を引いた値を配列に追加する。 これを繰り返し、配列内に値が1個、または0個になるまで繰り返す。1個 残った場合はその値を戻り値として返却し、0個の場合は0を返す。 class Solution { func lastStoneWeight ( _ stones : [ Int ] ) - > Int { var stones = stones . sorted ( by : > ) while stones . count > 1 { let smaller_stone = stones . remove ( at : 1 ) stones [ 0 ] - = smaller_stone stones = stones . sorted ( by : > ) } return stones [ 0 ] ...

Courseraの"Create the User Interface with SwiftUI"に入門した話。

イメージ
Create the User Interface with SwiftUI タイトル通り、Courseraの以下のコースに入門しました。 Create the User Interface with SwiftUI 参考本を一通り復習し終わったが、いまいち全体的な開発サイクルを理解できなかったのでSwiftUI周りの開発をどのように進めていくのかを実践的に勉強できるコースを探していたところ、Metaが提供しているコースがあったので入門したという流れ。 今日の0時ごろに登録して1時間半くらい軽く進めて"Setting up SwiftUI"を完了したのでそこで学んだことを備忘的に残しておく。 Appleのデバイスには一般的なコンピューター(MacBook,iMacなど)とタッチデバイス(iPhone,Apple Watchなど)に大別される。 上記のうち前者は操作の精度が高いが、後者はディスプレイの小ささなどから捜査の精度が低い。よってデバイス上に表示される情報はシンプルに、そして情報量を制限するべきである。 気になる人は Human Interface Guideline 見てね!とのこと。 また、UI的に配色にも注意する。例として挙げられていたのはボタンの配色が全体的に暗いと分かりにくいから操作しやすいように明るい配色にしよう!みたいな話。 SwiftUIの利点 ダイナミックテキスト(デバイスごとに表示されるテキストのサイズ)が自動的にサポートされていること アクセシビリティ(障がい者向けの対応)やローカライゼーション(異なる言語区分への対応)などがしやすいこと ライトテーマやダークテーマに対応が容易なこと 宣言的(Declarative)シンタックスと命令的(Imperative)シンタックスの違い Declarative = WHAT you want つまり結局何がしたいのかに集約される。(ハンバーガーを注文するときにハンバーガー下さい。で通用する) Imperative = HOW you want どのように用意するのかに集約される。(ハンバーガーを注文するときにパンを用意して、トーストして、肉を焼いて、etc...したものを下さいというようなもの) つまりDeclarativeは処理を書けばマシン側で自動的に最適化をして欲しいもの...

LeetCodeのEasy問題を解いて勉強するSwift Invert Binary Tree編

イメージ
LeetCodeのEasy問題を解いて勉強するSwift Invert Binary Tree編 新しくSwiftを触ることになりそうなので ひとまずコードを書いてみることにする。 LeetCodeのEasy問題は比較的解き方を知っている(はず)なので、Python3で書いていた部分をどのような書き方に直すのかを色々思い出しつつ試行錯誤していく。 書いている人のレベル感 Swiftビギナー。基本的な文法すらあやふやなので始めて数日レベルと言っても過言ではない。 LeetCode お題が与えられ、その内容に合わせてコードを書き、提出して合ってるかどうかを確認できる。 問題はソフトウェアエンジニアのコーディング面接で出されたお題をそのまま引用していることがほとんど。 前回 LeetCodeのEasy問題を解いて勉強するSwift Binary Search編 Invert Binary Tree Invert Binary Tree 与えられたバイナリツリーをInvert(反転)させて root を返す関数を書く。 /** * Definition for a binary tree node. * public class TreeNode { * public var val: Int * public var left: TreeNode? * public var right: TreeNode? * public init() { self.val = 0; self.left = nil; self.right = nil; } * public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; } * public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) { * self.val = val * self.left = left * self.right = right * } * } */ class Solution { func invertTr...

LeetCodeのEasy問題を解いて勉強するSwift Binary Search編

イメージ
LeetCodeのEasy問題を解いて勉強するSwift Binary Search編 新しくSwiftを触ることになりそうなので ひとまずコードを書いてみることにする。 LeetCodeのEasy問題は比較的解き方を知っている(はず)なので、Python3で書いていた部分をどのような書き方に直すのかを色々思い出しつつ試行錯誤していく。 書いている人のレベル感 Swiftビギナー。基本的な文法すらあやふやなので始めて数日レベルと言っても過言ではない。 LeetCode お題が与えられ、その内容に合わせてコードを書き、提出して合ってるかどうかを確認できる。 問題はソフトウェアエンジニアのコーディング面接で出されたお題をそのまま引用していることがほとんど。 前回 LeetCodeのEasy問題を解いて勉強するSwift Valid Parentheses編 Binary Search Binary Search 与えられた配列(数値が入っている)にtargetが存在する場合はその数値が存在するインデックスを、存在しない場合には -1 を返す関数を書く。 class Solution { func search ( _ nums : [ Int ] , _ target : Int ) - > Int { var left = 0 var right = nums . count - 1 while left <= right { let mid = left + ( right - left ) / 2 if nums [ mid ] == target { return mid } else if nums [ mid ] < target { left = mid + 1 } else { right = mid - 1 } } return - 1 ...

LeetCodeのEasy問題を解いて勉強するSwift Valid Parentheses編

イメージ
LeetCodeのEasy問題を解いて勉強するSwift Valid Parentheses編 新しくSwiftを触ることになりそうなので ひとまずコードを書いてみることにする。 LeetCodeのEasy問題は比較的解き方を知っている(はず)なので、Python3で書いていた部分をどのような書き方に直すのかを色々思い出しつつ試行錯誤していく。 書いている人のレベル感 Swiftビギナー。基本的な文法すらあやふやなので始めて数日レベルと言っても過言ではない。 LeetCode お題が与えられ、その内容に合わせてコードを書き、提出して合ってるかどうかを確認できる。 問題はソフトウェアエンジニアのコーディング面接で出されたお題をそのまま引用していることがほとんど。 前回 LeetCodeのEasy問題を解いて勉強するSwift Valid Palindrome編 次回 LeetCodeのEasy問題を解いて勉強するSwift Binary Search編 Valid Palindrome Valid Parentheses 与えられた文字列の括弧の種類と数がイコールであるかを判定する関数を書く。 class Solution { func isValid ( _ s : String ) - > Bool { var stack : [ Character ] = [ ] for c in s { switch c { case "(" : stack . append ( ")" ) case "{" : stack . append ( "}" ) case "[" : stack . append ( "]" ) default : guard c == stack . popLast ( ) else { return false } } ...

LeetCodeのEasy問題を解いて勉強するSwift Valid Palindrome編

イメージ
LeetCodeのEasy問題を解いて勉強するSwift Valid Palindrome編 新しくSwiftを触ることになりそうなので ひとまずコードを書いてみることにする。 LeetCodeのEasy問題は比較的解き方を知っている(はず)なので、Python3で書いていた部分をどのような書き方に直すのかを色々思い出しつつ試行錯誤していく。 書いている人のレベル感 Swiftビギナー。基本的な文法すらあやふやなので始めて数日レベルと言っても過言ではない。 LeetCode お題が与えられ、その内容に合わせてコードを書き、提出して合ってるかどうかを確認できる。 問題はソフトウェアエンジニアのコーディング面接で出されたお題をそのまま引用していることがほとんど。 前回 LeetCodeのEasy問題を解いて勉強するSwift Two Sum編 次回 LeetCodeのEasy問題を解いて勉強するSwift Valid Parentheses編 Valid Palindrome Valid Palindrome 与えられた文字列が回文であるかを確認する関数を書く。 いわゆるTwo Pointerで解く。 最初ループ処理をrepeat while文で書いていたけどwhile文でも書けるんだっけ?となって書き直した。 そもそもrepeat while文とwhile文の違いってなんぞや?となったので調査。 repeat while →ループ条件に関わらずループ処理を一回だけ 必ず 実行する『while文』」 while →ループ条件を確認し、 条件に合致した場合にのみ ループ処理が行われる。 class Solution { func isPalindrome ( _ s : String ) - > Bool { if s . isEmpty { return true } let StringArray = Array ( s ) var pointer_1 = 0 var pointer_2 = s . count - 1 // 前からのポインターと後ろからのポイン...

LeetCodeのEasy問題を解いて勉強するSwift Two Sum編

イメージ
LeetCodeのEasy問題を解いて勉強するSwift Two Sum編 新しくSwiftを触ることになりそうなので ひとまずコードを書いてみることにする。 LeetCodeのEasy問題は比較的解き方を知っている(はず)なので、Python3で書いていた部分をどのような書き方に直すのかを色々思い出しつつ試行錯誤していく。 書いている人のレベル感 Swiftビギナー。基本的な文法すらあやふやなので始めて数日レベルと言っても過言ではない。 LeetCode お題が与えられ、その内容に合わせてコードを書き、提出して合ってるかどうかを確認できる。 問題はソフトウェアエンジニアのコーディング面接で出されたお題をそのまま引用していることがほとんど。 次回 LeetCodeのEasy問題を解いて勉強するSwift Valid Palindrome編 Two Sum Two Sum LeetCodeを始めた大多数の人が恐らく一番最初に解くであろう問題。 一番簡単な二重for文で書いた場合。 ただし遅い。 class Solution { func twoSum ( _ nums : [ Int ] , _ target : Int ) - > [ Int ] { for i in 0 . . < nums . count { for j in i + 1 . . < nums . count { if nums [ i ] + nums [ j ] == target { return [ i , j ] } } } return [ ] } } 速度を改良した書き方の場合。 class Solution { func twoSum ( _ nums : [ Int ] , _ target : Int ) - > [ Int ] { var seen = [ Int : Int ] ( ) ...

'Cannot preview in this file -- active scheme does not build this file. 'を解決した話

イメージ
'Cannot preview in this file – active scheme does not build this file. ’ 問題 新しくデスクトップに作ったSwiftUIプロジェクトを触ろうと思ったらこのメッセージが出てプレビューが停止した。 再起動しても現象が直らなかったので改めて原因を調査したので備忘。 原因 プロジェクトをiCloudドライブに保存していたから発生していた。 遥か昔に同じ現象に陥っていた人がおり、 公式のフォーラムに質問 していたので同様の対策を(iCloudドライブに保存されないように)して起動したら問題が解決した。

Python3とWarlus operatorの話。

イメージ
:= ⇦なんか可愛い ぼちぼち遊びで解いてるLeetCode。 374. Guess Number Higher or Lower を解いた後にいい感じの解き方あるかなーってDiscussを流し見していると、 こんな解答があった。 やってることは自分で実装した二分探索と同じことをやっているが、その中の解法でこんな書き方あったなってことでメモがてら残しておく。 ちなみにその書き方はこれ。 while ( res : = guess ( myGuess ) ) != 0 : 名前を知らなかったけどWarlus演算子っていうらしい。セイウチって呼んでた。 :=  ⇦目と牙に見えますよね?だからWarlus(セイウチ)ってことらしいです んで、上のコードのやっていることとしては res = guess ( myGuess ) while res != 0 : と同じで、これを1行で書けるよーってこと。 機能自体は Python3.8 のリリースノートに書いてあったので結構前に使えるようになっていたはずなのですが、そこまで最新機能を追いかけていなかったのでここでメモとして残して勉強したってことで。

一人暮らしだけどPanasonicの「ななめドラム洗濯乾燥機 NA-LX127AL/R」を購入した話。

イメージ
 ドラム式洗濯機の洗濯にあたって。 色々考えたが、タイムイズマネーの考えに則って購入に至りました。 現状洗濯物を突っ込んで回すだけで洗濯が完了するのはこんなにもストレスが少ないことなんだと痛感しています。 ドラム式洗濯機万歳。 背景 一人暮らし男性 ジム通いが日課のため一人暮らしにしては洗濯物が多い めんどくさがり という三点を踏まえて読んでいただければ幸いです。 購入機種 パナソニック ななめドラム洗濯乾燥 12kg 左開き 液体洗剤・おしゃれ着洗剤・柔軟剤 自動投入 マットホワイト NA-LX127AL-W 購入時の判断要素 ヒーター式乾燥か、ヒートポンプ方式か ここは結構重要視していました。比較してみると分かるのですが、回す回数がある程度多いということが予想できたので初期費用が高くとも最終的に電気代が安く済む傾向のあるヒートポンプ方式であることを重視していました。一人暮らしに特化した某SHARPのコンパクトドラムやPanasonicのCubleみたいな機種はヒーター乾燥なのでかなり早い段階で外していました。 自動洗剤投入があるか これは大体上位機種ならついています。 洗濯物を突っ込めばとりあえず回せるというのは個人的に大きな魅力だったので選ぶ際の要素になりました。 買ってみて気付いたけど大容量の洗剤が丸々一つ突っ込めるくらい洗剤タンクが大きい。 入れ替える手間が少なくてとても良い。 メルカリで値崩れしなさそうな機種であるか 最近はメルカリでドラム式洗濯機を買う人も増えているらしく、数年後に売りに出した時にそこそこの値がつくと買い替えの際に購入資金の足しになりそうだなと思ったので調べました。その際にそれぞれのメーカーで数年前の機種がどれくらい値落ちしているかを調べたところ、私の観測範囲の中ではPanasonicの機種は他のメーカーのドラム式洗濯機に比べて値崩れの幅が少なかったです。 導入時の注意点 寸法は正しくチェックしよう。 当然の話なのですが、洗濯機を置くのに十分なスペースがないと置けません。 築年数が古い物件だとドラム式洗濯機を置くことを考慮した設計になっていない事があるため注意しましょう。 注意すべき点としては、奥行き、横幅、設置面から水栓までの高さ・・・だけではありません。 玄関の横幅や、賃貸マンションならばエレベーターが存在するのか、存在する...

AirPods Proの装着中に「ブー」というバイブみたいな異音が出る様になったのでApple Storeに持っていった話。

イメージ
  なんかずーっとブーってなり始めた ので。 これは流石に故障か・・・?と思いApple Storeに予約をして持っていってみた。 すると購入した時期によってはそういった不具合がハードウェア側に見られることが多い生産時期があるらしく、無料で交換対象になった。 詳細は ここ にあるが、特定の条件に合致すると対象になるようだ。 今回は両耳のAirPods Proが修理の対象になっていたようで、両方とも変えてもらった上にイヤーピースの替えまで貰ってしまった。 しかし、2年前くらいに買ってからすでに2回も交換しにApple Storeを訪れるハメになっているので、AirPods Proは耐久性が高くないのかもしれない。 それにしてもAppleのサポートを受けにいくと最初に名前を名乗ってくるのだがあれはマニュアルなのだろうか。 サービスの質はいいし、対応も早いと思うので満足はしているが、毎回名乗ってくるのはあまり馴染みがないタイプの接客なので毎回面食らってしまう。 そんな話。

ブログからGoogle Adsenseを削除した話。

イメージ
 削除しました。 多分現時点で既に広告は表示されなくなっているはず。 理由はいくつかありますが、まあ端的に言うと広告を載せた時に見にくくなる割に金にならないなという点から削除しました。 このブログは自分が分からなかったことを備忘録的に書くこともあるのですが、書いたことを思い出すために会社のPCからアクセスしたりすることもあります。 忘れっぽいからしょうがない。 で、ブログにアクセスしました。 直後から広告の嵐ですよ。 正直目的の記事に辿りつくまでにストレスが溜まったので、こりゃやめたほうがいいかなーって思い始めました。 個人端末ならBraveみたいなブラウザとかアドブロック的なものを入れたりすることもできますが、社用のPCとかでわざわざ見に来てくださった人に不快な思いをさせなくても良いだろうと。 後はAdsense単体では正直お金は貰えない。 ここら辺はアクセス数とかの問題があるのでなんとも言えませんが、よっぽどPV数を稼がない限りはそこまで魅力的な金額にはならないです。 そもそも論になりますが、この手のジャンルのブログで収益を上げようとすることが間違いですしね。 ということで削除しました。 あ、代わりにAmazonとか本当に良かったものを紹介するときにアフィリエイト付けます。

BinarySearch(二分探索)を実装するときにPython3とJavaでは書き方が異なる話。

イメージ
二分探索の書き方 なぜこのような書き方をしなければならないのか? 二分探索の書き方 を実装するときにPythonでは中間値の宣言を mid = ( left + right ) // 2 で済みますが、Javaでは以下のような書き方をする必要があります。 mid = left + ( right - left ) / 2 ; ちなみにこれはC++にも当てはまります。 mid = left + ( right - left ) / 2 ; なぜこのような書き方をしなければならないのか? 何故このような書き方をしなければならないかというと、仮に left + right の値が 2^31-1 よりも大きければ、オーバーフローして負の値になるからです。 例えば、Javaでそのような長さの配列が与えられ、読み込んでしまった場合には例外として ArrayIndexOutOfBoundsException が発生します。 C++の場合には不正な書き込みが発生し、メモリ破壊などに繋がることもあります。 Pythonでは整数値にはオーバーフローがなく、オーバーフローを意識するような処理を書かなくても処理を行うため、とてつもなく大きな値でも計算時の精度は落ちません。 二分探索を書くときには気をつけようってことで一応メモを残しておきます。

int[26],int[128],int[256]の話。

イメージ
LeetCodeのLongest Substring Without Repeating Charactersにて LeetCodeのLongest Substring Without Repeating Charactersにて Sliding Windowアルゴリズムを実装している例を写経している時に int [ ] chars = new int [ 26 ] ; という表現を見つけたので何故このような宣言をしているかを調べた。 結果としては単純にアルファベットの数分の領域を確保するために行なっているよう。 他にも int [ ] chars = new int [ 128 ] ; や、 int [ ] chars = new int [ 256 ] ; が存在するが、これらは int[128] は ASCII用、 int[256] は拡張 ASCII用ということだった。 ASCIIは7ビット、拡張ASCIIは8ビットを使用していることを考えれば容易に思いつくはずなのに、調べないと分からなかったので記事にしました。 多分また調べるんだろうなぁ…