<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>プログラミング - shungo blog</title>
	<atom:link href="https://shungoblog.com/tag/programming/feed" rel="self" type="application/rss+xml" />
	<link>https://shungoblog.com</link>
	<description>しゅんごブログ</description>
	<lastBuildDate>Fri, 02 May 2025 11:21:21 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://shungoblog.com/wp-content/uploads/2022/04/cropped-IMG_0718-32x32.jpg</url>
	<title>プログラミング - shungo blog</title>
	<link>https://shungoblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://shungoblog.com/tag/programming/feed"/>
	<item>
		<title>【Expo】eas build &#8211;platform iosでRun fastlaneがエラーになる</title>
		<link>https://shungoblog.com/programming/expo-eas-build-platform-ios-fastlane.html</link>
					<comments>https://shungoblog.com/programming/expo-eas-build-platform-ios-fastlane.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Fri, 28 Apr 2023 05:40:11 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[expo]]></category>
		<category><![CDATA[react-native]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=2480</guid>

					<description><![CDATA[<p>&#160; 目次 はじめにエラー内容エラーが発生したときの状況解決方法 (ライブラリのバージョンを更新)原因の特定方法まとめ はじめに React Nativeでアプリを開発している際、Expoを使用してeas bui [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/expo-eas-build-platform-ios-fastlane.html">【Expo】eas build –platform iosでRun fastlaneがエラーになる</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a><ol><li><a href="#toc2" tabindex="0">エラー内容</a></li><li><a href="#toc3" tabindex="0">エラーが発生したときの状況</a></li></ol></li><li><a href="#toc4" tabindex="0">解決方法 (ライブラリのバージョンを更新)</a></li><li><a href="#toc5" tabindex="0">原因の特定方法</a></li><li><a href="#toc6" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p><span>React Nativeでアプリを開発している際、</span><span>Expoを使用して<code>eas build --platform ios</code>コマンドを実行したところ、</span></p>
<p><span>下記のように</span><span>Run fastlaneがエラーが出る場合がないでしょうか？</span></p>
<p>この記事ではその時の対処法をご紹介します！</p>
<p><img fetchpriority="high" decoding="async" src="https://shungoblog.com/wp-content/uploads/2023/04/スクリーンショット-2023-04-28-11.26.38-300x152.png" alt="expo" width="589" height="298" class="wp-image-2484 aligncenter" srcset="https://shungoblog.com/wp-content/uploads/2023/04/スクリーンショット-2023-04-28-11.26.38-300x152.png 300w, https://shungoblog.com/wp-content/uploads/2023/04/スクリーンショット-2023-04-28-11.26.38-768x388.png 768w, https://shungoblog.com/wp-content/uploads/2023/04/スクリーンショット-2023-04-28-11.26.38.png 829w" sizes="(max-width: 589px) 100vw, 589px" /></p>
<h3><span id="toc2">エラー内容</span></h3>
<p><span><code>eas build --platform ios</code>を実行したときのエラー文です。</span></p>
<p>Run fastlaneの部分でエラーが発生しているようです。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-plain" data-lang="Plain Text"><code><span>Build failed: The "Run fastlane" step failed with an unknown error. Refer to "Xcode Logs" below for additional, more detailed logs.</span></code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc3">エラーが発生したときの状況</span></h3>
<ul>
<li>Expoのバージョンを45 =&gt; 47にアップデートしたときにiosのbuildでエラーが発生した</li>
<li>androidの方はbuildできる</li>
<li>
<div>
<div><span>expo start でアプリは問題なく起動する</span></div>
<div></div>
</div>
</li>
</ul>
<h2><span id="toc4">解決方法 (ライブラリのバージョンを更新)</span></h2>
<div>私のプロジェクトの場合は、</div>
<div class="pr-1 flex-auto min-width-0"><code>@config-plugins/react-native-branch</code>のバージョンを2.0.0 =&gt; 最新の5.0.0にアップデートすることで解決しました！</div>
<div></div>
<div>下記は最新のバージョンに更新するときの実行コマンドです。</div>
<div>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-plain" data-lang="Plain Text">% expo install @config-plugins/react-native-branch</pre>
</div>
</div>
<p>&nbsp;</p>
<h2><span id="toc5">原因の特定方法</span></h2>
<p>ExpoにログインしてiOS App Store buildの画面を開きます。</p>
<p>下の方にRun fastlaneの項目があるのでクリックして詳細を開きます。</p>
<p><img decoding="async" src="https://shungoblog.com/wp-content/uploads/2023/04/スクリーンショット-2023-04-28-11.15.41-300x291.png" alt="expo" width="579" height="561" class="alignnone wp-image-2482" srcset="https://shungoblog.com/wp-content/uploads/2023/04/スクリーンショット-2023-04-28-11.15.41-300x291.png 300w, https://shungoblog.com/wp-content/uploads/2023/04/スクリーンショット-2023-04-28-11.15.41-768x744.png 768w, https://shungoblog.com/wp-content/uploads/2023/04/スクリーンショット-2023-04-28-11.15.41.png 853w" sizes="(max-width: 579px) 100vw, 579px" /></p>
<p>スクロールして中身を確認すると&#x274c;と表示されてエラーになっている部分があるので付近を確認すると<code>@config-plugins/react-native-branch</code>のライブラリあたりでエラーが出ていることが確認できます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-plain" data-lang="Plain Text"><code>› Compiling @config-plugins/react-native-branch Pods/ExpoAdapterBranch » BranchAppDelegate.swift

&#x274c;  (node_modules/@config-plugins/react-native-branch/ios/ExpoAdapterBranch/BranchAppDelegate.swift:1:8)

&gt; 1 | import ExpoModulesCore
    |        ^ compiling for iOS 12.0, but module 'ExpoModulesCore' has a minimum deployment target of iOS 13.0: /Users/expo/Library/Developer/Xcode/DerivedData/IT-hfhagyzjhtdmvbfuwgocyplvlpbf/Build/Intermediates.noindex/ArchiveIntermediates/IT/BuildProductsPath/Release-iphoneos/ExpoModulesCore/ExpoModulesCore.swiftmodule/arm64-apple-ios.swiftmodule
  2 | import RNBranch
  3 | 
  4 | public class BranchAppDelegate: ExpoAppDelegateSubscriber {</code></pre>
</div>
<p>そのため、<code>@config-plugins/react-native-branch</code>のバージョンが適切でないと仮定して、ライブラリのバージョンを最新に更新したら、無事にbuildが成功しました！</p>
<p>&nbsp;</p>
<h2><span id="toc6">まとめ</span></h2>
<p>いろいろ記事を検索したり、issueを見たりしてみましたが、自分のプロジェクトに当てはまる解決方法が見つかりませんでした。</p>
<p>しかし、Expoの管理画面で実際のエラー内容をよく見てみると原因となっているライブラリを特定することができました。</p>
<p>&nbsp;</p><p>The post <a href="https://shungoblog.com/programming/expo-eas-build-platform-ios-fastlane.html">【Expo】eas build –platform iosでRun fastlaneがエラーになる</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/expo-eas-build-platform-ios-fastlane.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Rails】文字列をBooleanに変換する方法 (ActiveRecord::Type::Boolean.new.cast)</title>
		<link>https://shungoblog.com/programming/rails-string-to-boolean-cast.html</link>
					<comments>https://shungoblog.com/programming/rails-string-to-boolean-cast.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Tue, 14 Mar 2023 00:29:45 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[エンジニア]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=2116</guid>

					<description><![CDATA[<p>目次 はじめにActiveRecord::Type::Boolean.new.castで変換するコードの定義についてよく使用する変換例メソッドで定義して使い回す方法クラスメソッドで定義するStringクラスのメソッドとし [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/rails-string-to-boolean-cast.html">【Rails】文字列をBooleanに変換する方法 (ActiveRecord::Type::Boolean.new.cast)</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">ActiveRecord::Type::Boolean.new.castで変換する</a></li><li><a href="#toc3" tabindex="0">コードの定義について</a></li><li><a href="#toc4" tabindex="0">よく使用する変換例</a></li><li><a href="#toc5" tabindex="0">メソッドで定義して使い回す方法</a><ol><li><a href="#toc6" tabindex="0">クラスメソッドで定義する</a></li><li><a href="#toc7" tabindex="0">Stringクラスのメソッドとして定義する</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>Rubyではboolean判定するには少し工夫が必要です。</p>
<p>自作でメソッドを定義することも可能ですが、<strong>ActiveRecord</strong>に便利なメソッドがあるので、</p>
<p>それを用いてBooleanに変換する方法をご紹介します。</p>
<p>&nbsp;</p>
<h2><span id="toc2"><span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Type</span><span class="o">::</span><span class="no">Boolean</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">castで変換する</span></span></h2>
<p>下記のようにActiveRecordのメソッドを使用することで</p>
<p>文字列をBooleanに変換することができます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>ActiveRecord::Type::Boolean.new.cast('true') # =&gt; true
ActiveRecord::Type::Boolean.new.cast('false') # =&gt; false
</code></pre>
</div>
<p>&nbsp;</p>
<h2><span id="toc3">コードの定義について</span></h2>
<p>変換するメソッドは下記で定義されています。</p>
<p><a rel="nofollow noopener external" target="_blank" href="https://github.com/rails/rails/blob/61fb58f6a7f852d765d616d1da41d17851ec7afc/activemodel/lib/active_model/type/boolean.rb"><span>rails/activemodel/lib/active_model/type/boolean.rb</span></a></p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>module ActiveModel
  module Type

    ...
    class Boolean &lt; Value
      FALSE_VALUES = [
        false, 0,
        "0", :"0",
        "f", :f,
        "F", :F,
        "false", :false,
        "FALSE", :FALSE,
        "off", :off,
        "OFF", :OFF,
      ].to_set.freeze

      ...
      private
        def cast_value(value)
          if value == ""
            nil
          else
            !FALSE_VALUES.include?(value)
          end
        end
    end
  end
end</code></pre>
</div>
<p>大まかな処理の流れは下記の通りです。</p>
<ol>
<li>valueが空文字&#8221;&#8221; =&gt; nil</li>
<li>valueが<code>FALSE_VALUES</code>に含まれる値 =&gt; false</li>
<li>上記でない =&gt; true<code></code></li>
</ol>
<p>&nbsp;</p>
<h2><span id="toc4">よく使用する変換例</span></h2>
<p><strong>&#8216;true&#8217;</strong>や<strong>&#8216;false&#8217;</strong>以外にもよく使用するであろう値の変換結果を載せておきます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>ActiveRecord::Type::Boolean.new.cast('0') # =&gt; false
ActiveRecord::Type::Boolean.new.cast(0) # =&gt; false
ActiveRecord::Type::Boolean.new.cast('false') # =&gt; false
ActiveRecord::Type::Boolean.new.cast("FALSE") # =&gt; false
ActiveRecord::Type::Boolean.new.cast("off") # =&gt; false
ActiveRecord::Type::Boolean.new.cast("OFF") # =&gt; false

ActiveRecord::Type::Boolean.new.cast('1') # =&gt; true
ActiveRecord::Type::Boolean.new.cast(1) # =&gt; true
ActiveRecord::Type::Boolean.new.cast('true') # =&gt; true
ActiveRecord::Type::Boolean.new.cast('TRUE') # =&gt; true
ActiveRecord::Type::Boolean.new.cast('on') # =&gt; true
ActiveRecord::Type::Boolean.new.cast('ON') # =&gt; true

ActiveRecord::Type::Boolean.new.cast('') # =&gt; nil
ActiveRecord::Type::Boolean.new.cast(nil) # =&gt; nil
</code></pre>
</div>
<p>&nbsp;</p>
<h2><span id="toc5">メソッドで定義して使い回す方法</span></h2>
<p>下記のようにクラスメソッドで定義すれば、かなり使いやすくなるのでオススメです！！</p>
<h3><span id="toc6">クラスメソッドで定義する</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>class Utility
  def self.to_bool(value)
    ActiveRecord::Type::Boolean.new.cast(value)
  end
end

&gt; Utility.to_bool('true')
true</code></pre>
</div>
<h3><span id="toc7">Stringクラスのメソッドとして定義する</span></h3>
<p>下記にようにStringクラスで定義すれば、文字列全体に適用可能です。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>class String
  def to_bool
    ActiveRecord::Type::Boolean.new.cast(self)
  end
end

&gt; 'true'.to_bool
true</code></pre>
</div><p>The post <a href="https://shungoblog.com/programming/rails-string-to-boolean-cast.html">【Rails】文字列をBooleanに変換する方法 (ActiveRecord::Type::Boolean.new.cast)</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/rails-string-to-boolean-cast.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Ruby】 クラスメソッドからプライベートメソッドを呼ぶ方法</title>
		<link>https://shungoblog.com/programming/ruby-class-and-private-method.html</link>
					<comments>https://shungoblog.com/programming/ruby-class-and-private-method.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Sun, 12 Mar 2023 12:59:01 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[エンジニア]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=2105</guid>

					<description><![CDATA[<p>目次 はじめにNGなパターン1. クラスメソッドからプライベートメソッドを呼ぶ2. private内でself.methodを定義するクラスメソッドからプライベートメソッドを呼ぶ書き方 はじめに Rubyでクラスメソッド [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/ruby-class-and-private-method.html">【Ruby】 クラスメソッドからプライベートメソッドを呼ぶ方法</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">NGなパターン</a><ol><li><a href="#toc3" tabindex="0">1. クラスメソッドからプライベートメソッドを呼ぶ</a></li><li><a href="#toc4" tabindex="0">2. private内でself.methodを定義する</a></li></ol></li><li><a href="#toc5" tabindex="0">クラスメソッドからプライベートメソッドを呼ぶ書き方</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>Rubyでクラスメソッド内からprivateメソッドを呼び出したときに、</p>
<p>エラーが発生したのでそのときの対処法をご紹介します。</p>
<p>&nbsp;</p>
<h2><span id="toc2">NGなパターン</span></h2>
<h3><span id="toc3">1. クラスメソッドからプライベートメソッドを呼ぶ</span></h3>
<p>私が最初に書いたエラーになるパターンのコードです。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>class Sample1
  def self.foo
    bar
  end

  private

    def bar
      puts 'bar'
    end
end

&gt; Sample1.foo
Traceback (most recent call last):
1: from test.rb:13:in `&lt;main&gt;'
test.rb:3:in `foo': undefined local variable or method `bar' for Sample1:Class (NameError)</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc4">2. private内でself.methodを定義する</span></h3>
<p>こちらの場合は、エラーなく実行できますが、</p>
<p>privateメソッドを直接呼び出せてしまっているのでNGですね。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>class Sample1
  def self.foo
    bar
  end

  private

    def self.bar
      puts 'bar'
    end
end

// エラーなく実行できる
&gt; Sample1.foo
bar

// privateメソッドを呼べている
&gt; Sample1.bar
bar</code></pre>
</div>
<p>&nbsp;</p>
<h2><span id="toc5">クラスメソッドからプライベートメソッドを呼ぶ書き方</span></h2>
<p>特異クラス内でprivateを定義すれば、</p>
<p>クラスメソッドからプライベートメソッドを呼ぶことが可能になります。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>class Sample2
  class &lt;&lt; self # クラスメソッドで定義
    def foo
      bar
    end

    private

      def bar # クラスメソッド内でprivateメソッドを定義する
        puts 'bar'
      end
  end
end

&gt; Sample2.foo
bar</code></pre>
</div>
<p>最初のように<code>def sefl.method end</code>の書き方に合わせるなら</p>
<p>下記のようになります。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>class Sample2
  def self.foo # クラスメソッドで定義
    bar
  end
  class &lt;&lt; self

    private

      def bar # 特異クラス内でprivateメソッドを定義する
        puts 'bar'
      end
  end
end

&gt; Sample2.foo
bar</code></pre>
</div><p>The post <a href="https://shungoblog.com/programming/ruby-class-and-private-method.html">【Ruby】 クラスメソッドからプライベートメソッドを呼ぶ方法</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/ruby-class-and-private-method.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Go】 import cycle not allowed (循環参照)について</title>
		<link>https://shungoblog.com/programming/go-import-cycle-not-allowed.html</link>
					<comments>https://shungoblog.com/programming/go-import-cycle-not-allowed.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Thu, 23 Feb 2023 13:57:43 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[go]]></category>
		<category><![CDATA[エンジニア]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=1985</guid>

					<description><![CDATA[<p>目次 import cycle not allowed (循環参照とは？)循環参照が起こるコード例ファイル構成go.modmain.goa.gob.gomain.goを実行してみる循環参照の対策方法 import cyc [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/go-import-cycle-not-allowed.html">【Go】 import cycle not allowed (循環参照)について</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">import cycle not allowed (循環参照とは？)</a></li><li><a href="#toc2" tabindex="0">循環参照が起こるコード例</a><ol><li><a href="#toc3" tabindex="0">ファイル構成</a></li><li><a href="#toc4" tabindex="0">go.mod</a></li><li><a href="#toc5" tabindex="0">main.go</a></li><li><a href="#toc6" tabindex="0">a.go</a></li><li><a href="#toc7" tabindex="0">b.go</a></li></ol></li><li><a href="#toc8" tabindex="0">main.goを実行してみる</a></li><li><a href="#toc9" tabindex="0">循環参照の対策方法</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">import cycle not allowed (循環参照とは？)</span></h2>
<p><span>他のpackageにimportしたときに、こんなエラーが出た人はいるんではないでしょうか？</span></p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-bash" data-lang="Bash"><code>import cycle not allowed</code></pre>
</div>
<p>このエラーは循環参照が起きているときの吐かれるエラーです。</p>
<p>&nbsp;</p>
<p>たとえばpackage aとbがあった場合に、</p>
<ul>
<li><strong>package aでbの関数やメソッドを参照している</strong></li>
<li><strong>package bでもaの関数やメソッドを参照している</strong></li>
</ul>
<p>と循環参照していることになり、<code>import cycle not allowed</code>というエラーが出てしまいます。</p>
<p>&nbsp;</p>
<h2><span id="toc2">循環参照が起こるコード例</span></h2>
<p>循環参照が発生する具体的なコードを書いてみます。</p>
<h3><span id="toc3">ファイル構成</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-plain" data-lang=""><code>./app
├─ a/a.go
├─ b/b.go
├─ main.go
└─ go.mod</code></pre>
</div>
<h3><span id="toc4">go.mod</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-go" data-lang="go.mod"><code>module app

go 1.19</code></pre>
</div>
<h3><span id="toc5">main.go</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-go" data-lang="main.go"><code>package main

import (
  "app/a"
)

func main() {
  a.CallB()
}
</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc6">a.go</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-go" data-lang="a.go"><code>package a

import (
  "fmt"
  "app/b"
)

func PrintA() {
  fmt.Println("A")
}

func CallB() {
  b.PrintB()
}</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc7">b.go</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-go" data-lang="b.go"><code>package b

import (
  "fmt"
  "app/a"
)

func PrintB() {
  fmt.Println("B")
}

func CallA() {
  a.PrintA()
}</code></pre>
</div>
<h2><span id="toc8">main.goを実行してみる</span></h2>
<p>この状態で<code>main.go</code>を実行すると<code>import cycle not allowed</code>のエラーが出ます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-bash" data-lang="Bash"><code>% go run main.go
package command-line-arguments
        imports app/a
        imports app/b
        imports app/a: import cycle not allowed</code></pre>
</div>
<h2><span id="toc9">循環参照の対策方法</span></h2>
<p>&nbsp;</p>
<p>循環参照が起きないようにするには主に下記の方法があるようです。</p>
<ul>
<li><strong>ファイル構成を変更する</strong></li>
<li><strong>interfaceを使う</strong></li>
<li><strong>同じpackageにまとめる</strong></li>
</ul>
<p>それぞれの具体的な実装例はまた別の記事で紹介しようと思います。</p><p>The post <a href="https://shungoblog.com/programming/go-import-cycle-not-allowed.html">【Go】 import cycle not allowed (循環参照)について</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/go-import-cycle-not-allowed.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【JavaScript】CSVファイルをインポートする方法</title>
		<link>https://shungoblog.com/programming/javascript-csv-import.html</link>
					<comments>https://shungoblog.com/programming/javascript-csv-import.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Wed, 23 Nov 2022 11:44:26 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=1644</guid>

					<description><![CDATA[<p>&#160; 目次 はじめにCSVファイルをインポートするコードコピペでOK!!コードの説明 はじめに この記事では、JavascriptでCSVファイルをインポートする方法をご紹介します。 試しに下記のボタンを押してC [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/javascript-csv-import.html">【JavaScript】CSVファイルをインポートする方法</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">CSVファイルをインポートするコード</a><ol><li><a href="#toc3" tabindex="0">コピペでOK!!</a></li><li><a href="#toc4" tabindex="0">コードの説明</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>この記事では、JavascriptでCSVファイルをインポートする方法をご紹介します。</p>
<p>試しに下記のボタンを押してCSVファイルをインポートしてみてください！</p>
<p>イメージしやすいように、CSVデータをpタグで表示するようにしています。</p>
<p class="codepen" data-height="496.273681640625" data-default-tab="html,result" data-slug-hash="poKLNrX" data-user="shungo0525" style="height: 496.273681640625px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;"><span>See the Pen <a rel="nofollow noopener external" target="_blank" href="https://codepen.io/shungo0525/pen/poKLNrX"><br />
CSV import</a> by Shungo Matsumura (<a rel="nofollow noopener external" target="_blank" href="https://codepen.io/shungo0525">@shungo0525</a>)<br />
on <a rel="nofollow noopener external" target="_blank" href="https://codepen.io">CodePen</a>.</span></p>
<p><script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><span id="toc2">CSVファイルをインポートするコード</span></h2>
<h3><span id="toc3">コピペでOK!!</span></h3>
<p>index.html</p>
<pre>&lt;!-- CSVデータをインポートする部分 --&gt;
&lt;input type="file" name="csv_import" accept="csv" id="upload-file"&gt;

&lt;!-- CSVデータを表示する部分 --&gt;
&lt;div id='csv_data'&gt;&lt;/div&gt;</pre>
<p>&nbsp;</p>
<p>sample.js</p>
<pre>const input = document.getElementById('upload-file');
// NOTE: uploadされたら検知する
input.addEventListener('change', (e) =&gt; {
  const reader = new FileReader();
  // NOTE: fileを文字列として読み込む
  reader.readAsText(e.target.files[0]);
  const csv_data = document.getElementById("csv_data");

  reader.onload = function(event) {
    result = event.target.result;
    // CSVデータを整形
    result = result.replace(/\r\n|\n|\r/g, ',').replace(/ /g, '').split(',');
    // CSVデータを出力
    result.forEach((item) =&gt; {
      // CSVデータをpタグで表示
      const p = document.createElement("p");
      p.textContent = item;
      csv_data.appendChild(p);
    })
  };
});</pre>
<p>&nbsp;</p>
<h3><span id="toc4">コードの説明</span></h3>
<h4>getElementById</h4>
<p>指定されたidの要素を取得します。</p>
<p>今回で言うとid=&#8221;upload-file”のinputタグを取得しています。</p>
<h4>addEventListener</h4>
<p>マウスによるクリックやキーボードからの入力などのイベント処理を実行するメソッドです。</p>
<p>&#8216;change&#8217;を指定しているので、inputタグに変更があれば、関数が実行されます。</p>
<h4>readAsText</h4>
<p>FileReaderで読み込んだCSVファイルを文字列として読みとります。</p><p>The post <a href="https://shungoblog.com/programming/javascript-csv-import.html">【JavaScript】CSVファイルをインポートする方法</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/javascript-csv-import.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQLの基本構文一覧</title>
		<link>https://shungoblog.com/programming/sql-basic-syntax.html</link>
					<comments>https://shungoblog.com/programming/sql-basic-syntax.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Mon, 07 Nov 2022 11:59:46 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[mysql]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=1604</guid>

					<description><![CDATA[<p>目次 はじめにSQL 基本構文一覧データベース作成 (create database)テーブル作成 (create table)テーブル削除 (drop table)データ挿入 (insert)データ更新 (update [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/sql-basic-syntax.html">SQLの基本構文一覧</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">SQL 基本構文一覧</a><ol><li><a href="#toc3" tabindex="0">データベース作成 (create database)</a></li><li><a href="#toc4" tabindex="0">テーブル作成 (create table)</a></li><li><a href="#toc5" tabindex="0">テーブル削除 (drop table)</a></li><li><a href="#toc6" tabindex="0">データ挿入 (insert)</a></li><li><a href="#toc7" tabindex="0">データ更新 (update)</a></li><li><a href="#toc8" tabindex="0">データ削除 (delete)</a></li><li><a href="#toc9" tabindex="0">データ検索 (select)</a></li><li><a href="#toc10" tabindex="0">テーブル構造確認(describe)</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p class="wp-block-paragraph">SQLでデータを触るときに必ず使う、基本的な構文をまとめてみました。</p>
<p>もしdockerでsequel proに接続したい方は下記の記事を参考にしてみてください！</p>
<p>&nbsp;</p>
<div class="blogcard-type bct-together">

<a target="_blank" href="https://shungoblog.com/docker-mysql-sequel-pro/" title="DockerのMySQLコンテナにSequel proで接続する方法" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://shungoblog.com/wp-content/uploads/cocoon-resources/blog-card-cache/5411650c615ce76a29cab44447468719.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">DockerのMySQLコンテナにSequel proで接続する方法</div><div class="blogcard-snippet external-blogcard-snippet">docker composeで起動したのMySQLコンテナにSequel proで接続する方法をご紹介します。またSequelを使用せず、コマンドでMySQLコンテナに接続する方法もご説明します。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shungoblog.com/programming/docker-mysql-sequel-pro.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">shungoblog.com</div></div></div></div></a>
</div>
<h2><span id="toc2">SQL 基本構文一覧</span></h2>
<h3><span id="toc3">データベース作成 (create database)</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>create database [db_name];</code></pre>
</div>
<p>&nbsp;</p>
<p>ex) developmentというデータベースを作成</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>create database development;</code></pre>
</div>
<h3><span id="toc4">テーブル作成 (create table)</span></h3>
<p>&nbsp;</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>create table if not exists [table_name] (
  [column_name] [column_type],
  ...
);</code></pre>
</div>
<p>&nbsp;</p>
<p>ex) userテーブルを作成</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>create table if not exists user (
  id int,
  name varchar(10),
  primary key (id)
);</code></pre>
</div>



<h3><span id="toc5">テーブル削除 (drop table)</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>drop table [table_name];</code></pre>
</div>
<p class="wp-block-paragraph">&nbsp;</p>
<p>ex) userテーブルを削除</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>drop table user;</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc6">データ挿入 (insert)</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>insert into [table_name]
values ([value1], [value2], ...);</code></pre>
</div>
<p>&nbsp;</p>
<p>ex) userテーブルにデータを挿入</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>insert into user
values (1, 'name-1');</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc7">データ更新 (update)</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>update [table_name]
set [column_name] = [value]
[where where_condition];</code></pre>
</div>
<p>&nbsp;</p>
<p>ex) id=1のデータを更新</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>update user
set name = 'name-2'
where id = 1;</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc8">データ削除 (delete)</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>delete from [table_name]
[WHERE where_condition];</code></pre>
</div>
<p>&nbsp;</p>
<p>ex) id=1のデータを削除</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-json" data-lang="JSON"><code>delete from user
where id = 1;</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc9">データ検索 (select)</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>select [column_name1], [column_name2], ... from [table_name]
[WHERE where_condition];</code></pre>
</div>
<p>ex) userテーブルにデータを挿入</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>select id, name from user
where id = 1;</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc10">テーブル構造確認(describe)</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>describe table [table_name];</code></pre>
</div>
<p>&nbsp;</p>
<p>ex) userテーブルの構造を確認</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>describe table user;</code></pre>
</div>
<p>下記のようなテーブル構造が出力されます。</p>
<p><img loading="lazy" decoding="async" src="https://shungoblog.com/wp-content/uploads/2022/11/スクリーンショット-2022-11-07-20.51.14-300x88.png" alt="sql-describe" width="556" height="163" class="alignnone  wp-image-1618" srcset="https://shungoblog.com/wp-content/uploads/2022/11/スクリーンショット-2022-11-07-20.51.14-300x88.png 300w, https://shungoblog.com/wp-content/uploads/2022/11/スクリーンショット-2022-11-07-20.51.14-768x226.png 768w, https://shungoblog.com/wp-content/uploads/2022/11/スクリーンショット-2022-11-07-20.51.14.png 776w" sizes="(max-width: 556px) 100vw, 556px" /></p>
<p>&nbsp;</p><p>The post <a href="https://shungoblog.com/programming/sql-basic-syntax.html">SQLの基本構文一覧</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/sql-basic-syntax.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【MySQL】WHERE INに空のリストを入れるとエラーになる</title>
		<link>https://shungoblog.com/programming/mysql-where-in-error.html</link>
					<comments>https://shungoblog.com/programming/mysql-where-in-error.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Sun, 30 Oct 2022 14:16:42 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[mysql]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=1589</guid>

					<description><![CDATA[<p>目次 はじめにwhere inで文法エラーを出さない方法OKパターンNGパターンフレームワークでwhere inを使う時は注意が必要FuelPHPの場合 はじめに MySQLのwhere inに空のリスト()を入れると下 [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/mysql-where-in-error.html">【MySQL】WHERE INに空のリストを入れるとエラーになる</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">where inで文法エラーを出さない方法</a><ol><li><a href="#toc3" tabindex="0">OKパターン</a></li><li><a href="#toc4" tabindex="0">NGパターン</a></li></ol></li><li><a href="#toc5" tabindex="0">フレームワークでwhere inを使う時は注意が必要</a><ol><li><a href="#toc6" tabindex="0">FuelPHPの場合</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>MySQLのwhere inに空のリスト()を入れると下記の文法エラーが出ます。</p>
<p>その場合の対処法をご紹介します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>mysql&gt; select * from users where id in ();
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1</code></pre>
</div>
<h1 class="entry-title"></h1>
<h2><span id="toc2">where inで文法エラーを出さない方法</span></h2>
<p>空のリストではなく、nullを入れることで文法エラーが解消されます。</p>
<h3><span id="toc3">OKパターン</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>mysql&gt; select * from users where id in (null);
Empty set (0.00 sec)</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc4">NGパターン</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>mysql&gt; select * from users where id in ();
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1<span style="background-color: #ffffff; color: #333333; font-family: var(--cocoon-default-font); font-size: 16px;"> </span></code></pre>
</div>
<p>&nbsp;</p>
<h2><span id="toc5">フレームワークでwhere inを使う時は注意が必要</span></h2>
<h3><span id="toc6">FuelPHPの場合</span></h3>
<p>MySQLを使っている場合は文法エラーにすぐに気づくことができますが、</p>
<p>フレームワークを使っているとMySQLの文法エラーに気づかないことがあります。</p>
<p>&nbsp;</p>
<p>例としてFuelPHPでuserを検索するための、コードで説明します。</p>
<p>$idsというリストで検索するときに、$idsが空()の場合、MySQLの文法エラーになります。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-php" data-lang="PHP"><code>$where = array(
  array('id', 'in', $ids)
);
$users = Model_User::find('all', compact("where"));</code></pre>
</div>
<p>そこで空のリストになり可能性がある場合は、三項演算子などでnullを入れてハンドリングすると文法エラーが発生することを防ぐことができます。</p>
<p>&nbsp;</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-php" data-lang="PHP"><code>$where = array(
  array('id', 'in', ($ids ? $ids : array(null)))
);
$users = Model_User::find('all', compact("where"));</code></pre>
</div>
<p>&nbsp;</p><p>The post <a href="https://shungoblog.com/programming/mysql-where-in-error.html">【MySQL】WHERE INに空のリストを入れるとエラーになる</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/mysql-where-in-error.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【CakePHP】 DBの接続先を環境ごとに切り替える方法</title>
		<link>https://shungoblog.com/programming/cakephp-change-db-per-environment.html</link>
					<comments>https://shungoblog.com/programming/cakephp-change-db-per-environment.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Mon, 10 Oct 2022 13:27:23 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[エンジニア]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=1548</guid>

					<description><![CDATA[<p>目次 はじめに接続するDBを動的に変更する方法コードコードの解説 はじめに ローカル、ステージング、本番などの環境があって、それぞれ異なるDBに接続する場合があると思います。 今回はホスト名を見て、動的に接続するDBを変 [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/cakephp-change-db-per-environment.html">【CakePHP】 DBの接続先を環境ごとに切り替える方法</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">接続するDBを動的に変更する方法</a><ol><li><a href="#toc3" tabindex="0">コード</a></li><li><a href="#toc4" tabindex="0">コードの解説</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>ローカル、ステージング、本番などの環境があって、それぞれ異なるDBに接続する場合があると思います。</p>
<p>今回はホスト名を見て、動的に接続するDBを変更する方法をご紹介します。</p>
<h2><span id="toc2">接続するDBを動的に変更する方法</span></h2>
</div>
<div>
<h3><span id="toc3">コード</span></h3>
<p><code>”app/Config/databas.php”</code>を下記のように変更することで動的に接続先を変更できます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-php" data-lang="app/Config/databas.php"><code>&lt;?php class DATABASE_CONFIG { 
  // ローカル環境
  public $default = array(
    'datasource' =&gt;'Database/Mysql',
    'persistent' =&gt;'false',
    'host' =&gt;'db_host',
    'login' =&gt;'user',
    'password' =&gt;'password',
    'database' =&gt;'database_name',
    'schema' =&gt;'public',
    'prefix' =&gt;'',
    'encoding' =&gt;'utf8'
  );

  // staging環境
  public $staging = array(
    'datasource' =&gt;'Database/Mysql',
    'persistent' =&gt;'false',
    'host' =&gt;'db_host',
    'login' =&gt;'user',
    'password' =&gt;'password',
    'database' =&gt;'database_name',
    'schema' =&gt;'public',
    'prefix' =&gt;'',
    'encoding' =&gt;'utf8'
  );

  // 本番環境
  public $production = array(
    'datasource' =&gt;'Database/Mysql',
    'persistent' =&gt;'false',
    'host' =&gt;'da_host',
    'login' =&gt;'user',
    'password' =&gt;'password',
    'database' =&gt;'database_name',
    'schema' =&gt;'public',
    'prefix' =&gt;'',
    'encoding' =&gt;'utf8'
  );

  // ドメインごとにDBを切り替え
  public function __construct() {
    switch (env('HTTP_HOST')) {
      case 'localhost':
        $this-&gt;default =$this-&gt;default;
        break;
      case 'staging.xxxx.jp':
        $this-&gt;default =$this-&gt;staging;
        break;
      case 'production.xxxx.jp':
        $this-&gt;default =$this-&gt;production;
        break;
    }
  }
}</code></pre>
</div>
</div>
<h3><span id="toc4">コードの解説</span></h3>
<p>ローカル環境(<code>”$default”</code>)、ステージング環境(<code>”$staging”</code>)、本番環境(<code>”$production”</code>)のDB接続情報をそれぞれ定義します。</p>
<p>動的に切り替えない場合は、常に<code>$default</code>が読み込まれます。</p>
<p>&nbsp;</p>
<p>動的に切り替えるために、コンストラクタ(<code>”<span>__construct”</span></code>)を使います。</p>
<p>コンストラクタは、新しいオブジェクトが生成されるたびに、このメソッドがコールされます。</p>
<p>そのため、オブジェクトを使用する際の初期化を行うことができます。</p>
<p>(参照: <a rel="nofollow noopener external" target="_blank" href="https://www.php.net/manual/ja/language.oop5.decon.php">コンストラクタとデストラクタ</a>)</p>
<p>&nbsp;</p>
<p>今回はホスト(<code>”<span>env</span><span>(</span><span>'HTTP_HOST'</span><span>)”</span></code>)で動的に切り替えるので、</p>
<p>ホストの値を見て、<code>”$default”</code>を</p>
<p>ローカル -&gt; <code>”$default”</code></p>
<p>ステージング -&gt; <code>”$staging”</code></p>
<p>本番 -&gt; <code>"$production”</code></p>
<p>に変更されるようにしています。</p>
<p>&nbsp;</p><p>The post <a href="https://shungoblog.com/programming/cakephp-change-db-per-environment.html">【CakePHP】 DBの接続先を環境ごとに切り替える方法</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/cakephp-change-db-per-environment.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Rails】resourceとresourcesの命名規則</title>
		<link>https://shungoblog.com/programming/rails_resource_resources.html</link>
					<comments>https://shungoblog.com/programming/rails_resource_resources.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Fri, 30 Sep 2022 11:39:00 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[エンジニア]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=1539</guid>

					<description><![CDATA[<p>目次 はじめに単数形resourceと複数形resourcesの命名規則命名規則一覧Railsガイドよりルーティング一覧 (/rails/info/routes)単数形resource複数形resources はじめに  [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/rails_resource_resources.html">【Rails】resourceとresourcesの命名規則</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">単数形resourceと複数形resourcesの命名規則</a><ol><li><a href="#toc3" tabindex="0">命名規則一覧</a></li><li><a href="#toc4" tabindex="0">Railsガイドより</a></li></ol></li><li><a href="#toc5" tabindex="0">ルーティング一覧 (/rails/info/routes)</a><ol><li><a href="#toc6" tabindex="0">単数形resource</a></li><li><a href="#toc7" tabindex="0">複数形resources</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>railsのルーティングを設定するときに、単数形resourceと複数形resourcesの命名規則にハマったのでまとめてみました。</p>
<p>例として下記のようなroutes.rbで紹介します。</p>
<pre class="highlight"><span class="no"># routes.rb

Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do
  resource :post
  resources :posts
</span>end</pre>
<h2><span id="toc2">単数形resourceと複数形resourcesの命名規則</span></h2>
<h3><span id="toc3">命名規則一覧</span></h3>
<p>それぞれの命名規則を下記の表にまとめました。</p>
<p>太字の部分がresourceとresourcesで異なる部分です。</p>
<div class="scrollable-table"><table style="border-collapse: collapse; width: 100%; height: 205px;">
<tbody>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;"></td>
<td style="width: 16.6667%; height: 41px;">resource</td>
<td style="width: 16.6667%; height: 41px;">resources</td>
</tr>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;">routes.rb</td>
<td style="width: 16.6667%; height: 41px;"><strong>resource :post</strong></td>
<td style="width: 16.6667%; height: 41px;"><strong>resources :posts</strong></td>
</tr>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;">ファイル名</td>
<td style="width: 16.6667%; height: 41px;">posts_controller.rb</td>
<td style="width: 16.6667%; height: 41px;">posts_controller.rb</td>
</tr>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;">コントローラー名</td>
<td style="width: 16.6667%; height: 41px;">PostsController</td>
<td style="width: 16.6667%; height: 41px;">PostsController</td>
</tr>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;">エンドポイント(GET index)</td>
<td style="width: 16.6667%; height: 41px;"><strong>/post</strong></td>
<td style="width: 16.6667%; height: 41px;"><strong>/posts</strong></td>
</tr>
</tbody>
</table></div>
<p>&nbsp;</p>
<h3><span id="toc4">Railsガイドより</span></h3>
<p>単数形リソースを使用した場合でも、コントローラーは複数形のものに対応付けられるそうです。</p>
<p>これにより、ファイル名やクラス名も複数形になります。</p>
<blockquote><p><span>単数形リソースは複数形のコントローラに対応付けられます。これは、同じコントローラで単数形のルーティング（</span><code>/account</code><span>）と複数形のルーティング（</span><code>/accounts/45</code><span>）を両方使いたい場合を想定しているためです。従って、</span><code>resource :photo</code><span>と</span><code>resources :photos</code><span>のどちらも、単数形ルーティングと複数形ルーティングを両方作成し、同一のコントローラ（</span><code>PhotosController</code><span>）に割り当てられます。</span></p>
<p><a rel="nofollow noopener external" target="_blank" href="https://railsguides.jp/routing.html#%E5%8D%98%E6%95%B0%E5%BD%A2%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9">2.5 単数形リソース</a> (Railsガイド)</p></blockquote>
<p>&nbsp;</p>
<h2><span id="toc5">ルーティング一覧 (/rails/info/routes)</span></h2>
<h3><span id="toc6">単数形resource</span></h3>
<p><img loading="lazy" decoding="async" src="https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-300x85.png" alt="rails_route_1" width="685" height="194" class="alignnone wp-image-1540" srcset="https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-300x85.png 300w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-1024x291.png 1024w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-768x218.png 768w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-1536x437.png 1536w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19.png 1920w" sizes="(max-width: 685px) 100vw, 685px" /></p>
<h3><span id="toc7">複数形resources</span></h3>
<p><img loading="lazy" decoding="async" src="https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-300x140.png" alt="rails_route_2" width="684" height="319" class="alignnone wp-image-1541" srcset="https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-300x140.png 300w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-1024x476.png 1024w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-768x357.png 768w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-1536x714.png 1536w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31.png 1920w" sizes="(max-width: 684px) 100vw, 684px" /></p><p>The post <a href="https://shungoblog.com/programming/rails_resource_resources.html">【Rails】resourceとresourcesの命名規則</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/rails_resource_resources.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Rails】Sidekiqのperformを同期的に実行する</title>
		<link>https://shungoblog.com/programming/rails_sidekiq_execute_command.html</link>
					<comments>https://shungoblog.com/programming/rails_sidekiq_execute_command.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Wed, 31 Aug 2022 06:36:11 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[エンジニア]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=1522</guid>

					<description><![CDATA[<p>目次 Sidekiqの実行コマンド同期的に実行する場合非同期的に実行する場合 Sidekiqの実行コマンド 下記のようなworkerを実行することを想定しています。 class SamplTaskWorker inclu [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/rails_sidekiq_execute_command.html">【Rails】Sidekiqのperformを同期的に実行する</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Sidekiqの実行コマンド</a><ol><li><a href="#toc2" tabindex="0">同期的に実行する場合</a></li><li><a href="#toc3" tabindex="0">非同期的に実行する場合</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">Sidekiqの実行コマンド</span></h2>
<p>下記のようなworkerを実行することを想定しています。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>class SamplTaskWorker
 include Sidekiq::Worker
 sidekiq_options retry: 5

 def perform()
    # 処理
  end
end</code></pre>
</div>
<p>&nbsp;</p>
<h3><span id="toc2">同期的に実行する場合</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-bash" data-lang="Bash"><code><span>$ SampleTaskWorker</span>.new.perform
</code></pre>
</div>
<p>&nbsp;</p>
<p>同期的には実行すると、下記のように途中でデバッグすることができます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-ruby" data-lang="Ruby"><code>def perform()
  # 処理
  binding.pry
end</code></pre>
</div>
<h3><span id="toc3">非同期的に実行する場合</span></h3>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-bash" data-lang="Bash"><code><span>$ SampleTaskWorker</span>.perform_async</code></pre>
</div><p>The post <a href="https://shungoblog.com/programming/rails_sidekiq_execute_command.html">【Rails】Sidekiqのperformを同期的に実行する</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/rails_sidekiq_execute_command.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
