OmniAICreator/Qiita-1.07M huggingface dataset:
【Androidを使い熟す！】TextViewについて

#####※Android技術者認定にも役に立ちます！
#TextView
テキストを表示するView

#TextViewクラス宣言
```ruby:java
※TextViewクラスの変数
TextView textView = findViewById(R.id.text);

※TextViewクラスのインスタンス化
(コードで書く場合)
TextView textView = new TextView(this);
```

#よく使う機能
・テキストセット

```ruby:java
※直接導入
textView.setText("文字");

※リソース
textView.setText(R.string.text);
```

・フォントサイズ

```ruby:java
※直接導入
textView.setTextSize(1);
```

・フォントスタイル

```ruby:java
※直接導入
textView.setTypeface(Typeface.DEFAULT);

※Typeface種類
・Typeface  Typeface.DEFAULT
・Typeface  Typeface.DEFAULT_BOLD
・Typeface  Typeface.DEFAULT_BOLD_ITALIC
・Typeface  Typeface.DEFAULT_ITALIC

※Tip
-フォントファイル利用の場合
Typeface typeface = Typeface.createFromAsset(getAssets(), "APJapanesefont.ttf");
textView.setTypeface(typeface);
```

・フォント色

```ruby:java
※RGB
textView.setTextColor(0xffff0000);
※Colorクラス
textView.setTextColor(Color.RED);
textView.setTextColor(Color.parseColor("#00ff00"));
※リソース
textView.setTextColor(ContextCompat.getColor(this, R.color.colorPrimaryDark));
```

#Tip
・setTextのメソッドは【String】Typeの値を入れること！Integerの値を入れると怒られる。
・Stringクラスをよく使うことになる。
include?  の基本！[ 使い方：含まれているか判断できます ]　〜基礎アウトプット〜

# `include?` って何？
`include?` はオブジェクトが範囲に含まれているか判断するときや
対象文字列に比較文字列が含まれているか判断するときに使用します。

含まれているときは`true`を、
含まれていないときは`false` を返します。

では使い方を簡単に説明していきます。

##使い方 1
`(始端 .. 終端).include?(比較対象)`
始端から終端の範囲に比較対象は含まれていますか？
ということです。

###文字列の使用例

```ruby
("A" .. "E").include?("C"）　　#A ~ E の範囲に C は含まれていますか？
  #=> true  

("a" .. "e").include?("C")   #a ~ e の範囲に C は含まれていますか？
　# => false

```

###数値の使用例

```ruby
(1 .. 10).include?(5)   #1 ~ 10 の範囲に　５　は含まれていますか？
 # => true

```
##使い方 2

`対象文字列.include?(比較文字列)`
対象文字列に比較文字列は含まれていますか？
という意味です。

###文字列に含まれているか
部分一致で`true`になります。

```ruby
foo = "RubyonRails"

foo.include?("Ruby")   #"RubyonRails" という文字列に "Ruby" という文字が含まれていますか？
　# => true  

foo.include?("PHP")    #"RubyonRails" という文字列に "PHP" という文字が含まれていますか？
  # => false

```

###配列に含まれているか
完全一致で`true`になります。

```ruby
array = ["aaa", "bbb", "ccc"]

array.include?("aaa")  #array に　aaa は含まれていますか？
　# => true


array.include?("aa")  #array に　aa は含まれていますか？
 # => false

```




##おわりに
今回僕がピンポイントでこの範囲を判定する方法を探したことで、他にも僕と同じ初学者の為になればいいなと思い簡単なことですが記事にしてみました。他にも範囲を判定する書き方は色々ありますので参考程度に見て下さると幸いです。
WPのアーカイブページ（カテゴリー・タグなど）を固定ページで表示させる（複数タクソノミー&ページネーション対応）

「**ワードプレスでカテゴリー・タグページなどのアーカイブページを固定ページ化したい**」と考えることは一度はあると思いますが、任意の限定されたカテゴリーだけでなく、複数のタクソノミーに対応した方法です。

## 前提：カテゴリー・タグ名と固定ページのスラッグは連動させる

仮にカテゴリーのスラッグが `fruit` `vegetable` `fish` `meat` だとすれば、これらのカテゴリー一覧を表示させる固定ページのスラッグもそれぞれ、`fruit` `vegetable` `fish` `meat` とします。

まず、このルールを守らないと今回のコードは機能しません。

## アーカイブページの内容を表示させる php ファイルに書くコード

```
<?php // 現在のページスラッグを取得（カテゴリー・タグ名と同名）
    global $post;
    $slug = $post->post_name;
?>

<?php
	$args = array(
		'paged' => $paged,
	    'post_type' => 'post',
	    'category_name' => $slug, // カテゴリーの場合
	    'tag' => $slug, // タグの場合
	    'posts_per_page' => 10,
	    'orderby' => 'date',
	    'order' => 'DESC',
	);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ): while ( $the_query->have_posts() ): $the_query->the_post(); ?>

<div class="loop">
	<h2><?php the_title(); ?></h2>
	<?php the_content() ?>
</div><!-- loop -->

<?php endwhile; endif; ?>

<div class="pagenation">
<?php
	//ページネーション
	if ( $the_query->max_num_pages > 1 ) {
		echo paginate_links( array(
		'base' => get_pagenum_link( 1 ) . '%_%',
		'format' => 'page/%#%/',
		'current' => max( 1, $paged ),
		'total' => $the_query->max_num_pages,
    	'mid_size' => 2,
    	'current' => ($paged ? $paged : 1),
    	'prev_text' => '前',
    	'next_text' => '次',
		) );
	}
	wp_reset_postdata();
?>
</div><!-- pagenation -->
```

## 解説

解説というほどでもありませんが、最初に（当該の固定ページが表示された際に）当該ページのスラッグを取得し、`WP_Query` の配列に格納してループを回すといった形です。

配列の中身を変えてあげれば、カスタム投稿に対応したり、カスタムフィールドの値でループを回すなんてアイデアも広がるかと思います。

一意のカテゴリーだけ固定ページ化するなら必要ありませんが、複数のカテゴリー・タグをそれぞれの固定ページに表示したいといった場合には、上記のコードだけで対応できるので楽です。

繰り返しですが、**タクソノミーのスラッグ**と**固定ページのスラッグ**を連動させなければ動きません。

ワードプレスなんもわからんけど楽しい！

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query
ある日突然MetabaseからBigQueryへアクセスできなくなった…

## 事象
ある日突然metabaseからbigqueryへのアクセスができなくなりました:weary:

エラー内容
`400 Bad Request{"error":"invalid_grant","error_dcscription":"Account has been deleted"} `

![スクリーンショット 2021-04-28 20.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/6cec03a9-5d1f-8594-48ba-9b7b624848f9.png)

## 原因
退職した人のアカウントでOauth認証を行なっていたため、アカウント削除したことにより接続ができなくなってしまったようです。

## 解決策
metabaseとbigquery間の認証を再設定しました。
また、今までauthで認証されていたので、サービスアカウントで認証するように変更しました。
### サービスアカウントの作成
1. gcpのメニューで、APIとサービス>認証情報を選択

<img width="500" alt="menu" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/de7212c1-1d62-5cbf-00a9-ac1c15401076.png">
2. サービスアカウントを作成
画面上部の「認証情報を作成」から「サービスアカウント」を選択
<img width="500" alt="service account" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/8250fa60-c4f9-4c1b-2eea-bf2b268ed7e6.png">
ロールには「BigQueryデータオーナー」と「BigQueryジョブユーザー」を設定します。
<img width="500" alt="role" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/055be408-9be6-ab6d-266d-bd33cf407227.png">
3. 鍵を作成し、DLする
作成したサービスアカウントを選択し、「キー」から新しい鍵を追加しDLする。
<img width="700" alt="key" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/85791f43-317d-3685-ff93-49f9887bee89.png">

### metabaseで認証の設定
DLした鍵をmetabase上で、「Service account JSON file」に設定する。
<img width="700" alt="metabase" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/55222b57-47c1-3c2d-3f69-9ab713829ab7.png">
[備忘録]Java/Android　実行環境での改行コード取得

#改行コード

- CR: 復帰、\r
- LF: 改行、\n
- CR + LF: \r\n

\n とか \r はエスケープシーケンスで、16進数の数値にすると `0X0A`, `0X0D`らしい。
また、WindowsではCR+LF、unix系ではLF、MacOSではCRなど、実行環境によって使用する改行コードが異なる。

#実行環境での改行コード取得方法

```java
final String BR = System.getProperty("line.separator");
```

これで、（アンドロイドに限らず）このコードの実行環境でのエスケープシーケンスが取得できる。

##アンドロイドでの改行コード
↓実行してみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139020/054ab9cc-5050-a576-b3ed-4c3e1bb9fb96.png)
アンドロイドでの改行コードは"\n"(LF)ということが分かった。

###（おまけ）（どうでもいい話）改行コードが分かるといろいろ便利
改行コードがわかるといろいろ便利である。
例えば、下のコードはファイルを読み込むコードの一部だが、bufferedReader.readLine()をすると文中の改行コードが消えてしまう。
そこで、読み込んだ1行をstringBuilderに追加したあと、改行を加えることで本来の位置に改行が存在することになる。ここで正しい改行コードを追加できないと期待通りの動きができなくなってしまうので、上記のやり方でコードを取得するといいだろう。
もちろん、わかっている場合はSystem.getProperty()を使わずにそのまま"\n"なり"\r"なりを入れればいい。

```java
FileInputStream fileInputStream = context.openFileInput(fileName);
BufferedReader bufferedReader = new BufferedReader(new　InputStreamReader(fileInputStream, StandardCharsets.UTF_8));
String line = bufferedReader.readLine();  // 最初の行を読み込む. 読み込み用のString変数
while (line != null) {
        //読み込んだ行を追加する
        stringBuilder.append(line);
        //改行コードを追加する
        final String BR = System.getProperty("line.separator");
        stringBuilder.append("BR");
        //次の行読み込み
        line = bufferedReader.readLine();
}
```
ScrollOut.jsでスクロール変化が楽しい！(+ animate.css & Splitting.js)

こんにちは。

スクロール検知シリーズでは割と新しい部類のライブラリでモダンブラウザ向け（IE11以上）。
超軽量で、わずか2.4KB。ライセンスは、MIT。
スクロールを検知するライブラリの中では断トツに超軽量！

公式ドキュメントを読む限り使い方もそこまで難しくなさそうです。
animate.cssやSplitting.jsと併用する事も可能なので、試してみました。
特にanimate.cssとの併用は記事が見つからなかったので参考になると思います。

公式↓
https://scroll-out.github.io/

#ScrollOutのインストール方法
CDN、NMPからインストール可能です

###html
```html
<script src="https://unpkg.com/scroll-out/dist/scroll-out.min.js"></script>
```
### NMP
```sh
npm i scroll-out -S
```

# 基本的な使用方法
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="ryota1986" data-slug-hash="ZEeWoVv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ZEeWoVv">
  <span>See the Pen <a href="https://codepen.io/ryota1986/pen/ZEeWoVv">
  ZEeWoVv</a> by ryota (<a href="https://codepen.io/ryota1986">@ryota1986</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

スクロールで変化させたい要素にカスタムデータ属性`data-scroll`を付与。
そうするとウィンドウに出現した時にdata-scroll="in"が追加される。
CSSで変化を付けてあげる。

# scrollout.js + splitting.js
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="ryota1986" data-slug-hash="VwpadNK" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="VwpadNK">
  <span>See the Pen <a href="https://codepen.io/ryota1986/pen/VwpadNK">
  VwpadNK</a> by ryota (<a href="https://codepen.io/ryota1986">@ryota1986</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
optionを設定すると基本的にtureの時に発火する。
一番最後の`<h2 data-scroll>hoge</h2>`が動かないのはその為。


# scrollout.js + animate.js
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="ryota1986" data-slug-hash="yLMOqVd" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="scrollout.js + animate.css">
  <span>See the Pen <a href="https://codepen.io/ryota1986/pen/yLMOqVd">
  scrollout.js + animate.css</a> by ryota (<a href="https://codepen.io/ryota1986">@ryota1986</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

あれ、animateのclass名の付け方こんなだったけ。。？
最初は`class="animate__backInLeft"`にして`add('animate__animated')`をしたが上手く動かなかった。（その逆もダメだった。）
結局両方一緒にaddする事で動く用になった。

`add('animate__animated', 'animate__backInLeft')`

これ消える時のアニメーションもやりたいなー
【rails】SNSシェア機能の実装(social-share-button)

#実装すること
* gem social-share-buttonを使用してSNSシェアボタンを設置する。
* 設置した場所の内容を特定のSNSにシェアが可能。

social-share-button: https://github.com/huacnlee/social-share-button 

#完成形

* 設置可能なSNSシェアボタン一覧
![ea7c0a20-8ad8-11e6-953f-83354d9a6384.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029483/e1a36b09-1a98-9580-2039-87184b28d8cf.png)

* 実際の実装済み画面
![gif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029483/2f026c7b-cb87-3544-db75-2c637efe46da.gif)

#前提

* 投稿機能を実装済み(今回は、questionモデルで実装済み。)

```ruby:shema.rb
ActiveRecord::Schema.define(version: 2021_05_05_122222) do
  create_table "questions", force: :cascade do |t|
    t.integer "member_id", null: false
    t.string "title", default: "", null: false
    t.text "content", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["member_id"], name: "index_questions_on_member_id"
  end
end
```

#手順
① social-share-buttonのインストール
② assetsのcss/scss + jsファイルへの追記
③ viewへの記載
④ SNSボタンのサイズ変更

#実装

###1. social-share-buttonのインストール

```ruby:Gemfile
gem 'social-share-button'
```
インストールします。

```terminal:terminal
$ bundle install
```
その後、configにsocial_share_button.rbファイルを作成します。

```terminal:terminal
$ rails generate social_share_button:install
```
これによって、表示したいSNSボタンを設定する事ができます。
それ以外(表示したくないもの)は、単純に消してもらって問題ないです。

```ruby:config/initializer/social_share_button.rb
SocialShareButton.configure do |config|
  config.allow_sites = %w(twitter facebook google_bookmark tumblr pinterest whatsapp_app whatsapp_web)
end
```

###2. assetsのcss/scss + jsファイルへの追記

次に下記のファイルにそれぞれ記述していきます。

* assets/stylesheets/application.scss  - ①
* assets/stylesheets/application.js    - ②

①application.scss(css)ファイルに下記を記載。

```css:assets/stylesheets/application.scss
 *= require social-share-button  #これ
 *= require_tree .
 *= require_self
 */
@import "social-share-button"; #これ
```
②application.jsファイルに下記を記載。

```javascript:②assets/javascripts/application.js
//= require turbolinks
//= require_tree .
//= require social-share-button  これ
```

###3. viewへの記載
最後にSNSシェアボタンの実装をします。
特別なことはしていませんが、念の為コントローラーも載せておきます。

```ruby:question_controller.rb
def show
  @question = Question.find(params[:id])
end
```

viewにこの文を入れるだけで表示できます。
＠インスタンス変数の箇所はコントローラーで設定している変数を入れてください。

私の場合、投稿詳細で@questionを使用しているので、@questionを記入しています。

.titleは、snsシェア時の投稿内容で表示したい内容です。
私は、投稿のタイトルを表示したかったので、@question.title

```erb:questions/show.html.erb
<%= social_share_button_tag(@question.title) %>
```

###4. SNSボタンのサイズ変更

scssファイルに下記の書き方で変更が可能です。お好みでどうぞ。

```scss:assets/stylesheets/application.scss
$size: 24px;

.social-share-button {
  .ssb-icon {
    background-size: $size $size;
    height: $size;
    width: $size;
  }
}

```

以上です。
【Swift】アプリ長押しで出るメニューを実装したい

##はじめに
実装したいものはこれ。
**クイックアクション(or3DTouch?)** という名前らしく、
検索する際に少し苦戦したのであえて記事のタイトルは
このようにしている。
![IMG_5170.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585922/79d13c88-86aa-f5b9-8d42-59ddd62c8308.jpeg)

##実装手順

###必要なもの

・Info.plist
・SceneDelegate

####Info.plist

Info.plistをSourceCodeで開き、以下のコードを追加
今回は静的に設定していますが、コードでも動的に設定ができます。
後者は一度アプリが起動していないと反映されないので、
個人的には静的に設定するのをお勧めしたいです。

```Swift
<key>UIApplicationShortcutItems</key>  
    <array>  
        <dict>  
            <key>UIApplicationShortcutItemType</key>  
            <string>ショートカットアイテムタイプ1</string>  
            <key>UIApplicationShortcutItemIconType</key>  
            <string>UIApplicationShortcutIconTypeSearch</string>  
            <key>UIApplicationShortcutItemTitle</key>  
            <string>表示タイトル1</string>  
            <key>サブタイトル１</key>  
            <string>Search for an item</string>  
        </dict>  
        <dict>  
            <key>UIApplicationShortcutItemType</key>  
            <string>ショートカットアイテムタイプ2</string>  
            <key>UIApplicationShortcutItemIconType</key>  
            <string>UIApplicationShortcutIconTypeShare</string>  
            <key>UIApplicationShortcutItemTitle</key>  
            <string>表示タイトル2</string>  
            <key>サブタイトル2</key>  
            <string>Share an item</string>  
        </dict>  
    </array> 
```


####SceneDelegate

アプリが初回起動である場合(タスクキル状態)と、
バックグラウンド状態(すでに起動済みである場合)では
発火する関数が異なります。

```Swift
    //タスクキル状態からクイックアクションを実行した場合
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        if let shortcutItem = connectionOptions.shortcutItem {
            handleShortCutItem(item: shortcutItem)
        }
        guard let _ = (scene as? UIWindowScene) else { return }
    }
    //バックグラウンド状態からクイックアクションを実行した場合
    func windowScene(_ windowScene: UIWindowScene,
                     performActionFor shortcutItem: UIApplicationShortcutItem,
                     completionHandler: @escaping (Bool) -> Void) {
        handleShortCutItem(item: shortcutItem)
        
    }

...省略
    //Info.plistで設定したUIApplicationShortcutItemTypeを
    //ここでハンドリングする
    private func handleShortCutItem(item: UIApplicationShortcutItem) {
        switch item.type {
        case "ショートカットアイテムタイプ2":
            print("タイプ2")
        case "ショートカットアイテムタイプ1":
            print("タイプ1")
        default:
            break
        }
    }
```


##おわりに
いかがでしたでしょうか。
クイックアクションという言葉を知らないとこの手の記事にたどり着くのに
少し時間がかかってしまいますね。
Github 作成したプルリクをクローズする

# 目的

- 一度作成したプルリクをクローズする方法をまとめる

# 方法

1. 削除したいプルリクを開く。（今回は下記画像の赤枠内のDevという名前のプルリクを削除したいものとする）

    ![Pull_requests_·_miriwo0104_tasks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ec32124b-80e5-37f7-51e4-847efcfcff09.png)

1. プルリクの詳細ページの最下部までスクロールすると`Close pull request`というボタンがあるのでクリックする。

    ![Dev_by_miriwo0104_·_Pull_Request__53_·_miriwo0104_tasks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1ede2eb8-e575-6fc6-17ef-10a83e40b703.png)

1. プルリク一覧へ戻るとプルリクが削除されている事がわかる。

    ![Pull_requests_·_miriwo0104_tasks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/30146c3f-34e9-27ff-b416-76ab0fcd961a.png)
[Rails] MySQL(clearDB) で Heroku にデプロイ時、Mysql2::Error::ConnectionError の解決策

### 概要

開発環境で MySQL ( gem 'mysql2' ) を利用してDBにオブジェクトの新規作成・保存できていたのに、本番環境のDBが作成できない時の解決策をまとめる。

### 発生時に実行され、表示されたエラー

```shell:Terminal
$ heroku run rails:db migrate

Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
```

### 結論
- clearDB の設定項目で入力漏れがあった

```bash:
$ heroku config

#=> CLEARDB_DATABASE_URL: <作成した clearDB のURL>

$ heroku config:add DATABASE_URL='上記のURL'
```

### 事前設定

```yml:config/database.yml(変更前)
production:
  <<: *default
  database: test_app_production
  password: <%= ENV['TEST_APP_DATABASE_PASSWORD'] %>
```

```yml:config/database.yml(変更後)
production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>
  database: test_app_production
  password: <%= ENV['TEST_APP_DATABASE_PASSWORD'] %>
```

### 詳細
後日追加

### 参考URL
- [ClearDB MySQL | Heroku Dev Center](https://devcenter.heroku.com/articles/cleardb)
D-Bus調査その2

#D-Bus 対応アプリケーションの木構造を手繰り、メソッドコールを試す手順

D-Bus を実装したアプリケーションの操作のためには、アプリケーション側で実装しているメソッドとその所属インタフェースを調べる必要がある。
これを調べ、得られたインタフェースに対するメソッドを実際にコールして動作を確かめる。

## 手順
1. 使用したいサービス名を調べる
(コンパイル済みアプリケーションの場合、どのように調べればよいのかは不明)


2. そのサービスが持っているインタフェースを調べる
このためには D−Bus が備えている Introspect メソッドを用いる。
これによって得られる情報は Object と呼ばれており、パスを持っている。
得られたパスがインタフェースであり、プロパティ、メソッドなどが所属している。  
インタフェースがノードを持っているケースでは、必要なインタフェースとメソッドを得られるまでノードを再帰的に手繰る。


3. そのメソッドを実際にコールする
対象アプリケーションのインタフェース・メソッドが分かるので、判明したメソッド名をそのサービスとインタフェースに対して実行する。

## 具体例

1. 前提：audacious のサービス名は org.atheme.audacious であることを知っている


2. dbus-send コマンドを用いて、サービスに対して Introspect を実行する。

```
dbus-send --session --print-reply --dest=org.atheme.audacious / --type=method_call org.freedesktop.DBus.Introspectable.Introspect
```
(サービス名: org.atheme.audacious) の (最上位に見えるインタフェース階層: '/') に対して、(D-Busが備えている Introspect メソッドでインタフェースを調べる)

```
(中略)
<!-- GDBus 2.64.6 -->
<node>
  <node name="org"/>
</node>
```

org というノードが存在することがわかった。
よって次に、階層に上記ノード名を加えて同じコマンドを実行する。

```
dbus-send --session --print-reply --dest=org.atheme.audacious /org --type=method_call org.freedesktop.DBus.Introspectable.Introspect
```

ノード名に ``mpris``,  ``atheme`` の2つが存在するという XML 記述が帰ってくる。
（無効化してビルドしたために）mpris 側にはオブジェクトが見当たらないので atheme 側を追いかけると ``/org/atheme/audacious`` というノードが見つかる。
またそのノードは以下の XML 記述を持つ。

```
<method name="Play"/>
```

(他にも多数のメソッドが見える)

つまり ``/org/atheme/audacious`` インタフェースが `Play` メソッドを実装しているので、これを呼び出してみる。

3. 呼び出す際のコマンド
同じくdbus-send コマンドを用いるが、当然今度はメソッド呼び出し元が audacious 側になる。

```
$ dbus-send --session --dest=org.atheme.audacious /org/atheme/audacious --type=method_call org.atheme.audacious.Play
```
上記で実際に起動中の audacious をRPC操作できる。
【GDevelop】式の中に登場するオブジェクトは絞り込みの対象じゃないゾ！


「[GDevelop の「イベント」を正しく理解しよう](https://gdevelop-jp.blogspot.com/2021/01/gdevelop.html)」のページでも解説したように、GDevelop のイベントは、条件でオブジェクトの絞り込みをしてくれるのですが、実は絞り込まない場合もあるのです😅

それは、**オブジェクトが式の中に登場している**場合です。

ちなみに「式」とは、条件やアクションの入力画面で ![2021-05-14 230335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/b6d004f0-43e1-ca1a-5945-e048804bad36.png) や ![2021-05-14 230359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/b62f4fcf-411e-2acf-6cf5-b8561ba76daf.png) が横にくっついてる欄に入力する文字とか数のあれですｗ（正確には文字列の場合は「文字列式」です）

では早速、具体的な例を挙げてみましょう。

例えばこんなシーンが有ったとして↓
![2021-05-14 183830.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/e622cc8a-1c72-2d28-2abe-a0498f168743.png)
こんなイベントを組んだとします↓
![2021-05-14 183936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/6dba8e0e-e584-69c2-77f4-4df035db4076.png)
条件で GreyTank1 の X 座標が 480 より小さいかを判定しています。

一見すると、X 座標が 480 より小さい GreyTank1 に絞り込まれ、その条件を満たす左の二輌だけが削除されるように見えますが、実際には全ての GreyTank1 が削除されます。
（またはどの GreyTank1 も削除されません。理由は後記）

なぜなら、ここで参照されている GreyTank1 が絞り込みの対象ではないためです。

実は使用している条件が「二つの数値を比べる」であり、GreyTank1 はその式の中で参照されています↓
![2021-05-14 184643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/552e5b90-41b1-9df0-242d-bc00062b4df2.png)
そのため、GreyTank1 は絞り込みの対象では無いのです。

また、この条件の GreyTank1 とは、三輌あるうちの（GDevelop の内部的に）最初の一輌のみを指しています。

もし、その最初の一輌の X 座標が 480 より小さいなら、全ての GreyTank1 （絞り込まれていないため）が削除されるし、480 以上なら条件を満たしていないので、アクションが実行されることはありません。（つまりどの GreyTank1 も消えない）

上記の例では、条件「二つの数値を比べる」ではなく、オブジェクトがもつ条件「オブジェクトの X 位置を比べる」を利用すれば、絞り込まれるようになります↓
![2021-05-14 221759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/146c727c-e5f5-c302-6c8e-067e6c0a378e.png)
しかし、必ずしも希望する条件をオブジェクトが有しているとは限りません。

例えばオブジェクトのポイント位置（PointX() や PointY()）を比較する条件は、今のところ用意されていません。

その場合は、条件「二つの数値を比べる」を利用することになりますが、その式に登場するオブジェクトは絞り込みの対象ではありません。

では、どうすれば良いかというと、次の画像のように「インスタンスごとに繰り返す」イベントと組み合わせ、個別に判定することで希望する処理を実現できます。
![2021-05-14 223247.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/8d3f046a-d64d-f835-c3a9-4850d25967b0.png)
今回の例のように単純な条件であれば、あまり見落とすこともないかと思いますが、より複雑な条件を組んでいるときに、うっかり絞り込んでいるつもりになって、「あれー？おっかしいなー……」などと言いながら貴重な休日をまるまる消費した私のようになってしまわないようご注意ください😭

**※ この投稿は「[GDevelop 無料ゲーム制作ツールを使い倒す Blog](https://gdevelop-jp.blogspot.com/2021/05/gdevelop_16.html)」からの移植＆改訂版です。**
ArchLinuxでRaspberry Pi Picoの開発環境構築

# 前置き
秋月でpicoをポチっちゃったがどうやって使えばいいか全く思いつかず、とりあえずLチカをやってみようと思ったが、メインPCはArchLinuxで驚くほどArchLinuxでpicoをいじっている人がいませんでした。

[macOSでLチカをやってる記事](https://blog.rikei-tawamure.com/entry/2021/02/07/135244)を見つけたので、ArchLinuxでやってみると決め、そのまとめをここに書きます。

# 環境構築
## arm-none-eabi-gccの導入
```shell
sudo pacman -S arm-none-eabi-gcc arm-none-eabi-newlib
```
これで終わりです。`arm-none-eabi-newlib`をインストールしないとexampleのblinkのコンパイルができないのでインストールしましょう。

## SDKの導入
gitで落としてパスを通すだけです。

```shell
cd ~
mkdir pico
cd pico
git clone -b master https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk
git submodule update –-init
```

`.bashrc`(僕はzshなので`.zshrc`)に次を追加して

```shell
export PICO_SDK_PATH = "~/pico/pico-sdk"
```

`source`で適用します。

```shell
source .zshrc
```

# Lチカ(blink)のコンパイル
## pico-exampleをclone
```shell
cd ~/pico
git clone -b master https://github.com/raspberrypi/pico-examples.git
cd pico-examples
```

## pico-exampleをビルド
```shell
mkdir build
cd build
cmake ../
```

## blinkをビルド
```shell
cd blink
make
```
ビルドが完了すると`blink.uf2`が生成されます。

# 書き込み
BOOTSELボタンを押しながら接続するとUSBメモリとして認識されるので、生成された`blink.uf2`をドラッグ・アンド・ドロップすれば書き込みが終わり、Lチカ完成です。

# 参考文献
https://blog.rikei-tawamure.com/entry/2021/02/07/135244
【AtCoder】ABC200をPython3で解説

ABC200の解説。

https://atcoder.jp/contests/abc200

## A - Century
### 解説
年→世紀を求めるには、年から1を引いて、100で割って、1を足す。

### コード
```python
N = int(input())
print((N-1)//100+1)
```

## B - 200th ABC-200
### コード1（```int```のまま）
```python
N, K = map(int, input().split())

for _ in range(K):
    if N % 200 == 0:
        N //= 200
    else:
        N = N * 1000 + 200

print(N)
```
※```int```のまま計算する方法。
　```N```を1000倍して、```200```を足すことで実装。
### コード2（```str```に置き換える）
```python
N, K = map(int, input().split())

for _ in range(K):
    if N % 200 == 0:
        N //= 200
    else:
        N_S = str(N) + '200'
        N = int(N_S)

print(N)
```
※```str```で数字を足す方法。
　```N```をいったん文字列に直して、```'200'```を文字列として追加し、また、```int```に戻す。

## C - Ringo's Favorite Numbers 2
### 解説

Ai−Ajが200の倍数ということは、AiとAjを200で割ったあまりが等しいということである。
たとえば、Ai=201,Aj=1とすると、

Ai-Aj=201-1=200
Ai÷200=1...1
Aj÷200=1...1

また、Ai=523,Aj=123とすると、

Ai-Aj=523-123=400
Ai÷200=2...123
Aj÷200=0...123

よって、このことが確かめられる。

この問題は、Aの要素を200で割った余りをRとすると、Ri=Rj(i<j)は何通りあるかということになる。

### コード
```python
N = int(input())
# 入力を整数値にして、分けてリストに入れる。
A = list(map(int, input().split()))
Rmd = []

def rfn() -> None:
    # Aの全要素を200で割った余りをRmdに追加
    for x in A:
        Rmd.append(x % 200)

    # [0, 0, 0,... ,0]と0を200個生成
    count = [0] *200

    ans = 0
    # Rmdの要素を一つずつ検証
    for rmd in Rmd:
        # ※補足1
        ans += count[rmd]
        # ※補足2
        count[rmd] += 1

    return ans
    
if __name__ == '__main__':
    print(rfn())
```

### 補足
※1　```ans += count[rmd]```だが、リストである```count```の```rmd```番目の値を```ans```に加える操作。
例えば、```count[123]```が1で、```ans```が0ならば、最終的な```ans```は1となる。つまり、1通りの組み合わせがあるということになる。

※2　値を確認した、ということで```count[rmd] += 1```で要素を1つ数える。
QGISに新規アイコンの追加

## はじめに
QGISで点の位置情報を表現する際、既に用意されている単純な丸やひし形だけでは物足りなくなってくる。自分でアイコンを作ってそれを使える様にできると、表現の幅が広がるし視覚情報としても分かりやすくなるため今回はその手順をまとめる。

## 実行環境
【PC環境-OS】
　　・Windows 10 Pro　

【ソフトウェア-バージョン】
　　・PostgresSQL 10.13
　　・PostGIS 2.5
　　・QGIS 3.10.6

## 今回やる事

１．SVGファイルの作成
２．QGIS上で加工できる様にSVGファイルの設定書き換え
３．QGISで作成したアイコンを使用


### １．SVGファイルの準備
・適当な画像ファイルを用意したら、下記URLにアクセスして『Use Online』をクリック。
https://vectr.com/

・画面の白いキャンバスに、用意した画像ファイルをドラッグ＆ドロップ。

・枠線をつけてエクスポートをクリック。（下図の<font color="red">赤枠部分</font>）
　※枠線をつける理由は、後にQGIS上で加工できるようにするため。
![Qiita-no008_img01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/79e8cbfe-52e6-8bfc-b7c1-a23ae10843fd.jpeg)

・[page ⇒ selection]に変更し、ファイル形式が [svg] になっている事を確認できたら『DOWNLOAD』をクリック。（下図の<font color="red">赤枠部分</font>）
![Qiita-no008_img02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/bcffdbb0-f524-a10b-d49b-79b0eba51fcf.jpeg)

**SVGファイルの作成は以上で完了！**


### ２．QGIS上で加工できる様にSVGファイルの設定書き換え
ダウンロードしたSVGファイルをテキストエディタなどで開き、＜use＞タグ内の以下3箇所を変更。（値自体は作成したイメージにより異なる。）

　・stroke="#0f020c"　⇒　stroke="param(outline) #0f020c"

　・stroke-width="3"　⇒　stroke-width="param(outline-width) 3" 

　・stroke-opacity="1"　⇒　stroke-opacity="param(fill-opacity) 1"


### ３．QGISで作成したアイコンを使用
作成したSVGファイルの格納先を確認するため、QGISを開き [設定 ＞ オプション]をクリック。
システムを選択してパスを確認し、そこにSVGファイルを格納する。
![Qiita-no008_img03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/d146716b-ccb9-c7a0-7e60-3c30caab2aee.jpeg)

QGISを開いて適当に点レイヤを選び、右クリック『プロパティ』を選択。
＜シンポロジ＞のシンボルレイヤタイプを『SVGマーカー』にすると、先程格納したSVGファイルがイメージ一覧から選択できる。（下図<font color="red">赤枠</font>部分）
※SVGファイルの設定書き換えを行わない場合、下図の<font color="blue">青枠</font>部分がグレーアウトとなる。
![Qiita-no008_img04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/f7244ffc-3cb6-468c-bc22-7760770a6fd2.jpeg)

マークを今回作成したSVGイメージに置き換えると、こんな感じ。
![Qiita-no008_img05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/75b93806-a761-5fc2-fbd5-4873cc025573.jpeg)


**自作のアイコンをQGIS上で表示することができましたー！**


## 補足
実際にQGISで作ったファイルをWeb上で公開していくには、WebGIS用のサーバーを構築し、そこにアップロードする流れとなる。
今回作成したアイコンはあくまでローカルのQGISがアイコンとして認識できるフォルダに格納しただけなので、Web上で公開する時には、事前にWebGIS側のアイコンフォルダにSVGファイルを格納しておかなければいけない。
Cloud9でMySQLのインストールや起動をする方法

#はじめに
Cloud9でMySQLのインストールや起動ができなくて困っている人のために、僕が実際に解決に役立った記事をピックアップしました。
以下の3つの記事に書いてあることを実行すればあなたの問題も解決できるかもしれません。
僕のようにGoogleの旅に出て問題の解決に丸一日費やすのはもったいなので、チャチャっと解決しちゃいましょう！！

#環境
 + AmazonLinux1
 + MySQL8.0
 + Mac（M1）

#本文
まず、以下の記事を参考にEC2インスタンスの容量を増やしましょう。
https://blog.proglus.jp/4574/

次に、以下の記事を参考にMySQLが起動できない問題を解決しましょう。
https://qiita.com/miriwo/items/e7afd5e1ae0de94f27c2

最後に、以下の記事を参考に初期PWを変更してMySQLにログインしましょう。
https://kitsune.blog/mysql-login#%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E5%86%8D%E8%A8%AD%E5%AE%9A

See you!!
素敵なデータ構造：ヒープ by Python

#データ構造の説明
ヒープとは、
・二分木を用いるデータ構造で、
・木の深さh-1以下の部分については完全二分木を形成し、
・各頂点と親頂点との間に親頂点≧子頂点の関係が成立し、
・値xの検索には適さないですが、最大値の取得が得意
なようです。
<br>

```Python:heap.py
class Heap():
    heap = []
    
    # 値の追加
    # 一番最後の葉に追加したのち、「自分の親と比較して逆転していれば入れ替える」を繰り返す
    def push(self, x):
        self.heap.append(x)
        i = len(self.heap)-1
        while i > 0:
            p = (i-1)//2
            if self.heap[p] >= x:
                break
            self.heap[i] = self.heap[p]
            i = p
        self.heap[i] = x
        return self.heap
    
    # 最大値の取得
    def top(self):
        if self.heap != "":
            return self.heap[0]
        else:
            return -1

    # 最大値の削除
    # 一番最後の葉を根と入れ替えたのち、「自分の子と比較して逆転していれば入れ替える」を繰り返す
    def pop(self):
        if self.heap == "":
            return
        x = self.heap[-1]
        self.heap.pop()
        i = 0
        while i*2+1 < len(self.heap):
            child1 = i*2+1
            child2 = i*2+2
            if child2 < len(self.heap) and self.heap[child2] > self.heap[child1]:
                child1 = child2
            if self.heap[child1] <= x:
                break
            self.heap[i] = self.heap[child1]
            i = child1
        self.heap[i] = x
        return self.heap
        
h = Heap()
h.push(3)
h.push(43)
h.push(15)
h.push(29)
h.pop()
h.push(732)
h.push(88)
h.push(14)
h.push(51)
h.pop()

# 出力 [88, 29, 51, 3, 15, 14]
```


#アルゴリズムへの適用
###ダイクストラ法

```Python:Dijkstra-heap.py
import heapq

# アルゴリズム定義
# ヒープを用いたダイクストラ法
def Dijkstraheap(G, dist, s):
    used = [False for i in range(N)]
    dist[s] = 0    
    que = []
    heapq.heappush(que, (dist[s], s))

    while que:
        v = que[0][1]
        d = que[0][0]
        heapq.heappop(que)

        if d > dist[v]:
            continue

        for e in range(len(G[v])):
            if dist[G[v][e][0]] > dist[v] + G[v][e][1]:
                dist[G[v][e][0]] = dist[v] + G[v][e][1]
                heapq.heappush(que, (dist[G[v][e][0]], G[v][e][0]))
        
# 入力受取
# 頂点数、辺数、始点
N, M, s = map(int, input().split())

# グラフの生成
# 重み付き単方向グラフ
G = [[] for i in range(N)]
for i in range(M):
    a, b, w = map(int, input().split())
    G[a].append([b, w])

# ダイクストラ法の結果を格納するリストの生成 
# 初期値として無限大の代わりに10000を格納
dist = [10000 for i in range(N)]    

# アルゴリズム実行
# ヒープを用いたダイクストラ法
Dijkstraheap(G, dist, s)

# 結果出力
# sから各頂点への最短距離を出力
for i in range(N):
    print(i, ": ", dist[i])

# 入力
# 6 9 0
# 0 1 3
# 0 2 5
# 1 2 4
# 1 3 12
# 2 3 9
# 2 4 4
# 3 5 2
# 4 3 7
# 4 5 8

# 出力
# 0 :  0
# 1 :  3
# 2 :  5
# 3 :  14
# 4 :  9
# 5 :  16
```
【Go】本日日付のJST00:00:00をUTC時刻で取得する

## 概要
日付のデータに関してデータベース上では、UTCで格納しているケースはけっこうあると思います。ただシステムは日本時間(JST)の世界で動いているので、例えばクエリで日付を絞り込むときにJSTの00:00:00から開始したいんだけど、DB上はUTCなのでその昨日日付の15:00:00からのデータが対象となります。
ということで、こういうケースの場合、どうやってGoで日付の実装をしていけば良いのかというのを紹介します。

## 対応例
* 取得するデータを日本時間の本日日付という前提で、まずはJSTの本日日付の00:00:00を取得します。[Goでtime.Parseを使うときのタイムゾーンについて](https://blog.70-10.net/2018/07/31/go-time-parse/)を参考に、まずは日本時間で`time.Now()`を取得し時刻部分の切り捨てを行います。例えば日本時間の2021/5/14に実行した場合は`2021-05-14 00:00:00 +0900 Asia/Tokyo`と出力されます。

```go
jst := time.FixedZone("Asia/Tokyo", 9*60*60)
currentTimeJst, _ := time.ParseInLocation("20060102", time.Now().In(jst).Format("20060102"), jst)
fmt.Println(currentTimeJst)
```
* では次に、上記で取得した日付をUTC時刻に変換します。日本時間の2021/5/14に実行した場合は`2021-05-13 15:00:00 +0000 UTC`となる想定です。実装としては、取得したJST日付で`time.UTC()`メソッドを呼べば良いです。

```go
currentTimeUtc := currentTimeJst.UTC()
fmt.Println(currentTimeUtc)
```
ストロングパラメーターで指定した情報だけ保存

##はじめに##

今回は学習中に作成した簡易版twitterでストロングパラメーターをアウトプットしていきます。

必要な情報だけをDBに保存していきます
仮に全てのデータ（パラメーター）を受け取る仕様の場合、悪意のあるパラメーターによって第三者にデータを改竄されてしまうなど、セキュリティ上に問題が起きてしまう恐れがあります。
回避するためには、ストロングパラメーターを使用して受け取るパラメーターを制限することが大切です。

##実際にどんな情報が送られてきているか##

このアプリは写真のURLとつぶやきを投稿できるものです。
![スクリーンショット 2021-05-14 19.38.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/bea68535-c148-4241-6a8a-6a048898b514.png)

モデルやビュー等は割愛させていただき下記がコントローラーになります。
実際に投稿ボタンを押したら何が送られてくるのか*binding.pry*で確認します。

```tweet_controller.rb
def new
  @tweet = Tweet.new
end

def create
  binding.pry  #一度binding.pryで止めて中身を見るための記述
  Tweet.create(tweet_params)
end

```


```
[1] pry(#<TweetsController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"dGa9JyZphq/J2xJrdx7ZE47LlxWeBimigLTW5GgkU+MuYuCa/qDCnCJ3L5bdMCOVg+IfB+qyDnZdGa3sNHtEJw==", 
"tweet"=>{"image"=>"https://tech-master.s3.amazonaws.com/uploads/curriculums/images/Rails1-4/sample.jpg", "text"=>"スカイツリーが写った綺麗な景色！"},
 "commit"=>"SEND", "controller"=>"tweets", "action"=>"create"} permitted: false>

```
"tweet"の以下の{}に入っているデータだけ欲しいのですが、余計なものまで入っています。
image(写真のURL)とtext（つぶやき）だけのデータが欲しいのでここでストロングパラメーターを使います。

##ストロングパラメーター##

門番みたいな役割だと思っています。

「なんでも通すわけにはいかんぞ！！」
という感じで記述して許されたparamsしか通しません。

まずは*require*メソッド

```
params.require(:モデル名)
```
必要とする情報を指定します。主にモデルを指定します。
今回では３行目に記述されているtweetです。

次に*permit*メソッド

```
params.require(:モデル名).permit(:キー名, :キー名)
```
してしたキー名をDBに保存することを許可すると覚えます。
今回ではimageとtextを指定します。

```.rb
 params.require(:tweet).permit(:image, :text)
```
このような形になります。

私が覚えやすいなと思った例えを紹介します。

まずはAmazonでイヤホンを頼んだとします。

家に商品届き、Amazonの箱の中に入っています。
その箱を開けるためにrequireメソッドで開封をし、今度はイヤホンの箱が入っています。
イヤホンの箱を開けるためにpermitで開けやっとイヤホン現物となります。笑


```.rb
def create
  Tweet.create(tweet_params)
end

private
 def tweet_params
   params.require(:tweet).permit(:image, :text)
 end
end
```
tweet_paramsというストロングパラメーターを定義し、createメソッドの引数に使用して、tweetsテーブルへ保存できます。
dockerfileにてbuild時刻を利用する方法（メモ）

# 背景
AWS ECSでdocker imageを動かしていた際に、
いつbuildしたイメージが動いているかを知りたかったが、
うまくbuild時間をdocker内に渡す方法が見つからなかったので力技をした際のやり方メモ

# 一般的なやり方
docker build時にargを渡すことができるので、
その際に入れ込むやり方が一般的な模様

`docker build . --build-arg FOLDER=$(date -u +"%Y%m%d")`

ただECSを使う場合はECRダッシュボード上の「プッシュコマンドの表示」にある方法から変えたくなかったので、
なるべくdockerfileの中だけで完結する方法を検討していました。

# 今回のやり方
結果dockerfile内で値を取得することはできなかったため、
以下のコマンドを実行してbuild時間をファイルで残すことにしました。

`RUN echo `date '+%Y/%m/%d %H:%M:%S'` > build_timestamp.txt`

このファイルをプログラムから読むことで、
buildコマンドに依存せずbuild日時を取得できます

# 参考リンク
- https://github.com/docker/docker.github.io/issues/11289
TE(Type Enforcement) とは

## 勉強前イメージ

selinuxで使われてる制御だけど中身はあんまりわかってないし覚えてない....

## 調査

### TE とは

Type Enforcementの略でSELinuxのアクセス制御の1つになります。
プロセスに `ドメイン` 、 ファイルなどのリソースに `タイプ` と呼ばれるラベル(識別子)を付与して
`ドメイン(プロセス)がどんなタイプ(ファイル)にアクセスできるか` というアクセスベクタという操作の種類を設定します。
ファイルなどのリソースについてはオブジェクトクラスとして定義され、細かくアクセスベクタを設定することで詳細な制御を行うことが出来る。

### ↑でわかりずらい文言

- アクセスベクタ

プロセスがどんなファイルにアクセスできるようにするか ということを決めます。
例えば、 `read:読み込み` や `write:書き込み` 、 `create:作成` などがあります。 

- オブジェクトクラス

ファイルなどリソースの種類を定義しています。
`file:ファイル` や `filesystem:ファイルシステム` 、 `dir:ディレクトリ` などがあります。

### イメージ

下記の図がイメージになります。

![1# TE とは - diagrams.net - Google Chrome 2021-05-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/e3feee07-069c-cdc1-36aa-3b6ee2c2cf2a.png)

表していることとしましては
プロセスはファイル(リソース)に読み込み権限が与えられている というのが確認できます。

## 勉強後イメージ

あんま理解できてなかったけど、行う動作やリソースを定義して
何を読み込むのを許可するのか、何を作成するのを許可するのかって感じかー

## 参考

- [第2回　SELinuxモジュールの詳細](https://www.itmedia.co.jp/enterprise/articles/0502/17/news033.html)
- [SELinuxで組み込み機器のセキュリティを高める（前編） ―― SELinuxの概要](http://www.kumikomi.net/archives/2008/09/18selin1.php?page=4)
【初心者でもわかる】写真を額縁に入れてWEBサイトに飾る方法

#どうも7noteです。CSSを使って写真を額縁に入れて飾る方法

きれいな写真をWEBで目立たせたいときにピッタリの方法。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/1e6b5a3c-8599-ce2c-d123-5b84f7990d6e.png)

シンプルですが、それらしさがでるかなと思います。
CSSのみで作成する方法を紹介していきます。

## CSSで写真を額縁に入れて飾る方法

```index.html
<div class="frame"><img src="sample.jpg" alt="写真"></div>
```

```style.css
.frame{
  border-top: 20px solid #B37D4D;    /* 上のborderを指定 */
  border-right: 20px solid #B37D4D;  /* 右のborderを指定 */
  border-bottom: 20px solid #D2AE7E; /* 下のborderを指定 */
  border-left: 20px solid #D2AE7E;   /* 左のborderを指定 */
  box-shadow: inset 0 0 10px #000;   /* 内側に影を指定 */
  display: inline-block;             /* 写真に合わせるためインラインブロック要素にする */
}
.frame img {
  position: relative; /* z-indexを指定 */
  z-index: -1;        /* 影を写真の上に重ねるためマイナス値を指定 */
}
```

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/1e6b5a3c-8599-ce2c-d123-5b84f7990d6e.png)

## 解説

borderの特性として、上下左右で色が違う場合重なる部分が斜めに配色されます。

![スクリーンショット 2021-05-09 10.24.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/a7644df3-faff-02df-52af-a06ade2f53ad.png)

これを利用することで、額縁特有の接続部分を再現することができます。
あとは光の入り方を再現するために左&下と、右&上で色を分けます。

影を指定するのですが、影は普通に入れてしまうと写真の後ろに入ってしまうので、z-indexを利用して写真を後ろに配置し、.frameに対して内向きの影を入れます。これで立体感が少しでます。

## まとめ

cssだけで簡単に額縁を装飾する方法を解説しました。
こだわった額縁にしたい場合はcssでは難しいので画像を背景画像として指定するなどの必要があります。

**CSSで作るメリットとしては、写真の大きさに合わせて額縁も自動で大きさが変わるので作成や変更が簡単**なところですね。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
system_specでjqueryをテストする

## 導入

https://qiita.com/Ub_Iwerks/items/c4f28dac6d1922bf32cb

前回の記事で、`:rack_test` → `:selunium`の以降が成功し、無事jqueryなどのDOM操作をrspecでテストできるようになった、わけではありませんでした。

今回はこちらの記事を参考に、正式にDOM操作をrspecでテストできるようになりました。（ありがとうございました！）

https://qiita.com/ngron/items/f61b8635b4d67f666d75

## 結論

結論としましては、前回の記事の設定でDOM操作をテストする為には、以下の3操作が必要でした。

1. chromedriverのDockerイメージを導入する　`Dockerfile`
2. テスト実行環境をchromedriverに設定　← 前回の記事の内容
3. system_spec.rbで`js: true`にする

補足：自分の場合はポート番号が重複するエラーが発生したので（多分そう）、テスト環境のポート番号を変更しました。　`rails_helper.rb`

```ruby
Dockerfile
 RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
     && curl -sL https://deb.nodesource.com/setup_10.x | bash - \
     && apt-get install -y nodejs \
     && mkdir /myapp
+RUN apt-get update && apt-get install -y unzip && \
+    CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
+    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
+    unzip ~/chromedriver_linux64.zip -d ~/ && \
+    rm ~/chromedriver_linux64.zip && \
+    chown root:root ~/chromedriver && \
+    chmod 755 ~/chromedriver && \
+    mv ~/chromedriver /usr/bin/chromedriver && \
+    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
+    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
+    apt-get update && apt-get install -y google-chrome-stable
 WORKDIR /myapp
 COPY Gemfile /myapp/Gemfile
 COPY Gemfile.lock /myapp/Gemfile.lock

```

```ruby
rails_helper.rb
 RSpec.configure do |config|
   config.before(:each, type: :system, js: true) do
     driven_by :remote_chrome
     Capybara.server_host = IPSocket.getaddress(Socket.gethostname)
-    Capybara.server_port = 3000
+    Capybara.server_port = 3010
     Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}"
   end
   config.include FactoryBot::Syntax::Methods
```

```ruby
spec/system/site_layouts_spec.rb
 require 'rails_helper'
 
-RSpec.describe 'Layouts', type: :system do
+RSpec.describe 'Layouts', js: true, type: :system do
   let(:user) { create(:user) }
 
   context "user signed in" do
				:
         expect(page).to have_link href: notifications_path
         expect(page).to have_selector "i.fa-bell"
         expect(page).to have_link href: search_works_path, class: "fa-search"
+        within("li.dropdown") do
+          expect(page).to have_link class: "dropdown-toggle"
+          click_on "#{user.username}"
+        end
         expect(page).to have_link "ログアウト", href: destroy_user_session_path
         expect(page).to have_link "プロフィール", href: user_path(user)
         expect(page).to have_link "アカウント編集", href: edit_user_registration_path
```

## おわりに

最後まで目を通して頂きありがとうございました！

ただ、正直まだ全然理解が追いついていなくて恥ずかしいくらいです。将来的には、もっと根本的な理解ができているようなエンジニアになりたい。（本当に
【2021年】C#かVB.NETかで迷っているならC#にするべき

**C#かVB.NETかで迷っているなら、C#にするべき**です。
VB.NETを使う明確な理由があるならば、VB.NETを使用した方がいいこともあります。しかし、迷っているくらいならば、C#にすべきです。

## 理由

**VBは言語としての進化が停止されることとなり、今後新しい機能がサポートされない可能性があるから**です。
これはMicrosoftの開発ブログで、2020年3月に発表されています。

* [Visual Basic support planned for .NET 5.0 | Visual Basic Blog](https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/)
* 参考日本語記事: [「Visual Basic」は.NET Coreでもサポートを継続 ～ただし、言語としての発展は終わり - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1240998.html)

> Going forward, we do not plan to evolve Visual Basic as a language. This supports language stability and maintains compatibility between the .NET Core and .NET Framework versions of Visual Basic. Future features of .NET Core that require language changes may not be supported in Visual Basic.

（抄訳）
今後VBを言語として進化させる予定はない。
言語を変更する必要のあるような新しい機能は、VBではサポートされない可能性がある。

従来の機能がサポートされなくなったり、言語が非推奨になるというわけではありません。サポートされない可能性のある新しい機能というものがいつ現れるのか、あるいはずっと現れないのかも、確実なことはわかりません。
しかし、サポートされない可能性があると公式に明言されている以上、それはリスクであり、C#と比べれば**明確なデメリット**です。
そのデメリットを超えるメリットがある場合以外では、VB.NETを選択する理由がありません。


## VB.NETを選択するメリットがある場合とは

### 1. C#（や他の言語）を選択するコストが非常に高い状況にあり、今後新しい機能が使えなくなる可能性を差し引いても、コストを抑えたい場合

* すでに大量のVB.NETのコードが存在し、それに対する修正を行う場合
  * 疎結合な部分ならば、一部を別プロジェクトに切り出して部分的にC#に移行することもできます
* チームメンバーがVB.NET以外に習熟していない場合
  * そのプロジェクトはそれでいいとしても、将来的にそのままでよいかは検討すべきです
* 周辺ツールの都合で言語を変更できない場合
* 顧客や上司の指示で言語を変更できない場合
  * 顧客や上司が上述のリスクを知らずに言っている可能性がある場合は確認した方がいいかもしれません
* プロジェクトの生存期間が非常に短い場合
  * 「すぐ捨てるつもりのコードが思いの外重用されてしまった」はよくあることなので、やや説得力に欠けます

### 2. VB.NETそのものが目的であるとき

* VB.NETが好きで、あえて書いている場合
  * ビジネスやチーム作業では自分の好みを理由にはできませんが、個人の趣味なら自由です


## まとめ

* 従来通りのVB.NETは今後もサポートされるが、言語としての進化は公式に止まった
* VB.NETは将来的に新しい機能がサポートされない可能性がある
* それはリスクなので、VB.NETを選択する明確な理由がないなら、C#にすべき


## 補足①：この記事を書いた理由

2021年5月現在、「C# VB.NET」と検索すると、両者を比較したブログ記事やQ&Aサイトの回答がいくつも出てきます。
しかしそれらの多くは2年以上前に書かれたものであり、この記事で引用したVB.NETの進化停止について追記されていません。中には、進化停止の発表後に書かれているにも関わらず、その件に触れないままVB.NETを他者に勧めるような書き込みさえあります。（個人的に、それは非常に無責任だと思います。）
そういった古い情報が広まったままでは正しい判断ができない可能性があると考えて、この記事を書きました。

## 補足②：（私見）「VB.NETは入門者向け」と言われることがあったが、現在もそうかは疑問

これは私見です。

「プログラミング入門者に向いている言語」は、言語仕様だけでは決まりません。良いドキュメントや書籍があるか、参考になる品質の良いソースコードがたくさんあるか、助けになってくれるコミュニティがあるか、開発環境を整えるのが簡単か……など、言語そのもの以外の部分も非常に重要です。
その点において、VB.NETが入門者に勧められる豊かな環境かは、甚だ疑問です。

かつては、C#とVB.NETのコードサンプルを両方載せている解説サイトがたくさんありました。しかし十数年の間にVB.NETの解説は減少し、いまやMicrosoft公式のドキュメントすらC#のみになってきています。書籍やOSSプロジェクトの数もまるで比較になりません。
そして2020年3月の発表により、この傾向はもはや変わることがないと確定したと言えるでしょう。
.NET基盤のおかげでC#向けの情報を翻訳しながら学習することも可能ですが、それなら最初からC#を学習した方が早いです。

言語仕様がどうかは別にしても、少なくともこの環境は「入門者向け」とは言えないと思います。
Mac初心者のGoインストール

Goを使ってみたいと思ったのだ。

# 環境

- MacBook Air (M1, 2020)
- macOS Big Sur 11.3.1
- zsh

# 制約

M1 Macがネイティブサポートされた、go version 1.6以降を入れたい

# goenvのインストール

Homebrewでインストールしたら最新のGoはサポートされていないようだったので、公式のgitからインストールする。

基本は公式のインストール手順に従う。

https://github.com/syndbg/goenv/blob/master/INSTALL.md

goenvのclone

```
% git clone https://github.com/syndbg/goenv.git ~/.goenv
```

環境変数の設定

```
% echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.zshrc
% echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.zshrc
% echo 'eval "$(goenv init -)"' >> ~/.zshrc
% echo 'export PATH="$GOROOT/bin:$PATH"' >> ~/.zshrc
% echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.zshrc
```
シェルを立ち上げ直して環境変数を適用する

```
% exec $SHELL
```

# goのインストール

```
% goenv install --list
% goenv install 1.16.3
% goenv global 1.16.3
% goenv rehash
```

```
% go version  
go version go1.16.3 darwin/arm64
```

# 備忘録

goenvをupgradeするときはgit pullする

```
$ cd ~/.goenv
$ git pull
```
[メモ] 'electron-builder' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。

Macで作ったElectronプロジェクトをWindowsでgit cloneして、PowerShellで`yarn install`して以下のエラーになったときはDOSプロンプトで試すか、プロジェクトフォルダーを大文字小文字を区別しない設定に変更する。

```
> yarn install
yarn install v1.22.4
info No lockfile found.
[1/4] Resolving packages...
＜省略＞
[4/4] Building fresh packages...
success Saved lockfile.
$ electron-builder install-app-deps
'electron-builder' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
```

### 大文字小文字を区別しないフォルダにする方法
管理者権限でPowershellを起動。
`fsutil.exe file SetCaseSensitiveInfo プロジェクトフォルダのパス disable`

詳しくはこちら：　https://qiita.com/bananacoffee/items/0352591a1a7e1a1cb71e
ボタンを長押しでプレイヤーを右に移動

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RightButton : MonoBehaviour {
    public float speed = 3;
    bool push = false;

    public void Update(){
        if(push){
            Move();
        }
    }

    public void PushDown(){
        push = true;
    }

    public void PushUp(){
        push = false;
    }

    public void Move(){
        Vector2 direction = new Vector2 (1.0f, 0).normalized;
        GetComponent<Rigidbody2D>().velocity = direction * speed;
    }
}

ゲームオブジェクトにアタッチ後、ボタンに設置
SF365: salesforce mobile app.  

SF365: Salesforce Android app

特徴:
- オブジェクトの管理.
- Visualforce Appの実行.
- レポートをサポート
- ファイル管理: 簡単に写真/ファイルをアップロード.
- システムAPI制限リスト.
- アップルマップ/グーグルマップをサポート.
- 本番/FullSand/Sandbox/Dxスクラッチ/デベロッパー環境をサポート.

download link 
https://play.google.com/store/apps/details?id=com.sf365.app



![Screenshot_20210514-093510_DuckDuckGo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297793/060e1651-06e8-4adf-6762-b1b0987179b9.jpeg)

![Screenshot_20210514-093854_SF365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297793/01692b31-0451-93d0-6e5f-e01d2dd17abd.jpeg)




![Screenshot_20210514-093843_SF365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297793/6a7898a8-51da-b91a-4623-c97ef2bc2dd4.jpeg)


![Screenshot_20210426-190735_SF365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297793/512de9a1-f935-01bc-6c44-58c09f967bc9.jpeg)


![Screenshot_20210426-190439_SF365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297793/5e55505f-8407-5500-4300-651cea40ccd3.jpeg)

![Screenshot_20210426-190413_SF365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297793/5ad70f8c-5b11-a2e1-702e-cf330295cfd3.jpeg)
Laravelで <textarea>の先頭にスペースが出てくる

ローカルで開発中地味に改善するのに困ったのでメモ

#実装したいもの
・自己紹介に入力した内容を修正したい

このように書いていました。

```edit.blade.php
<textarea>
    {{ old($profile) ?? $profile->text }}
</textarea>
```

![スクリーンショット 2021-05-14 21.12.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276481/70019a9f-791c-e838-601d-14db308dacdd.png)

このように先頭に変なスペースが出てきます。

#改善方法
・一行で書く。

たったこれだけでした。

```edit.blade.php
<textarea>{{ old($profile) ?? $profile->text }}</textarea>
```

![スクリーンショット 2021-05-14 21.12.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276481/aa5e0503-54d3-ed4f-381d-08d2ebc796e7.png)

フロントをまだ使いこなせていないのでメモしていきます。
Lottie-iosの基本的な実装の仕方の備忘録[Xcode/Storyboard]

ライブラリを使ってLottieを簡単に実装してみたのでアウトプットしようと思います

#環境
・Mac Book Pro(macOS:BigSur)
・Xcode(ver:12.5)

#実装例
![Unknown.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864623/5afef77d-819d-33dc-9958-6ba961907df0.gif)

#LottieのJSONをとってくるサイト
https://airbnb.design/introducing-lottie/

#コード例
```ruby:ViewController.swift
  import UIKit
import Lottie

class ViewController: UIViewController {

    
    @IBOutlet weak var backView: UIView!
    @IBOutlet weak var animationView: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let aniView = AnimationView()
        let animation = Animation.named("2") 
        aniView.frame = animationView.bounds
        aniView.animation = animation
        aniView.contentMode = .scaleAspectFit
        aniView.loopMode = .loop　"ループさせる"
        aniView.play()
        animationView.addSubview(aniView)　"Viewに追加"
        
        backView.layer.backgroundColor = UIColor.darkGray.cgColor
        backView.alpha = 0.45
    }
}
```
新しいホストをknown_hostsに追加する

# はじめに
忘れないようにメモ。
ホスト側Ubuntuをアップデートした際にリモートでMacからsshでアクセスする際、以下のような警告がでた。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:-----------------------------------.
Please contact your system administrator.
Add correct host key in /Users/------/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/------/.ssh/known_hosts:43
ECDSA host key for -------------------- has changed and you have requested strict checking.
Host key verification failed.
```

# 解決策
リモートの情報が変わってしまったので、古い情報は`known_hosts`から消して、新しい情報を加えれば良さそう。
`[]`の部分を自分の場合に置き換えて実行。
例：`hostname = "HOST"` の場合、`ssh-keygen -R "HOST"`みたいな感じで

まずは古い情報を削除

```
ssh-keygen -R [hostname]
ssh-keygen -R [ip_address]
ssh-keygen -R [hostname],[ip_address]
```
> -R hostname 
Removes all keys belonging to hostname from a known_hosts file. This option is useful to delete hashed hosts (see the -H option above).

https://linux.die.net/man/1/ssh-keygen より
その後新しい情報を加えれば大丈夫そう。

```
ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts
```


# 参考
https://linux.die.net/man/1/ssh-keygen

http://www.koganemaru.co.jp/cgi-bin/mroff.cgi?sect=1&cmd=&lc=1&subdir=man&dir=jpman-11.3.2%2Fman&subdir=man&man=ssh-keyscan

https://qiita.com/songfei1983/items/d2f543697e6eb777323c